/ Hex Artifact Content
Login

Artifact 88a7068472bafb29db500a167eef533d5f709cdc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 65 78 65 63 75  implements execu
01a0: 74 69 6f 6e 20 6d 65 74 68 6f 64 20 6f 66 20 74  tion method of t
01b0: 68 65 20 0a 2a 2a 20 56 69 72 74 75 61 6c 20 44  he .** Virtual D
01c0: 61 74 61 62 61 73 65 20 45 6e 67 69 6e 65 20 28  atabase Engine (
01d0: 56 44 42 45 29 2e 20 20 41 20 73 65 70 61 72 61  VDBE).  A separa
01e0: 74 65 20 66 69 6c 65 20 28 22 76 64 62 65 61 75  te file ("vdbeau
01f0: 78 2e 63 22 29 0a 2a 2a 20 68 61 6e 64 6c 65 73  x.c").** handles
0200: 20 68 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   housekeeping de
0210: 74 61 69 6c 73 20 73 75 63 68 20 61 73 20 63 72  tails such as cr
0220: 65 61 74 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  eating and delet
0230: 69 6e 67 0a 2a 2a 20 56 44 42 45 20 69 6e 73 74  ing.** VDBE inst
0240: 61 6e 63 65 73 2e 20 20 54 68 69 73 20 66 69 6c  ances.  This fil
0250: 65 20 69 73 20 73 6f 6c 65 6c 79 20 69 6e 74 65  e is solely inte
0260: 72 65 73 74 65 64 20 69 6e 20 65 78 65 63 75 74  rested in execut
0270: 69 6e 67 0a 2a 2a 20 74 68 65 20 56 44 42 45 20  ing.** the VDBE 
0280: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
0290: 6e 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 69  n the external i
02a0: 6e 74 65 72 66 61 63 65 2c 20 61 6e 20 22 73 71  nterface, an "sq
02b0: 6c 69 74 65 33 5f 73 74 6d 74 2a 22 20 69 73 20  lite3_stmt*" is 
02c0: 61 6e 20 6f 70 61 71 75 65 20 70 6f 69 6e 74 65  an opaque pointe
02d0: 72 0a 2a 2a 20 74 6f 20 61 20 56 44 42 45 2e 0a  r.** to a VDBE..
02e0: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 20 70 61  **.** The SQL pa
02f0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 73 20 61  rser generates a
0300: 20 70 72 6f 67 72 61 6d 20 77 68 69 63 68 20 69   program which i
0310: 73 20 74 68 65 6e 20 65 78 65 63 75 74 65 64 20  s then executed 
0320: 62 79 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 74  by.** the VDBE t
0330: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
0340: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0350: 6e 74 2e 20 20 56 44 42 45 20 70 72 6f 67 72 61  nt.  VDBE progra
0360: 6d 73 20 61 72 65 20 0a 2a 2a 20 73 69 6d 69 6c  ms are .** simil
0370: 61 72 20 69 6e 20 66 6f 72 6d 20 74 6f 20 61 73  ar in form to as
0380: 73 65 6d 62 6c 79 20 6c 61 6e 67 75 61 67 65 2e  sembly language.
0390: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 63 6f    The program co
03a0: 6e 73 69 73 74 73 20 6f 66 0a 2a 2a 20 61 20 6c  nsists of.** a l
03b0: 69 6e 65 61 72 20 73 65 71 75 65 6e 63 65 20 6f  inear sequence o
03c0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 45  f operations.  E
03d0: 61 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 68 61  ach operation ha
03e0: 73 20 61 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  s an opcode .** 
03f0: 61 6e 64 20 35 20 6f 70 65 72 61 6e 64 73 2e 20  and 5 operands. 
0400: 20 4f 70 65 72 61 6e 64 73 20 50 31 2c 20 50 32   Operands P1, P2
0410: 2c 20 61 6e 64 20 50 33 20 61 72 65 20 69 6e 74  , and P3 are int
0420: 65 67 65 72 73 2e 20 20 4f 70 65 72 61 6e 64 20  egers.  Operand 
0430: 50 34 20 0a 2a 2a 20 69 73 20 61 20 6e 75 6c 6c  P4 .** is a null
0440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
0450: 6e 67 2e 20 20 4f 70 65 72 61 6e 64 20 50 35 20  ng.  Operand P5 
0460: 69 73 20 61 6e 20 75 6e 73 69 67 6e 65 64 20 63  is an unsigned c
0470: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 20 46 65 77  haracter..** Few
0480: 20 6f 70 63 6f 64 65 73 20 75 73 65 20 61 6c 6c   opcodes use all
0490: 20 35 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a   5 operands..**.
04a0: 2a 2a 20 43 6f 6d 70 75 74 61 74 69 6f 6e 20 72  ** Computation r
04b0: 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
04c0: 64 20 6f 6e 20 61 20 73 65 74 20 6f 66 20 72 65  d on a set of re
04d0: 67 69 73 74 65 72 73 20 6e 75 6d 62 65 72 65 64  gisters numbered
04e0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69   beginning.** wi
04f0: 74 68 20 31 20 61 6e 64 20 67 6f 69 6e 67 20 75  th 1 and going u
0500: 70 20 74 6f 20 56 64 62 65 2e 6e 4d 65 6d 2e 20  p to Vdbe.nMem. 
0510: 20 45 61 63 68 20 72 65 67 69 73 74 65 72 20 63   Each register c
0520: 61 6e 20 73 74 6f 72 65 0a 2a 2a 20 65 69 74 68  an store.** eith
0530: 65 72 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  er an integer, a
0540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
0550: 20 73 74 72 69 6e 67 2c 20 61 20 66 6c 6f 61 74   string, a float
0560: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing point.** num
0570: 62 65 72 2c 20 6f 72 20 74 68 65 20 53 51 4c 20  ber, or the SQL 
0580: 22 4e 55 4c 4c 22 20 76 61 6c 75 65 2e 20 20 41  "NULL" value.  A
0590: 6e 20 69 6d 70 6c 69 63 69 74 20 63 6f 6e 76 65  n implicit conve
05a0: 72 73 69 6f 6e 20 66 72 6f 6d 20 6f 6e 65 0a 2a  rsion from one.*
05b0: 2a 20 74 79 70 65 20 74 6f 20 74 68 65 20 6f 74  * type to the ot
05c0: 68 65 72 20 6f 63 63 75 72 73 20 61 73 20 6e 65  her occurs as ne
05d0: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  cessary..** .** 
05e0: 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f 64 65  Most of the code
05f0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 73   in this file is
0600: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 68 65   taken up by the
0610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
0620: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  ().** function w
0630: 68 69 63 68 20 64 6f 65 73 20 74 68 65 20 77 6f  hich does the wo
0640: 72 6b 20 6f 66 20 69 6e 74 65 72 70 72 65 74 69  rk of interpreti
0650: 6e 67 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  ng a VDBE progra
0660: 6d 2e 0a 2a 2a 20 42 75 74 20 6f 74 68 65 72 20  m..** But other 
0670: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 73  routines are als
0680: 6f 20 70 72 6f 76 69 64 65 64 20 74 6f 20 68 65  o provided to he
0690: 6c 70 20 69 6e 20 62 75 69 6c 64 69 6e 67 20 75  lp in building u
06a0: 70 0a 2a 2a 20 61 20 70 72 6f 67 72 61 6d 20 69  p.** a program i
06b0: 6e 73 74 72 75 63 74 69 6f 6e 20 62 79 20 69 6e  nstruction by in
06c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
06d0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
06e0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
06f0: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0700: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0710: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0720: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0730: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0740: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0750: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0760: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0770: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0780: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
0790: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
07a0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
07b0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
07c0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
07d0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
07e0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
07f0: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0800: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0810: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0820: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0830: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0840: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0850: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0860: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0870: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0880: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
0890: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
08a0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
08b0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
08c0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
08d0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
08e0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
08f0: 69 73 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  isused..*/.#ifde
0900: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 23  f SQLITE_DEBUG.#
0910: 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75 74   define memAbout
0920: 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73 71  ToChange(P,M) sq
0930: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 70  lite3VdbeMemPrep
0940: 61 72 65 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29  areToChange(P,M)
0950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0960: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
0970: 28 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (P,M).#endif../*
0980: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
0990: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
09a0: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
09b0: 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75   every time a cu
09c0: 72 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65  rsor.** moves, e
09d0: 69 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f  ither by the OP_
09e0: 53 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c  SeekXX, OP_Next,
09f0: 20 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f   or OP_Prev opco
0a00: 64 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a  des.  The test.*
0a10: 2a 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  * procedures use
0a20: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0a30: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0a40: 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a  hat indices are.
0a50: 2a 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65  ** working corre
0a60: 63 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69  ctly.  This vari
0a70: 61 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63  able has no func
0a80: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0a90: 74 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66  to.** help verif
0aa0: 79 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70  y the correct op
0ab0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
0ac0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ad0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ae0: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
0af0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0b00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
0b10: 68 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  his global varia
0b20: 62 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c  ble is positive,
0b30: 20 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65   it gets decreme
0b40: 6e 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nted once before
0b50: 0a 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63  .** each instruc
0b60: 74 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45  tion in the VDBE
0b70: 2e 20 20 57 68 65 6e 20 72 65 61 63 68 65 73 20  .  When reaches 
0b80: 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73 49  zero, the u1.isI
0b90: 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66 69  nterrupted.** fi
0ba0: 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
0bb0: 65 33 20 73 74 72 75 63 74 75 72 65 20 69 73 20  e3 structure is 
0bc0: 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  set in order to 
0bd0: 73 69 6d 75 6c 61 74 65 20 61 6e 64 20 69 6e 74  simulate and int
0be0: 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  errupt..**.** Th
0bf0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75  is facility is u
0c00: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
0c10: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
0c20: 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63  It does not func
0c30: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72  tion.** in an or
0c40: 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f  dinary build..*/
0c50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
0c60: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
0c70: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20  interrupt_count 
0c80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
0c90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0ca0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0cb0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0cc0: 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74  type the OP_Sort
0cd0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78   opcode.** is ex
0ce0: 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73  ecuted.  The tes
0cf0: 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65  t procedures use
0d00: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
0d10: 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  n to make sure t
0d20: 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69  hat.** sorting i
0d30: 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e  s occurring or n
0d40: 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  ot occurring at 
0d50: 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65  appropriate time
0d60: 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  s.   This variab
0d70: 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e  le.** has no fun
0d80: 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ction other than
0d90: 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20   to help verify 
0da0: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0db0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
0dc0: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64  library..*/.#ifd
0dd0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
0de0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
0df0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0e00: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  f../*.** The nex
0e10: 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  t global variabl
0e20: 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69  e records the si
0e30: 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
0e40: 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72  t MEM_Blob.** or
0e50: 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61   MEM_Str that ha
0e60: 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61  s been used by a
0e70: 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54   VDBE opcode.  T
0e80: 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  he test procedur
0e90: 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69  es.** use this i
0ea0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61  nformation to ma
0eb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
0ec0: 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74   zero-blob funct
0ed0: 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77  ionality.** is w
0ee0: 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79  orking correctly
0ef0: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0f00: 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f  e has no functio
0f10: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a  n other than to.
0f20: 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  ** help verify t
0f30: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
0f50: 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ary..*/.#ifdef S
0f60: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0f70: 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
0f80: 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ize = 0;.static 
0f90: 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c  void updateMaxBl
0fa0: 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a  obsize(Mem *p){.
0fb0: 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20    if( (p->flags 
0fc0: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
0fd0: 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e  lob))!=0 && p->n
0fe0: 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f  >sqlite3_max_blo
0ff0: 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  bsize ){.    sql
1000: 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
1010: 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a  e = p->n;.  }.}.
1020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1030: 65 20 6e 65 78 74 20 67 6c 6f 62 61 6c 20 76 61  e next global va
1040: 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1050: 65 6e 74 65 64 20 65 61 63 68 20 74 79 70 65 20  ented each type 
1060: 74 68 65 20 4f 50 5f 46 6f 75 6e 64 20 6f 70 63  the OP_Found opc
1070: 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65 63 75 74  ode.** is execut
1080: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
1090: 20 74 6f 20 74 65 73 74 20 77 68 65 74 68 65 72   to test whether
10a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 66 6f 72 65   or not the fore
10b0: 69 67 6e 20 6b 65 79 0a 2a 2a 20 6f 70 65 72 61  ign key.** opera
10c0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  tion implemented
10d0: 20 75 73 69 6e 67 20 4f 50 5f 46 6b 49 73 5a 65   using OP_FkIsZe
10e0: 72 6f 20 69 73 20 77 6f 72 6b 69 6e 67 2e 20 54  ro is working. T
10f0: 68 69 73 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  his variable.** 
1100: 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e 20  has no function 
1110: 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 20 68 65  other than to he
1120: 6c 70 20 76 65 72 69 66 79 20 74 68 65 20 63 6f  lp verify the co
1130: 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
1140: 6f 66 20 74 68 65 0a 2a 2a 20 6c 69 62 72 61 72  of the.** librar
1150: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
1160: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
1170: 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
1180: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1190: 0a 2a 2a 20 54 65 73 74 20 61 20 72 65 67 69 73  .** Test a regis
11a0: 74 65 72 20 74 6f 20 73 65 65 20 69 66 20 69 74  ter to see if it
11b0: 20 65 78 63 65 65 64 73 20 74 68 65 20 63 75 72   exceeds the cur
11c0: 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 62 6c 6f  rent maximum blo
11d0: 62 20 73 69 7a 65 2e 0a 2a 2a 20 49 66 20 69 74  b size..** If it
11e0: 20 64 6f 65 73 2c 20 72 65 63 6f 72 64 20 74 68   does, record th
11f0: 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20 62 6c  e new maximum bl
1200: 6f 62 20 73 69 7a 65 2e 0a 2a 2f 0a 23 69 66 20  ob size..*/.#if 
1210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1220: 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
1230: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49  (SQLITE_OMIT_BUI
1240: 4c 54 49 4e 5f 54 45 53 54 29 0a 23 20 64 65 66  LTIN_TEST).# def
1250: 69 6e 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ine UPDATE_MAX_B
1260: 4c 4f 42 53 49 5a 45 28 50 29 20 20 75 70 64 61  LOBSIZE(P)  upda
1270: 74 65 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29  teMaxBlobsize(P)
1280: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1290: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
12a0: 49 5a 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f  IZE(P).#endif../
12b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65  *.** Convert the
12c0: 20 67 69 76 65 6e 20 72 65 67 69 73 74 65 72 20   given register 
12d0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 69 66  into a string if
12e0: 20 69 74 20 69 73 6e 27 74 20 6f 6e 65 0a 2a 2a   it isn't one.**
12f0: 20 61 6c 72 65 61 64 79 2e 20 52 65 74 75 72 6e   already. Return
1300: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 6d   non-zero if a m
1310: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1320: 2f 0a 23 64 65 66 69 6e 65 20 53 74 72 69 6e 67  /.#define String
1330: 69 66 79 28 50 2c 20 65 6e 63 29 20 5c 0a 20 20  ify(P, enc) \.  
1340: 20 69 66 28 28 28 50 29 2d 3e 66 6c 61 67 73 26   if(((P)->flags&
1350: 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
1360: 62 29 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  b))==0 && sqlite
1370: 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66  3VdbeMemStringif
1380: 79 28 50 2c 65 6e 63 29 29 20 5c 0a 20 20 20 20  y(P,enc)) \.    
1390: 20 7b 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 20   { goto no_mem; 
13a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 70 68 65  }../*.** An ephe
13b0: 6d 65 72 61 6c 20 73 74 72 69 6e 67 20 76 61 6c  meral string val
13c0: 75 65 20 28 73 69 67 6e 69 66 69 65 64 20 62 79  ue (signified by
13d0: 20 74 68 65 20 4d 45 4d 5f 45 70 68 65 6d 20 66   the MEM_Ephem f
13e0: 6c 61 67 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  lag) contains.**
13f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1400: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
1410: 63 61 74 65 64 20 73 74 72 69 6e 67 20 77 68 65  cated string whe
1420: 72 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 6e  re some other en
1430: 74 69 74 79 0a 2a 2a 20 69 73 20 72 65 73 70 6f  tity.** is respo
1440: 6e 73 69 62 6c 65 20 66 6f 72 20 64 65 61 6c 6c  nsible for deall
1450: 6f 63 61 74 69 6e 67 20 74 68 61 74 20 73 74 72  ocating that str
1460: 69 6e 67 2e 20 20 42 65 63 61 75 73 65 20 74 68  ing.  Because th
1470: 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 64 6f  e register.** do
1480: 65 73 20 6e 6f 74 20 63 6f 6e 74 72 6f 6c 20 74  es not control t
1490: 68 65 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 69  he string, it mi
14a0: 67 68 74 20 62 65 20 64 65 6c 65 74 65 64 20 77  ght be deleted w
14b0: 69 74 68 6f 75 74 20 74 68 65 20 72 65 67 69 73  ithout the regis
14c0: 74 65 72 0a 2a 2a 20 6b 6e 6f 77 69 6e 67 20 69  ter.** knowing i
14d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
14e0: 75 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 61  utine converts a
14f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1500: 6e 67 20 69 6e 74 6f 20 61 20 64 79 6e 61 6d 69  ng into a dynami
1510: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 0a  cally allocated.
1520: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
1530: 68 65 20 72 65 67 69 73 74 65 72 20 69 74 73 65  he register itse
1540: 6c 66 20 63 6f 6e 74 72 6f 6c 73 2e 20 20 49 6e  lf controls.  In
1550: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
1560: 0a 2a 2a 20 63 6f 6e 76 65 72 74 73 20 61 6e 20  .** converts an 
1570: 4d 45 4d 5f 45 70 68 65 6d 20 73 74 72 69 6e 67  MEM_Ephem string
1580: 20 69 6e 74 6f 20 61 6e 20 4d 45 4d 5f 44 79 6e   into an MEM_Dyn
1590: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66   string..*/.#def
15a0: 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c 69  ine Deephemerali
15b0: 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20 28  ze(P) \.   if( (
15c0: 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 45  (P)->flags&MEM_E
15d0: 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20 20  phem)!=0 \.     
15e0: 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65    && sqlite3Vdbe
15f0: 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c 65  MemMakeWriteable
1600: 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f 6d  (P) ){ goto no_m
1610: 65 6d 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  em;}../*.** Call
1620: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45   sqlite3VdbeMemE
1630: 78 70 61 6e 64 42 6c 6f 62 28 29 20 6f 6e 20 74  xpandBlob() on t
1640: 68 65 20 73 75 70 70 6c 69 65 64 20 76 61 6c 75  he supplied valu
1650: 65 20 28 74 79 70 65 20 4d 65 6d 2a 29 0a 2a 2a  e (type Mem*).**
1660: 20 50 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a   P if required..
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 78 70 61 6e  */.#define Expan
1680: 64 42 6c 6f 62 28 50 29 20 28 28 28 50 29 2d 3e  dBlob(P) (((P)->
1690: 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72 6f 29 3f  flags&MEM_Zero)?
16a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 45 78  sqlite3VdbeMemEx
16b0: 70 61 6e 64 42 6c 6f 62 28 50 29 3a 30 29 0a 0a  pandBlob(P):0)..
16c0: 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
16d0: 4d 65 6d 20 70 6f 69 6e 74 73 20 61 74 20 61 20  Mem points at a 
16e0: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 77 69  register that wi
16f0: 6c 6c 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ll be passed to 
1700: 61 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65  a.** user-define
1710: 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65  d function or re
1720: 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
1730: 65 72 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  er as the result
1740: 20 6f 66 20 61 20 71 75 65 72 79 2e 0a 2a 2a 20   of a query..** 
1750: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1760: 73 20 74 68 65 20 70 4d 65 6d 2d 3e 74 79 70 65  s the pMem->type
1770: 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 62   variable used b
1780: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 61  y the sqlite3_va
1790: 6c 75 65 5f 2a 28 29 20 0a 2a 2a 20 72 6f 75 74  lue_*() .** rout
17a0: 69 6e 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ines..*/.void sq
17b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
17c0: 65 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29  eType(Mem *pMem)
17d0: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
17e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
17f0: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  f( flags & MEM_N
1800: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  ull ){.    pMem-
1810: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
1820: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  ULL;.  }.  else 
1830: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
1840: 49 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d  Int ){.    pMem-
1850: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
1860: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20 65 6c  NTEGER;.  }.  el
1870: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  se if( flags & M
1880: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
1890: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
18a0: 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a 20 20  TE_FLOAT;.  }.  
18b0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
18c0: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
18d0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
18e0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65 6c 73  ITE_TEXT;.  }els
18f0: 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  e{.    pMem->typ
1900: 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3b  e = SQLITE_BLOB;
1910: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
1920: 6c 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f  locate VdbeCurso
1930: 72 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20  r number iCur.  
1940: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1950: 20 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20   to it.  Return 
1960: 4e 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75  NULL.** if we ru
1970: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
1980: 0a 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43  .*/.static VdbeC
1990: 75 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43  ursor *allocateC
19a0: 75 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70  ursor(.  Vdbe *p
19b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19c0: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
19d0: 63 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69  chine */.  int i
19e0: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
19f0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
1a00: 20 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20   new VdbeCursor 
1a10: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  */.  int nField,
1a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a30: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
1a40: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
1a50: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44  ndex */.  int iD
1a60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1a70: 2f 2a 20 57 68 65 6e 20 64 61 74 61 62 61 73 65  /* When database
1a80: 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f   the cursor belo
1a90: 6e 67 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f  ngs to, or -1 */
1aa0: 0a 20 20 69 6e 74 20 69 73 42 74 72 65 65 43 75  .  int isBtreeCu
1ab0: 72 73 6f 72 20 20 20 20 20 2f 2a 20 54 72 75 65  rsor     /* True
1ac0: 20 66 6f 72 20 42 2d 54 72 65 65 2e 20 20 46 61   for B-Tree.  Fa
1ad0: 6c 73 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74  lse for pseudo-t
1ae0: 61 62 6c 65 20 6f 72 20 76 74 61 62 20 2a 2f 0a  able or vtab */.
1af0: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b10: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b20: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b30: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b40: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b50: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b60: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b70: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1b80: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1b90: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1ba0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bb0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1bc0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bd0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1be0: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1bf0: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c00: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c10: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c20: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c30: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c40: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c50: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c60: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c70: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1c80: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1c90: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1ca0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cb0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1cc0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cd0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1ce0: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1cf0: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d00: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d10: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d20: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d30: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d40: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d50: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d60: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d70: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1d80: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1d90: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1da0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1db0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1dc0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  * Memory cells f
1dd0: 6f 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 61  or cursors are a
1de0: 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
1df0: 74 6f 70 20 6f 66 20 74 68 65 20 61 64 64 72 65  top of the addre
1e00: 73 73 0a 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d  ss.  ** space. M
1e10: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e  emory cell (p->n
1e20: 4d 65 6d 29 20 63 6f 72 72 65 73 70 6f 6e 64 73  Mem) corresponds
1e30: 20 74 6f 20 63 75 72 73 6f 72 20 30 2e 20 53 70   to cursor 0. Sp
1e40: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72  ace for.  ** cur
1e50: 73 6f 72 20 31 20 69 73 20 6d 61 6e 61 67 65 64  sor 1 is managed
1e60: 20 62 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   by memory cell 
1e70: 28 70 2d 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63  (p->nMem-1), etc
1e80: 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ..  */.  Mem *pM
1e90: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d  em = &p->aMem[p-
1ea0: 3e 6e 4d 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20  >nMem-iCur];..  
1eb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62  int nByte;.  Vdb
1ec0: 65 43 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30  eCursor *pCx = 0
1ed0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20  ;.  nByte = .   
1ee0: 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
1ef0: 28 56 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20  (VdbeCursor)) + 
1f00: 0a 20 20 20 20 20 20 28 69 73 42 74 72 65 65 43  .      (isBtreeC
1f10: 75 72 73 6f 72 3f 73 71 6c 69 74 65 33 42 74 72  ursor?sqlite3Btr
1f20: 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30  eeCursorSize():0
1f30: 29 20 2b 20 0a 20 20 20 20 20 20 32 2a 6e 46 69  ) + .      2*nFi
1f40: 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32 29 3b  eld*sizeof(u32);
1f50: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75 72  ..  assert( iCur
1f60: 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1f70: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 69 43   if( p->apCsr[iC
1f80: 75 72 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ur] ){.    sqlit
1f90: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
1fa0: 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69 43 75  (p, p->apCsr[iCu
1fb0: 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  r]);.    p->apCs
1fc0: 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20 20 7d  r[iCur] = 0;.  }
1fd0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1fe0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
1ff0: 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79 74 65  Grow(pMem, nByte
2000: 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61  , 0) ){.    p->a
2010: 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43 78  pCsr[iCur] = pCx
2020: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a 29   = (VdbeCursor*)
2030: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d  pMem->z;.    mem
2040: 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65  set(pCx, 0, size
2050: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 3b  of(VdbeCursor));
2060: 0a 20 20 20 20 70 43 78 2d 3e 69 44 62 20 3d 20  .    pCx->iDb = 
2070: 69 44 62 3b 0a 20 20 20 20 70 43 78 2d 3e 6e 46  iDb;.    pCx->nF
2080: 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
2090: 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 29 7b     if( nField ){
20a0: 0a 20 20 20 20 20 20 70 43 78 2d 3e 61 54 79 70  .      pCx->aTyp
20b0: 65 20 3d 20 28 75 33 32 20 2a 29 26 70 4d 65 6d  e = (u32 *)&pMem
20c0: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
20d0: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 5d 3b  f(VdbeCursor))];
20e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
20f0: 73 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b 0a  sBtreeCursor ){.
2100: 20 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72 73        pCx->pCurs
2110: 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29  or = (BtCursor*)
2120: 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d  .          &pMem
2130: 2d 3e 7a 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ->z[ROUND8(sizeo
2140: 66 28 56 64 62 65 43 75 72 73 6f 72 29 29 2b 32  f(VdbeCursor))+2
2150: 2a 6e 46 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75  *nField*sizeof(u
2160: 33 32 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  32)];.      sqli
2170: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
2180: 72 6f 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  ro(pCx->pCursor)
2190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21a0: 74 75 72 6e 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a  turn pCx;.}../*.
21b0: 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72  ** Try to conver
21c0: 74 20 61 20 76 61 6c 75 65 20 69 6e 74 6f 20 61  t a value into a
21d0: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
21e0: 6e 74 61 74 69 6f 6e 20 69 66 20 77 65 20 63 61  ntation if we ca
21f0: 6e 0a 2a 2a 20 64 6f 20 73 6f 20 77 69 74 68 6f  n.** do so witho
2200: 75 74 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72  ut loss of infor
2210: 6d 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  mation.  In othe
2220: 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20  r words, if the 
2230: 73 74 72 69 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20  string.** looks 
2240: 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20 63  like a number, c
2250: 6f 6e 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61  onvert it into a
2260: 20 6e 75 6d 62 65 72 2e 20 20 49 66 20 69 74 20   number.  If it 
2270: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b  does not.** look
2280: 20 6c 69 6b 65 20 61 20 6e 75 6d 62 65 72 2c 20   like a number, 
2290: 6c 65 61 76 65 20 69 74 20 61 6c 6f 6e 65 2e 0a  leave it alone..
22a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
22b0: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
22c0: 69 74 79 28 4d 65 6d 20 2a 70 52 65 63 29 7b 0a  ity(Mem *pRec){.
22d0: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
22e0: 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
22f0: 45 4d 5f 49 6e 74 29 29 3d 3d 30 20 29 7b 0a 20  EM_Int))==0 ){. 
2300: 20 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 75 65     double rValue
2310: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 75 65  ;.    i64 iValue
2320: 3b 0a 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70  ;.    u8 enc = p
2330: 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 20 20 69 66  Rec->enc;.    if
2340: 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ( (pRec->flags&M
2350: 45 4d 5f 53 74 72 29 3d 3d 30 20 29 20 72 65 74  EM_Str)==0 ) ret
2360: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  urn;.    if( sql
2370: 69 74 65 33 41 74 6f 46 28 70 52 65 63 2d 3e 7a  ite3AtoF(pRec->z
2380: 2c 20 26 72 56 61 6c 75 65 2c 20 70 52 65 63 2d  , &rValue, pRec-
2390: 3e 6e 2c 20 65 6e 63 29 3d 3d 30 20 29 20 72 65  >n, enc)==0 ) re
23a0: 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 30 3d  turn;.    if( 0=
23b0: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 70  =sqlite3Atoi64(p
23c0: 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 2c  Rec->z, &iValue,
23d0: 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 20 29   pRec->n, enc) )
23e0: 7b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 75 2e  {.      pRec->u.
23f0: 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  i = iValue;.    
2400: 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d    pRec->flags |=
2410: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 65   MEM_Int;.    }e
2420: 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 65 63 2d  lse{.      pRec-
2430: 3e 72 20 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20  >r = rValue;.   
2440: 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c     pRec->flags |
2450: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  = MEM_Real;.    
2460: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
2470: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2480: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2490: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
24a0: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
24b0: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
24c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
24d0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
24e0: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
24f0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
2500: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
2510: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
2520: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
2530: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
2540: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
2550: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2560: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2570: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2580: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2590: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
25a0: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
25b0: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
25c0: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
25d0: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
25e0: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
25f0: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
2600: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
2610: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
2620: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
2630: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
2640: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
2650: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2660: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2670: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 2a  LITE_AFF_NONE:.*
2680: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2690: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
26a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
26b0: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
26c0: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
26d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
26e0: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
26f0: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2700: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2710: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2720: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2730: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2740: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2750: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2760: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2770: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
2780: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _TEXT ){.    /* 
2790: 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65  Only attempt the
27a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54   conversion to T
27b0: 45 58 54 20 69 66 20 74 68 65 72 65 20 69 73 20  EXT if there is 
27c0: 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65  an integer or re
27d0: 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73  al.    ** repres
27e0: 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61  entation (blob a
27f0: 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67  nd NULL do not g
2800: 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75  et converted) bu
2810: 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20  t no string.    
2820: 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
2830: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2840: 28 20 30 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67  ( 0==(pRec->flag
2850: 73 26 4d 45 4d 5f 53 74 72 29 20 26 26 20 28 70  s&MEM_Str) && (p
2860: 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  Rec->flags&(MEM_
2870: 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29  Real|MEM_Int)) )
2880: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2890: 64 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28  dbeMemStringify(
28a0: 70 52 65 63 2c 20 65 6e 63 29 3b 0a 20 20 20 20  pRec, enc);.    
28b0: 7d 0a 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67  }.    pRec->flag
28c0: 73 20 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c  s &= ~(MEM_Real|
28d0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
28e0: 65 20 69 66 28 20 61 66 66 69 6e 69 74 79 21 3d  e if( affinity!=
28f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
2900: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  ){.    assert( a
2910: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2920: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
2930: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
2940: 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 20  AFF_REAL.       
2950: 20 20 20 20 20 20 7c 7c 20 61 66 66 69 6e 69 74        || affinit
2960: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
2970: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 61 70 70  MERIC );.    app
2980: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
2990: 79 28 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  y(pRec);.    if(
29a0: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d   pRec->flags & M
29b0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
29c0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 65   sqlite3VdbeInte
29d0: 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65 63  gerAffinity(pRec
29e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
29f0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e  /*.** Try to con
2a00: 76 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66  vert the type of
2a10: 20 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75   a function argu
2a20: 6d 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74  ment or a result
2a30: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20   column.** into 
2a40: 61 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73  a numeric repres
2a50: 65 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65  entation.  Use e
2a60: 69 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72  ither INTEGER or
2a70: 20 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a   REAL whichever.
2a80: 2a 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ** is appropriat
2a90: 65 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20  e.  But only do 
2aa0: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  the conversion i
2ab0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
2ac0: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73   without.** loss
2ad0: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
2ae0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
2af0: 65 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74  evised type of t
2b00: 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
2b10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  int sqlite3_valu
2b20: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73  e_numeric_type(s
2b30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
2b40: 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  al){.  Mem *pMem
2b50: 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a 20   = (Mem*)pVal;. 
2b60: 20 69 66 28 20 70 4d 65 6d 2d 3e 74 79 70 65 3d   if( pMem->type=
2b70: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
2b80: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2b90: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a  Affinity(pMem);.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2bb0: 65 6d 53 74 6f 72 65 54 79 70 65 28 70 4d 65 6d  emStoreType(pMem
2bc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2bd0: 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a 2f  pMem->type;.}../
2be0: 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76 65  *.** Exported ve
2bf0: 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41 66  rsion of applyAf
2c00: 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20 6f  finity(). This o
2c10: 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c 69  ne works on sqli
2c20: 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a 20  te3_value*, .** 
2c30: 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  not the internal
2c40: 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a 76   Mem* type..*/.v
2c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75 65  oid sqlite3Value
2c60: 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20  ApplyAffinity(. 
2c70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2c80: 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66 69  pVal, .  u8 affi
2c90: 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63 0a  nity, .  u8 enc.
2ca0: 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e 69  ){.  applyAffini
2cb0: 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c 20  ty((Mem *)pVal, 
2cc0: 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b 0a  affinity, enc);.
2cd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ce0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72 69  _DEBUG./*.** Wri
2cf0: 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e 67  te a nice string
2d00: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2d10: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  of the contents 
2d20: 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a 20  of cell pMem.** 
2d30: 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75 66  into buffer zBuf
2d40: 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a 2a  , length nBuf..*
2d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2d60: 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74  beMemPrettyPrint
2d70: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61 72  (Mem *pMem, char
2d80: 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72 20   *zBuf){.  char 
2d90: 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20 20  *zCsr = zBuf;.  
2da0: 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66 6c  int f = pMem->fl
2db0: 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  ags;..  static c
2dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
2dd0: 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b 22   encnames[] = {"
2de0: 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28 31  (X)", "(8)", "(1
2df0: 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22 7d  6LE)", "(16BE)"}
2e00: 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f 42  ;..  if( f&MEM_B
2e10: 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  lob ){.    int i
2e20: 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20  ;.    char c;.  
2e30: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44 79    if( f & MEM_Dy
2e40: 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  n ){.      c = '
2e50: 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  z';.      assert
2e60: 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74  ( (f & (MEM_Stat
2e70: 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d  ic|MEM_Ephem))==
2e80: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 );.    }else i
2e90: 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69  f( f & MEM_Stati
2ea0: 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 27  c ){.      c = '
2eb0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
2ec0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
2ed0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
2ee0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ef0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
2f00: 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b 0a  .      c = 'e';.
2f10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
2f20: 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d   & (MEM_Static|M
2f30: 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20  EM_Dyn))==0 );. 
2f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f50: 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a 0a  c = 's';.    }..
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2f70: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
2f80: 22 25 63 22 2c 20 63 29 3b 0a 20 20 20 20 7a 43  "%c", c);.    zC
2f90: 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  sr += sqlite3Str
2fa0: 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20  len30(zCsr);.   
2fb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2fc0: 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64  f(100, zCsr, "%d
2fd0: 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20  [", pMem->n);.  
2fe0: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
2ff0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3000: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3010: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3020: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3030: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3040: 30 2c 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c  0, zCsr, "%02X",
3050: 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69   ((int)pMem->z[i
3060: 5d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20  ] & 0xFF));.    
3070: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
3080: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
3090: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
30a0: 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d  =0; i<16 && i<pM
30b0: 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  em->n; i++){.   
30c0: 20 20 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d     char z = pMem
30d0: 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->z[i];.      if
30e0: 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20  ( z<32 || z>126 
30f0: 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b  ) *zCsr++ = '.';
3100: 0a 20 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73  .      else *zCs
3110: 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 0a  r++ = z;.    }..
3120: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
3130: 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20  intf(100, zCsr, 
3140: 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d 65 73 5b  "]%s", encnames[
3150: 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20  pMem->enc]);.   
3160: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
3170: 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a  Strlen30(zCsr);.
3180: 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f      if( f & MEM_
3190: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71  Zero ){.      sq
31a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
31b0: 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c  00, zCsr,"+%dz",
31c0: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a  pMem->u.nZero);.
31d0: 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71        zCsr += sq
31e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
31f0: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  sr);.    }.    *
3200: 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  zCsr = '\0';.  }
3210: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3220: 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  _Str ){.    int 
3230: 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30  j, k;.    zBuf[0
3240: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28  ] = ' ';.    if(
3250: 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a   f & MEM_Dyn ){.
3260: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3270: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
3280: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3290: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
32a0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
32b0: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
32c0: 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  ic ){.      zBuf
32d0: 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20  [1] = 't';.     
32e0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
32f0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Dyn|MEM_Ephem
3300: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  ))==0 );.    }el
3310: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45  se if( f & MEM_E
3320: 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42  phem ){.      zB
3330: 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20  uf[1] = 'e';.   
3340: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3350: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3360: 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Dyn))==0 );.    
3370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75  }else{.      zBu
3380: 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20  f[1] = 's';.    
3390: 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20  }.    k = 2;.   
33a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33b0: 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c  f(100, &zBuf[k],
33c0: 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b   "%d", pMem->n);
33d0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
33e0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
33f0: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3400: 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f  +] = '[';.    fo
3410: 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a  r(j=0; j<15 && j
3420: 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a  <pMem->n; j++){.
3430: 20 20 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65        u8 c = pMe
3440: 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  m->z[j];.      i
3450: 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c  f( c>=0x20 && c<
3460: 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20  0x7f ){.        
3470: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20  zBuf[k++] = c;. 
3480: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3490: 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20      zBuf[k++] = 
34a0: 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  '.';.      }.   
34b0: 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d   }.    zBuf[k++]
34c0: 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69   = ']';.    sqli
34d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
34e0: 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61  ,&zBuf[k], encna
34f0: 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b  mes[pMem->enc]);
3500: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
3510: 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b  3Strlen30(&zBuf[
3520: 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b  k]);.    zBuf[k+
3530: 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  +] = 0;.  }.}.#e
3540: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
3550: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
3560: 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20  Print the value 
3570: 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 66 6f  of a register fo
3580: 72 20 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73  r tracing purpos
3590: 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es:.*/.static vo
35a0: 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74  id memTracePrint
35b0: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d 20  (FILE *out, Mem 
35c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  *p){.  if( p->fl
35d0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
35e0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
35f0: 74 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d  t, " NULL");.  }
3600: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66 6c 61  else if( (p->fla
3610: 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
3620: 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49 6e  M_Str))==(MEM_In
3630: 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20 20  t|MEM_Str) ){.  
3640: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3650: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3660: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3670: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3680: 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
3690: 66 28 6f 75 74 2c 20 22 20 69 3a 25 6c 6c 64 22  f(out, " i:%lld"
36a0: 2c 20 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64  , p->u.i);.#ifnd
36b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
36c0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
36d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61  }else if( p->fla
36e0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
36f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
3700: 2c 20 22 20 72 3a 25 67 22 2c 20 70 2d 3e 72 29  , " r:%g", p->r)
3710: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
3720: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
3730: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20  MEM_RowSet ){.  
3740: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
3750: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
3760: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
3770: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
3780: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
3790: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
37a0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
37b0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 66 70 72  t, " ");.    fpr
37c0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
37d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  zBuf);.  }.}.sta
37e0: 74 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65  tic void registe
37f0: 72 54 72 61 63 65 28 46 49 4c 45 20 2a 6f 75 74  rTrace(FILE *out
3800: 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  , int iReg, Mem 
3810: 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  *p){.  fprintf(o
3820: 75 74 2c 20 22 52 45 47 5b 25 64 5d 20 3d 20 22  ut, "REG[%d] = "
3830: 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72  , iReg);.  memTr
3840: 61 63 65 50 72 69 6e 74 28 6f 75 74 2c 20 70 29  acePrint(out, p)
3850: 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
3860: 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66   "\n");.}.#endif
3870: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
3880: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
3890: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
38a0: 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61 63 65 29  ,M) if(p->trace)
38b0: 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70 2d  registerTrace(p-
38c0: 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23 65 6c 73  >trace,R,M).#els
38d0: 65 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  e.#  define REGI
38e0: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 0a  STER_TRACE(R,M).
38f0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
3900: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a  VDBE_PROFILE../*
3910: 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68 20 63 6f   .** hwtime.h co
3920: 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65 20 61 73  ntains inline as
3930: 73 65 6d 62 6c 65 72 20 63 6f 64 65 20 66 6f 72  sembler code for
3940: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a   implementing .*
3950: 2a 20 68 69 67 68 2d 70 65 72 66 6f 72 6d 61 6e  * high-performan
3960: 63 65 20 74 69 6d 69 6e 67 20 72 6f 75 74 69 6e  ce timing routin
3970: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
3980: 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23 65 6e 64  "hwtime.h"..#end
3990: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  if../*.** The CH
39a0: 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50  ECK_FOR_INTERRUP
39b0: 54 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  T macro defined 
39c0: 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f 20 73 65  here looks to se
39d0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 73 71 6c 69  e if the.** sqli
39e0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20  te3_interrupt() 
39f0: 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
3a00: 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 74 20   called.  If it 
3a10: 68 61 73 20 62 65 65 6e 2c 20 74 68 65 6e 0a 2a  has been, then.*
3a20: 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  * processing of 
3a30: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
3a40: 20 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 2e   is interrupted.
3a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  .**.** This macr
3a60: 6f 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  o added to every
3a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
3a80: 74 20 64 6f 65 73 20 61 20 6a 75 6d 70 20 69 6e  t does a jump in
3a90: 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 69 6d 70   order to.** imp
3aa0: 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70 2e 20 20  lement a loop.  
3ab0: 54 68 69 73 20 74 65 73 74 20 75 73 65 64 20 74  This test used t
3ac0: 6f 20 62 65 20 6f 6e 20 65 76 65 72 79 20 73 69  o be on every si
3ad0: 6e 67 6c 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  ngle instruction
3ae0: 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74 20 6d 65  ,.** but that me
3af0: 61 6e 74 20 77 65 20 6d 6f 72 65 20 74 65 73 74  ant we more test
3b00: 69 6e 67 20 74 68 61 74 20 77 65 20 6e 65 65 64  ing that we need
3b10: 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20 74 65 73  ed.  By only tes
3b20: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6c 61 67  ting the.** flag
3b30: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3b40: 74 69 6f 6e 73 2c 20 77 65 20 67 65 74 20 61 20  tions, we get a 
3b50: 28 73 6d 61 6c 6c 29 20 73 70 65 65 64 20 69 6d  (small) speed im
3b60: 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 64  provement..*/.#d
3b70: 65 66 69 6e 65 20 43 48 45 43 4b 5f 46 4f 52 5f  efine CHECK_FOR_
3b80: 49 4e 54 45 52 52 55 50 54 20 5c 0a 20 20 20 69  INTERRUPT \.   i
3b90: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
3ba0: 72 72 75 70 74 65 64 20 29 20 67 6f 74 6f 20 61  rrupted ) goto a
3bb0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65  bort_due_to_inte
3bc0: 72 72 75 70 74 3b 0a 0a 0a 23 69 66 6e 64 65 66  rrupt;...#ifndef
3bd0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
3be0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
3bf0: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
3c00: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
3c10: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
3c20: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
3c30: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
3c40: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
3c50: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
3c60: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
3c70: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
3c80: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
3c90: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
3ca0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
3cb0: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
3cc0: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
3cd0: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
3ce0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
3cf0: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
3d00: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
3d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
3d20: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
3d30: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3d40: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
3d50: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
3d60: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
3d70: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
3d80: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
3d90: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
3da0: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
3db0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
3dc0: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
3dd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3de0: 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72  * Transfer error
3df0: 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72   message text fr
3e00: 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  om an sqlite3_vt
3e10: 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  ab.zErrMsg (text
3e20: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
3e30: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3e40: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3e50: 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a  c) into a Vdbe.z
3e60: 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
3e70: 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
3e80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
3e90: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e  qlite3DbMalloc).
3ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3eb0: 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
3ec0: 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65  (Vdbe *p, sqlite
3ed0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
3ee0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3ef0: 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  p->db;.  sqlite3
3f00: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
3f10: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
3f20: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
3f30: 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62  StrDup(db, pVtab
3f40: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  ->zErrMsg);.  sq
3f50: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
3f60: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56  ->zErrMsg);.  pV
3f70: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
3f80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  ;.}.../*.** Exec
3f90: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
3fa0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
3fb0: 20 77 65 20 63 61 6e 20 74 68 65 6e 20 72 65 74   we can then ret
3fc0: 75 72 6e 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  urn..**.** sqlit
3fd0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3fe0: 29 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  ) must be called
3ff0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
4000: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
4010: 0a 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 70 72  .** close the pr
4020: 6f 67 72 61 6d 20 77 69 74 68 20 61 20 66 69 6e  ogram with a fin
4030: 61 6c 20 4f 50 5f 48 61 6c 74 20 61 6e 64 20 74  al OP_Halt and t
4040: 6f 20 73 65 74 20 75 70 20 74 68 65 20 63 61 6c  o set up the cal
4050: 6c 62 61 63 6b 73 0a 2a 2a 20 61 6e 64 20 74 68  lbacks.** and th
4060: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4070: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57  pointer..**.** W
4080: 68 65 6e 65 76 65 72 20 61 20 72 6f 77 20 6f 72  henever a row or
4090: 20 72 65 73 75 6c 74 20 64 61 74 61 20 69 73 20   result data is 
40a0: 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
40b0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 65 69 74  routine will eit
40c0: 68 65 72 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  her.** invoke th
40d0: 65 20 72 65 73 75 6c 74 20 63 61 6c 6c 62 61 63  e result callbac
40e0: 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f  k (if there is o
40f0: 6e 65 29 20 6f 72 20 72 65 74 75 72 6e 20 77 69  ne) or return wi
4100: 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 4f 57  th.** SQLITE_ROW
4110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 61 74  ..**.** If an at
4120: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
4130: 20 6f 70 65 6e 20 61 20 6c 6f 63 6b 65 64 20 64   open a locked d
4140: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68  atabase, then th
4150: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 69  is routine.** wi
4160: 6c 6c 20 65 69 74 68 65 72 20 69 6e 76 6f 6b 65  ll either invoke
4170: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
4180: 63 6b 20 28 69 66 20 74 68 65 72 65 20 69 73 20  ck (if there is 
4190: 6f 6e 65 29 20 6f 72 20 69 74 20 77 69 6c 6c 0a  one) or it will.
41a0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
41b0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _BUSY..**.** If 
41c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
41d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
41e0: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
41f0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
4200: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
4210: 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 2d 3e  malloc() and p->
4220: 7a 45 72 72 4d 73 67 20 69 73 20 6d 61 64 65 20  zErrMsg is made 
4230: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
4240: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20   memory..** The 
4250: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 74  error code is st
4260: 6f 72 65 64 20 69 6e 20 70 2d 3e 72 63 20 61 6e  ored in p->rc an
4270: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
4280: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52  eturns SQLITE_ER
4290: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ROR..**.** If th
42a0: 65 20 63 61 6c 6c 62 61 63 6b 20 65 76 65 72 20  e callback ever 
42b0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
42c0: 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 67 72  , then the progr
42d0: 61 6d 20 65 78 69 74 73 0a 2a 2a 20 69 6d 6d 65  am exits.** imme
42e0: 64 69 61 74 65 6c 79 2e 20 20 54 68 65 72 65 20  diately.  There 
42f0: 77 69 6c 6c 20 62 65 20 6e 6f 20 65 72 72 6f 72  will be no error
4300: 20 6d 65 73 73 61 67 65 20 62 75 74 20 74 68 65   message but the
4310: 20 70 2d 3e 72 63 20 66 69 65 6c 64 20 69 73 0a   p->rc field is.
4320: 2a 2a 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  ** set to SQLITE
4330: 5f 41 42 4f 52 54 20 61 6e 64 20 74 68 69 73 20  _ABORT and this 
4340: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
4350: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
4360: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 65 6d 6f 72 79  ..**.** A memory
4370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
4380: 72 20 63 61 75 73 65 73 20 70 2d 3e 72 63 20 74  r causes p->rc t
4390: 6f 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  o be set to SQLI
43a0: 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 74 68 69  TE_NOMEM and thi
43b0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  s.** routine to 
43c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
43d0: 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ROR..**.** Other
43e0: 20 66 61 74 61 6c 20 65 72 72 6f 72 73 20 72 65   fatal errors re
43f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
4400: 52 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  R..**.** After t
4410: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
4420: 66 69 6e 69 73 68 65 64 2c 20 73 71 6c 69 74 65  finished, sqlite
4430: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 29 20  3VdbeFinalize() 
4440: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 73 65  should be.** use
4450: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68  d to clean up th
4460: 65 20 6d 65 73 73 20 74 68 61 74 20 77 61 73 20  e mess that was 
4470: 6c 65 66 74 20 62 65 68 69 6e 64 2e 0a 2a 2f 0a  left behind..*/.
4480: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 45  int sqlite3VdbeE
4490: 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20  xec(.  Vdbe *p  
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
44c0: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3d 30 3b 20  .){.  int pc=0; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 2f 2a 20 54 68 65 20 70 72 6f 67 72 61 6d 20   /* The program 
44f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4f 70 20  counter */.  Op 
4500: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20  *aOp = p->aOp;  
4510: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
4520: 6f 66 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f  of p->aOp */.  O
4530: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4550: 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a  rent operation *
4560: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
4570: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f  ITE_OK;        /
4580: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
4590: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  n */.  sqlite3 *
45a0: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
45b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
45c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74 53  e */.  u8 resetS
45d0: 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30  chemaOnFault = 0
45e0: 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65 6d  ; /* Reset schem
45f0: 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  a after an error
4600: 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
4610: 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20    u8 encoding = 
4620: 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a 20  ENC(db);     /* 
4630: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
4640: 6f 64 69 6e 67 20 2a 2f 0a 23 69 66 6e 64 65 66  oding */.#ifndef
4650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
4660: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
4670: 20 69 6e 74 20 63 68 65 63 6b 50 72 6f 67 72 65   int checkProgre
4680: 73 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ss;         /* T
4690: 72 75 65 20 69 66 20 70 72 6f 67 72 65 73 73 20  rue if progress 
46a0: 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 65 6e  callbacks are en
46b0: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  abled */.  int n
46c0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
46d0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 73        /* Opcodes
46e0: 20 65 78 65 63 75 74 65 64 20 73 69 6e 63 65 20   executed since 
46f0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
4700: 6b 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d  k. */.#endif.  M
4710: 65 6d 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *aMem = p->aM
4720: 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  em;       /* Cop
4730: 79 20 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a  y of p->aMem */.
4740: 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b    Mem *pIn1 = 0;
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4760: 31 73 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e  1st input operan
4770: 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32  d */.  Mem *pIn2
4780: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4790: 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f    /* 2nd input o
47a0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20  perand */.  Mem 
47b0: 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20  *pIn3 = 0;      
47c0: 20 20 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e         /* 3rd in
47d0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
47e0: 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20   Mem *pOut = 0; 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4800: 75 74 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  utput operand */
4810: 0a 20 20 69 6e 74 20 69 43 6f 6d 70 61 72 65 20  .  int iCompare 
4820: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
4830: 20 52 65 73 75 6c 74 20 6f 66 20 6c 61 73 74 20   Result of last 
4840: 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
4850: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  tion */.  int *a
4860: 50 65 72 6d 75 74 65 20 3d 20 30 3b 20 20 20 20  Permute = 0;    
4870: 20 20 20 20 20 2f 2a 20 50 65 72 6d 75 74 61 74       /* Permutat
4880: 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  ion of columns f
4890: 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65 20 2a 2f  or OP_Compare */
48a0: 0a 20 20 69 36 34 20 6c 61 73 74 52 6f 77 69 64  .  i64 lastRowid
48b0: 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   = db->lastRowid
48c0: 3b 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  ;  /* Saved valu
48d0: 65 20 6f 66 20 74 68 65 20 6c 61 73 74 20 69 6e  e of the last in
48e0: 73 65 72 74 20 52 4f 57 49 44 20 2a 2f 0a 23 69  sert ROWID */.#i
48f0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4900: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4920: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
4930: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
4940: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  code */.  int or
4950: 69 67 50 63 3b 20 20 20 20 20 20 20 20 20 20 20  igPc;           
4960: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
4970: 63 6f 75 6e 74 65 72 20 61 74 20 73 74 61 72 74  counter at start
4980: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23 65   of opcode */.#e
4990: 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53 45  ndif.  /*** INSE
49a0: 52 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20 48  RT STACK UNION H
49b0: 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73 65  ERE ***/..  asse
49c0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
49d0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 20  BE_MAGIC_RUN ); 
49e0: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 73 74 65 70   /* sqlite3_step
49f0: 28 29 20 76 65 72 69 66 69 65 73 20 74 68 69 73  () verifies this
4a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
4a10: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
4a20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
4a30: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  OMEM ){.    /* T
4a40: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
4a50: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
4a60: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
4a70: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
4a80: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
4a90: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
4aa0: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
4ab0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
4ac0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
4ad0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
4ae0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
4af0: 42 55 53 59 20 29 3b 0a 20 20 70 2d 3e 72 63 20  BUSY );.  p->rc 
4b00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
4b10: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
4b20: 6e 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65  n==0 );.  p->pRe
4b30: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64  sultSet = 0;.  d
4b40: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
4b50: 42 75 73 79 20 3d 20 30 3b 0a 20 20 43 48 45 43  Busy = 0;.  CHEC
4b60: 4b 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b  K_FOR_INTERRUPT;
4b70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  .  sqlite3VdbeIO
4b80: 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 69 66  TraceSql(p);.#if
4b90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4ba0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4bb0: 43 4b 0a 20 20 63 68 65 63 6b 50 72 6f 67 72 65  CK.  checkProgre
4bc0: 73 73 20 3d 20 64 62 2d 3e 78 50 72 6f 67 72 65  ss = db->xProgre
4bd0: 73 73 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 23 69  ss!=0;.#endif.#i
4be0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4bf0: 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  G.  sqlite3Begin
4c00: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4c10: 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30 20 20    if( p->pc==0  
4c20: 26 26 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  && (p->db->flags
4c30: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 4c 69   & SQLITE_VdbeLi
4c40: 73 74 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20  sting)!=0 ){.   
4c50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 72 69 6e   int i;.    prin
4c60: 74 66 28 22 56 44 42 45 20 50 72 6f 67 72 61 6d  tf("VDBE Program
4c70: 20 4c 69 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20   Listing:\n");. 
4c80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4c90: 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20 20 20 66  intSql(p);.    f
4ca0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
4cb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4cc0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4cd0: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
4ce0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
4cf0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
4d00: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64  gnMalloc();.#end
4d10: 69 66 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e 70  if.  for(pc=p->p
4d20: 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
4d30: 3b 20 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73 73  ; pc++){.    ass
4d40: 65 72 74 28 20 70 63 3e 3d 30 20 26 26 20 70 63  ert( pc>=0 && pc
4d50: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20 69  <p->nOp );.    i
4d60: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
4d70: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
4d80: 6d 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  m;.#ifdef VDBE_P
4d90: 52 4f 46 49 4c 45 0a 20 20 20 20 6f 72 69 67 50  ROFILE.    origP
4da0: 63 20 3d 20 70 63 3b 0a 20 20 20 20 73 74 61 72  c = pc;.    star
4db0: 74 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69 6d  t = sqlite3Hwtim
4dc0: 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  e();.#endif.    
4dd0: 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 5d 3b 0a  pOp = &aOp[pc];.
4de0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
4df0: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
4e00: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
4e10: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
4e20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4e30: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61  G.    if( p->tra
4e40: 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ce ){.      if( 
4e50: 70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pc==0 ){.       
4e60: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 45 78   printf("VDBE Ex
4e70: 65 63 75 74 69 6f 6e 20 54 72 61 63 65 3a 5c 6e  ecution Trace:\n
4e80: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
4e90: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
4ea0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
4eb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4ec0: 6e 74 4f 70 28 70 2d 3e 74 72 61 63 65 2c 20 70  ntOp(p->trace, p
4ed0: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 7d 0a 23  c, pOp);.    }.#
4ee0: 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20 20  endif.      ..  
4ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
4f00: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
4f10: 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74 65  simulate an inte
4f20: 72 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e 6c  rrupt.  This onl
4f30: 79 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a  y happens.    **
4f40: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 73 70   if we have a sp
4f50: 65 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c 64  ecial test build
4f60: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20  ..    */.#ifdef 
4f70: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
4f80: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  if( sqlite3_inte
4f90: 72 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29 7b  rrupt_count>0 ){
4fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
4fb0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d 2d  nterrupt_count--
4fc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
4fd0: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
4fe0: 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unt==0 ){.      
4ff0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
5000: 75 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  upt(db);.      }
5010: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
5020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5030: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
5040: 42 41 43 4b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  BACK.    /* Call
5050: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
5060: 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20  llback if it is 
5070: 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74  configured and t
5080: 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62  he required numb
5090: 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 56 44 42  er.    ** of VDB
50a0: 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20  E ops have been 
50b0: 65 78 65 63 75 74 65 64 20 28 65 69 74 68 65 72  executed (either
50c0: 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f   since this invo
50d0: 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 2a 2a  cation of.    **
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
50f0: 28 29 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74  () or since last
5100: 20 74 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65   time the progre
5110: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20  ss callback was 
5120: 63 61 6c 6c 65 64 29 2e 0a 20 20 20 20 2a 2a 20  called)..    ** 
5130: 49 66 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  If the progress 
5140: 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
5150: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20   non-zero, exit 
5160: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
5170: 69 6e 65 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ine with.    ** 
5180: 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53 51  a return code SQ
5190: 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 20 20  LITE_ABORT..    
51a0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b  */.    if( check
51b0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
51c0: 20 20 69 66 28 20 64 62 2d 3e 6e 50 72 6f 67 72    if( db->nProgr
51d0: 65 73 73 4f 70 73 3d 3d 6e 50 72 6f 67 72 65 73  essOps==nProgres
51e0: 73 4f 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  sOps ){.        
51f0: 69 6e 74 20 70 72 63 3b 0a 20 20 20 20 20 20 20  int prc;.       
5200: 20 70 72 63 20 3d 20 64 62 2d 3e 78 50 72 6f 67   prc = db->xProg
5210: 72 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65  ress(db->pProgre
5220: 73 73 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ssArg);.        
5230: 69 66 28 20 70 72 63 21 3d 30 20 29 7b 0a 20 20  if( prc!=0 ){.  
5240: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
5250: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
5260: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
5270: 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 20  be_error_halt;. 
5280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5290: 20 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20   nProgressOps = 
52a0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
52b0: 20 6e 50 72 6f 67 72 65 73 73 4f 70 73 2b 2b 3b   nProgressOps++;
52c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
52d0: 20 20 20 2f 2a 20 4f 6e 20 61 6e 79 20 6f 70 63     /* On any opc
52e0: 6f 64 65 20 77 69 74 68 20 74 68 65 20 22 6f 75  ode with the "ou
52f0: 74 32 2d 70 72 65 72 65 6c 61 73 65 22 20 74 61  t2-prerelase" ta
5300: 67 2c 20 66 72 65 65 20 61 6e 79 0a 20 20 20 20  g, free any.    
5310: 2a 2a 20 65 78 74 65 72 6e 61 6c 20 61 6c 6c 6f  ** external allo
5320: 63 61 74 69 6f 6e 73 20 6f 75 74 20 6f 66 20 6d  cations out of m
5330: 65 6d 5b 70 32 5d 20 61 6e 64 20 73 65 74 20 6d  em[p2] and set m
5340: 65 6d 5b 70 32 5d 20 74 6f 20 62 65 0a 20 20 20  em[p2] to be.   
5350: 20 2a 2a 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   ** an undefined
5360: 20 69 6e 74 65 67 65 72 2e 20 20 4f 70 63 6f 64   integer.  Opcod
5370: 65 73 20 77 69 6c 6c 20 65 69 74 68 65 72 20 66  es will either f
5380: 69 6c 6c 20 69 6e 20 74 68 65 20 69 6e 74 65 67  ill in the integ
5390: 65 72 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  er.    ** value 
53a0: 6f 72 20 63 6f 6e 76 65 72 74 20 6d 65 6d 5b 70  or convert mem[p
53b0: 32 5d 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  2] to a differen
53c0: 74 20 74 79 70 65 2e 0a 20 20 20 20 2a 2f 0a 20  t type..    */. 
53d0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
53e0: 6f 70 66 6c 61 67 73 3d 3d 73 71 6c 69 74 65 33  opflags==sqlite3
53f0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
5400: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 29 3b 0a 20  Op->opcode] );. 
5410: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 66 6c     if( pOp->opfl
5420: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  ags & OPFLG_OUT2
5430: 5f 50 52 45 52 45 4c 45 41 53 45 20 29 7b 0a 20  _PRERELEASE ){. 
5440: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5450: 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p2>0 );.      
5460: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c  assert( pOp->p2<
5470: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20  =p->nMem );.    
5480: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
5490: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 6d  Op->p2];.      m
54a0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
54b0: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  p, pOut);.      
54c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
54d0: 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70 4f  leaseExternal(pO
54e0: 75 74 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ut);.      pOut-
54f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5500: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5510: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
5520: 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  on other operand
5530: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
5540: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
5550: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
5560: 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29   OPFLG_IN1)!=0 )
5570: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5580: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20  pOp->p1>0 );.   
5590: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
55a0: 70 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  p1<=p->nMem );. 
55b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
55c0: 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f  IsValid(&aMem[pO
55d0: 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20 20  p->p1]) );.     
55e0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
55f0: 70 4f 70 2d 3e 70 31 2c 20 26 61 4d 65 6d 5b 70  pOp->p1, &aMem[p
5600: 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 20 20 7d 0a  Op->p1]);.    }.
5610: 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
5620: 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 49 4e  flags & OPFLG_IN
5630: 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  2)!=0 ){.      a
5640: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
5650: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5660: 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d  ( pOp->p2<=p->nM
5670: 65 6d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  em );.      asse
5680: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5690: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29  aMem[pOp->p2]) )
56a0: 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54 45 52  ;.      REGISTER
56b0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
56c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
56d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
56e0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
56f0: 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29 7b 0a  PFLG_IN3)!=0 ){.
5700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5710: 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
5720: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5730: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5740: 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
5750: 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d  Valid(&aMem[pOp-
5760: 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 52  >p3]) );.      R
5770: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
5780: 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70  p->p3, &aMem[pOp
5790: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ->p3]);.    }.  
57a0: 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c    if( (pOp->opfl
57b0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  ags & OPFLG_OUT2
57c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
57d0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
57e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
57f0: 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65   pOp->p2<=p->nMe
5800: 6d 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62  m );.      memAb
5810: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26  outToChange(p, &
5820: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
5830: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
5840: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50  Op->opflags & OP
5850: 46 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a  FLG_OUT3)!=0 ){.
5860: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5870: 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
5880: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5890: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
58a0: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
58b0: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
58c0: 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  ->p3]);.    }.#e
58d0: 6e 64 69 66 0a 20 20 0a 20 20 20 20 73 77 69 74  ndif.  .    swit
58e0: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
58f0: 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ){../***********
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5940: 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f 6c 6c 6f  **.** What follo
5950: 77 73 20 69 73 20 61 20 6d 61 73 73 69 76 65 20  ws is a massive 
5960: 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
5970: 20 77 68 65 72 65 20 65 61 63 68 20 63 61 73 65   where each case
5980: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 0a 2a 2a   implements a.**
5990: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
59a0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72  ction in the vir
59b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
59c0: 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74 68 65 20  f we follow the 
59d0: 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65 6e 74 61  usual.** indenta
59e0: 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  tion conventions
59f0: 2c 20 65 61 63 68 20 63 61 73 65 20 73 68 6f 75  , each case shou
5a00: 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
5a10: 79 20 36 20 73 70 61 63 65 73 2e 20 20 42 75 74  y 6 spaces.  But
5a20: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 20 6c 6f  .** that is a lo
5a30: 74 20 6f 66 20 77 61 73 74 65 64 20 73 70 61 63  t of wasted spac
5a40: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6d 61  e on the left ma
5a50: 72 67 69 6e 2e 20 20 53 6f 20 74 68 65 20 63 6f  rgin.  So the co
5a60: 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  de within.** the
5a70: 20 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e   switch statemen
5a80: 74 20 77 69 6c 6c 20 62 72 65 61 6b 20 77 69 74  t will break wit
5a90: 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 61 6e 64  h convention and
5aa0: 20 62 65 20 66 6c 75 73 68 2d 6c 65 66 74 2e 20   be flush-left. 
5ab0: 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69 67 20 63  Another.** big c
5ac0: 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c 61 72 20  omment (similar 
5ad0: 74 6f 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  to this one) wil
5ae0: 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f 69 6e 74  l mark the point
5af0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 77 68 65   in the code whe
5b00: 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e 73 69 74  re.** we transit
5b10: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e 6f 72 6d  ion back to norm
5b20: 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e 2e 0a  al indentation..
5b30: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5b40: 74 69 6e 67 20 6f 66 20 65 61 63 68 20 63 61 73  ting of each cas
5b50: 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  e is important. 
5b60: 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 20 66 6f   The makefile fo
5b70: 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67 65 6e 65  r SQLite.** gene
5b80: 72 61 74 65 73 20 74 77 6f 20 43 20 66 69 6c 65  rates two C file
5b90: 73 20 22 6f 70 63 6f 64 65 73 2e 68 22 20 61 6e  s "opcodes.h" an
5ba0: 64 20 22 6f 70 63 6f 64 65 73 2e 63 22 20 62 79  d "opcodes.c" by
5bb0: 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 0a 2a   scanning this.*
5bc0: 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66  * file looking f
5bd0: 6f 72 20 6c 69 6e 65 73 20 74 68 61 74 20 62 65  or lines that be
5be0: 67 69 6e 20 77 69 74 68 20 22 63 61 73 65 20 4f  gin with "case O
5bf0: 50 5f 22 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  P_".  The opcode
5c00: 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20 77 69 6c  s.h files.** wil
5c10: 6c 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  l be filled with
5c20: 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20 67   #defines that g
5c30: 69 76 65 20 75 6e 69 71 75 65 20 69 6e 74 65 67  ive unique integ
5c40: 65 72 20 76 61 6c 75 65 73 20 74 6f 20 65 61 63  er values to eac
5c50: 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 6e 64 20  h.** opcode and 
5c60: 74 68 65 20 6f 70 63 6f 64 65 73 2e 63 20 66 69  the opcodes.c fi
5c70: 6c 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  le is filled wit
5c80: 68 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74  h an array of st
5c90: 72 69 6e 67 73 20 77 68 65 72 65 0a 2a 2a 20 65  rings where.** e
5ca0: 61 63 68 20 73 74 72 69 6e 67 20 69 73 20 74 68  ach string is th
5cb0: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
5cc0: 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70 6f  for the correspo
5cd0: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e 20 20 49  nding opcode.  I
5ce0: 66 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 73 74  f the.** case st
5cf0: 61 74 65 6d 65 6e 74 20 69 73 20 66 6f 6c 6c 6f  atement is follo
5d00: 77 65 64 20 62 79 20 61 20 63 6f 6d 6d 65 6e 74  wed by a comment
5d10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2f 23   of the form "/#
5d20: 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20 23 2f 22   same as ... #/"
5d30: 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d 65 6e 74  .** that comment
5d40: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
5d50: 72 6d 69 6e 65 20 74 68 65 20 70 61 72 74 69 63  rmine the partic
5d60: 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
5d70: 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  e opcode..**.** 
5d80: 4f 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 69  Other keywords i
5d90: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 68  n the comment th
5da0: 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20  at follows each 
5db0: 63 61 73 65 20 61 72 65 20 75 73 65 64 20 74 6f  case are used to
5dc0: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 74 68  .** construct th
5dd0: 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49  e OPFLG_INITIALI
5de0: 5a 45 52 20 76 61 6c 75 65 20 74 68 61 74 20 69  ZER value that i
5df0: 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70 63 6f 64  nitializes opcod
5e00: 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a 2a 2a 20  eProperty[]..** 
5e10: 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c 75 64 65  Keywords include
5e20: 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  : in1, in2, in3,
5e30: 20 6f 75 74 32 5f 70 72 65 72 65 6c 65 61 73 65   out2_prerelease
5e40: 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20 20 53  , out2, out3.  S
5e50: 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70 63 6f  ee.** the mkopco
5e60: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 66  deh.awk script f
5e70: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
5e80: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
5e90: 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 61   Documentation a
5ea0: 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f 64 65  bout VDBE opcode
5eb0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5ec0: 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69 73 20  y scanning this 
5ed0: 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69 6e 65  file.** for line
5ee0: 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74 61 69  s of that contai
5ef0: 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20 54 68  n "Opcode:".  Th
5f00: 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c 6c 20  at line and all 
5f10: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 63 6f  subsequent.** co
5f20: 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72 65 20  mment lines are 
5f30: 75 73 65 64 20 69 6e 20 74 68 65 20 67 65 6e 65  used in the gene
5f40: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ration of the op
5f50: 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75 6d 65  code.html docume
5f60: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2e  ntation.** file.
5f70: 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59 3a 0a  .**.** SUMMARY:.
5f80: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d 61 74  **.**     Format
5f90: 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74 61 6e  ting is importan
5fa0: 74 20 74 6f 20 73 63 72 69 70 74 73 20 74 68 61  t to scripts tha
5fb0: 74 20 73 63 61 6e 20 74 68 69 73 20 66 69 6c 65  t scan this file
5fc0: 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f 74 20  ..**     Do not 
5fd0: 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74 68 65  deviate from the
5fe0: 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74 79 6c   formatting styl
5ff0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
6000: 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se..**.*********
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ****/../* Opcode
6060: 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a 20 2a  :  Goto * P2 * *
6070: 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e 63 6f   *.**.** An unco
6080: 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74  nditional jump t
6090: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  o address P2..**
60a0: 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   The next instru
60b0: 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64 20 77  ction executed w
60c0: 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65 20 6f  ill be .** the o
60d0: 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32 20 66  ne at index P2 f
60e0: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
60f0: 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 67  g of.** the prog
6100: 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ram..*/.case OP_
6110: 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Goto: {         
6120: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
6130: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
6140: 52 55 50 54 3b 0a 20 20 70 63 20 3d 20 70 4f 70  RUPT;.  pc = pOp
6150: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 62 72 65 61  ->p2 - 1;.  brea
6160: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6170: 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20    Gosub P1 P2 * 
6180: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  * *.**.** Write 
6190: 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72  the current addr
61a0: 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65  ess onto registe
61b0: 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e  r P1.** and then
61c0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
61d0: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
61e0: 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20  Gosub: {        
61f0: 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
6200: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
6210: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
6220: 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e 66 6c  ssert( (pIn1->fl
6230: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d  ags & MEM_Dyn)==
6240: 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  0 );.  memAboutT
6250: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
6260: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
6270: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e  = MEM_Int;.  pIn
6280: 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52  1->u.i = pc;.  R
6290: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
62a0: 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20  p->p1, pIn1);.  
62b0: 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31  pc = pOp->p2 - 1
62c0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
62d0: 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e   Opcode:  Return
62e0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
62f0: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * Jump to the ne
6300: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  xt instruction a
6310: 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73  fter the address
6320: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6330: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75  .*/.case OP_Retu
6340: 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  rn: {           
6350: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
6360: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6370: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
6380: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  1->flags & MEM_I
6390: 6e 74 20 29 3b 0a 20 20 70 63 20 3d 20 28 69 6e  nt );.  pc = (in
63a0: 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 62  t)pIn1->u.i;.  b
63b0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
63c0: 64 65 3a 20 20 59 69 65 6c 64 20 50 31 20 2a 20  de:  Yield P1 * 
63d0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 77 61 70  * * *.**.** Swap
63e0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
63f0: 6e 74 65 72 20 77 69 74 68 20 74 68 65 20 76 61  nter with the va
6400: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
6410: 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59  P1..*/.case OP_Y
6420: 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20  ield: {         
6430: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 69     /* in1 */.  i
6440: 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70 49 6e  nt pcDest;.  pIn
6450: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
6460: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
6470: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
6480: 5f 44 79 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49  _Dyn)==0 );.  pI
6490: 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  n1->flags = MEM_
64a0: 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20  Int;.  pcDest = 
64b0: 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a  (int)pIn1->u.i;.
64c0: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63    pIn1->u.i = pc
64d0: 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
64e0: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
64f0: 29 3b 0a 20 20 70 63 20 3d 20 70 63 44 65 73 74  );.  pc = pcDest
6500: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6510: 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 49 66   Opcode:  HaltIf
6520: 4e 75 6c 6c 20 20 50 31 20 50 32 20 50 33 20 50  Null  P1 P2 P3 P
6530: 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  4 *.**.** Check 
6540: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
6550: 69 73 74 65 72 20 50 33 2e 20 20 49 66 20 69 74  ister P3.  If it
6560: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 48 61   is NULL then Ha
6570: 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 70 61 72 61  lt using.** para
6580: 6d 65 74 65 72 20 50 31 2c 20 50 32 2c 20 61 6e  meter P1, P2, an
6590: 64 20 50 34 20 61 73 20 69 66 20 74 68 69 73 20  d P4 as if this 
65a0: 77 65 72 65 20 61 20 48 61 6c 74 20 69 6e 73 74  were a Halt inst
65b0: 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ruction.  If the
65c0: 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20 72 65 67  .** value in reg
65d0: 69 73 74 65 72 20 50 33 20 69 73 20 6e 6f 74 20  ister P3 is not 
65e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
65f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
6600: 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 48  op..*/.case OP_H
6610: 61 6c 74 49 66 4e 75 6c 6c 3a 20 7b 20 20 20 20  altIfNull: {    
6620: 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a 20 20 70 49    /* in3 */.  pI
6630: 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n3 = &aMem[pOp->
6640: 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 33  p3];.  if( (pIn3
6650: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
6660: 6c 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ll)==0 ) break;.
6670: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
6680: 68 20 69 6e 74 6f 20 4f 50 5f 48 61 6c 74 20 2a  h into OP_Halt *
6690: 2f 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  /.}../* Opcode: 
66a0: 20 48 61 6c 74 20 50 31 20 50 32 20 2a 20 50 34   Halt P1 P2 * P4
66b0: 20 2a 0a 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d   *.**.** Exit im
66c0: 6d 65 64 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20  mediately.  All 
66d0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2c 20 65 74  open cursors, et
66e0: 63 20 61 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20  c are closed.** 
66f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
6700: 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 72  *.** P1 is the r
6710: 65 73 75 6c 74 20 63 6f 64 65 20 72 65 74 75 72  esult code retur
6720: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65  ned by sqlite3_e
6730: 78 65 63 28 29 2c 20 73 71 6c 69 74 65 33 5f 72  xec(), sqlite3_r
6740: 65 73 65 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71  eset(),.** or sq
6750: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29  lite3_finalize()
6760: 2e 20 20 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20  .  For a normal 
6770: 68 61 6c 74 2c 20 74 68 69 73 20 73 68 6f 75 6c  halt, this shoul
6780: 64 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28  d be SQLITE_OK (
6790: 30 29 2e 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72  0)..** For error
67a0: 73 2c 20 69 74 20 63 61 6e 20 62 65 20 73 6f 6d  s, it can be som
67b0: 65 20 6f 74 68 65 72 20 76 61 6c 75 65 2e 20 20  e other value.  
67c0: 49 66 20 50 31 21 3d 30 20 74 68 65 6e 20 50 32  If P1!=0 then P2
67d0: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a   will determine.
67e0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
67f0: 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  t to rollback th
6800: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
6810: 63 74 69 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72  ction.  Do not r
6820: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32  ollback.** if P2
6830: 3d 3d 4f 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68  ==OE_Fail. Do th
6840: 65 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32  e rollback if P2
6850: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20  ==OE_Rollback.  
6860: 49 66 20 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c  If P2==OE_Abort,
6870: 0a 2a 2a 20 74 68 65 6e 20 62 61 63 6b 20 6f 75  .** then back ou
6880: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 68  t all changes th
6890: 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  at have occurred
68a0: 20 64 75 72 69 6e 67 20 74 68 69 73 20 65 78 65   during this exe
68b0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  cution of the.**
68c0: 20 56 44 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f   VDBE, but do no
68d0: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  t rollback the t
68e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  ransaction. .**.
68f0: 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  ** If P4 is not 
6900: 6e 75 6c 6c 20 74 68 65 6e 20 69 74 20 69 73 20  null then it is 
6910: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6920: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
6930: 68 65 72 65 20 69 73 20 61 6e 20 69 6d 70 6c 69  here is an impli
6940: 65 64 20 22 48 61 6c 74 20 30 20 30 20 30 22 20  ed "Halt 0 0 0" 
6950: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 73 65  instruction inse
6960: 72 74 65 64 20 61 74 20 74 68 65 20 76 65 72 79  rted at the very
6970: 20 65 6e 64 20 6f 66 0a 2a 2a 20 65 76 65 72 79   end of.** every
6980: 20 70 72 6f 67 72 61 6d 2e 20 20 53 6f 20 61 20   program.  So a 
6990: 6a 75 6d 70 20 70 61 73 74 20 74 68 65 20 6c 61  jump past the la
69a0: 73 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  st instruction o
69b0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  f the program.**
69c0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
69d0: 65 78 65 63 75 74 69 6e 67 20 48 61 6c 74 2e 0a  executing Halt..
69e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 3a  */.case OP_Halt:
69f0: 20 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31   {.  if( pOp->p1
6a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
6a10: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
6a20: 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d  /* Halt the sub-
6a30: 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20  program. Return 
6a40: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70  control to the p
6a50: 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a  arent frame. */.
6a60: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
6a70: 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
6a80: 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  e;.    p->pFrame
6a90: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65   = pFrame->pPare
6aa0: 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d  nt;.    p->nFram
6ab0: 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e--;.    sqlite3
6ac0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
6ad0: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
6ae0: 20 20 20 20 70 63 20 3d 20 73 71 6c 69 74 65 33      pc = sqlite3
6af0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
6b00: 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 6c 61  (pFrame);.    la
6b10: 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61  stRowid = db->la
6b20: 73 74 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  stRowid;.    if(
6b30: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49 67 6e   pOp->p2==OE_Ign
6b40: 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ore ){.      /* 
6b50: 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63 20 69  Instruction pc i
6b60: 73 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  s the OP_Program
6b70: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
6b80: 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 0a 20  e sub-program . 
6b90: 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
6ba0: 79 20 62 65 69 6e 67 20 68 61 6c 74 65 64 2e 20  y being halted. 
6bb0: 49 66 20 74 68 65 20 70 32 20 69 6e 73 74 72 75  If the p2 instru
6bc0: 63 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 4f 50  ction of this OP
6bd0: 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a 2a 20 69  _Halt.      ** i
6be0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 73 65  nstruction is se
6bf0: 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  t to OE_Ignore, 
6c00: 74 68 65 6e 20 74 68 65 20 73 75 62 2d 70 72 6f  then the sub-pro
6c10: 67 72 61 6d 20 69 73 20 74 68 72 6f 77 69 6e 67  gram is throwing
6c20: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 49 47 4e  .      ** an IGN
6c30: 4f 52 45 20 65 78 63 65 70 74 69 6f 6e 2e 20 49  ORE exception. I
6c40: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 6d 70  n this case jump
6c50: 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
6c60: 73 70 65 63 69 66 69 65 64 0a 20 20 20 20 20 20  specified.      
6c70: 2a 2a 20 61 73 20 74 68 65 20 70 32 20 6f 66 20  ** as the p2 of 
6c80: 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50  the calling OP_P
6c90: 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20 20 20 20  rogram.  */.    
6ca0: 20 20 70 63 20 3d 20 70 2d 3e 61 4f 70 5b 70 63    pc = p->aOp[pc
6cb0: 5d 2e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  ].p2-1;.    }.  
6cc0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a    aOp = p->aOp;.
6cd0: 20 20 20 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d      aMem = p->aM
6ce0: 65 6d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20  em;.    break;. 
6cf0: 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f   }..  p->rc = pO
6d00: 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f  p->p1;.  p->erro
6d10: 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f  rAction = (u8)pO
6d20: 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d  p->p2;.  p->pc =
6d30: 20 70 63 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e   pc;.  if( pOp->
6d40: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 61 73 73 65  p4.z ){.    asse
6d50: 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
6d60: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
6d70: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
6d80: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
6d90: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
6da0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
6db0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
6dc0: 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20  g.xLog!=0 );.   
6dd0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70   sqlite3_log(pOp
6de0: 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20  ->p1, "abort at 
6df0: 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c  %d in [%s]: %s",
6e00: 20 70 63 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 4f   pc, p->zSql, pO
6e10: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 7d 65 6c 73  p->p4.z);.  }els
6e20: 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20  e if( p->rc ){. 
6e30: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
6e40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6e50: 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 20 20  .xLog!=0 );.    
6e60: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d  sqlite3_log(pOp-
6e70: 3e 70 31 2c 20 22 63 6f 6e 73 74 72 61 69 6e 74  >p1, "constraint
6e80: 20 66 61 69 6c 65 64 20 61 74 20 25 64 20 69 6e   failed at %d in
6e90: 20 5b 25 73 5d 22 2c 20 70 63 2c 20 70 2d 3e 7a   [%s]", pc, p->z
6ea0: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Sql);.  }.  rc =
6eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
6ec0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
6ed0: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
6ee0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
6ef0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
6f00: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
6f10: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
6f20: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d      p->rc = rc =
6f30: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
6f50: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
6f60: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
6f70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
6f80: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
6f90: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64 62 2d  SQLITE_OK || db-
6fa0: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30  >nDeferredCons>0
6fb0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d 3e   );.    rc = p->
6fc0: 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc ? SQLITE_ERRO
6fd0: 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  R : SQLITE_DONE;
6fe0: 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62 65  .  }.  goto vdbe
6ff0: 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f  _return;.}../* O
7000: 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20 50  pcode: Integer P
7010: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
7020: 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65   The 32-bit inte
7030: 67 65 72 20 76 61 6c 75 65 20 50 31 20 69 73 20  ger value P1 is 
7040: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 67  written into reg
7050: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
7060: 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20 7b 20  e OP_Integer: { 
7070: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7080: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7090: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pOut->u.i = pOp-
70a0: 3e 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  >p1;.  break;.}.
70b0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36  ./* Opcode: Int6
70c0: 34 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  4 * P2 * P4 *.**
70d0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
70e0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
70f0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a  integer value..*
7100: 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61 6c  * Write that val
7110: 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  ue into register
7120: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
7130: 49 6e 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20  Int64: {        
7140: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
7150: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
7160: 74 28 20 70 4f 70 2d 3e 70 34 2e 70 49 36 34 21  t( pOp->p4.pI64!
7170: 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  =0 );.  pOut->u.
7180: 69 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  i = *pOp->p4.pI6
7190: 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  4;.  break;.}..#
71a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
71b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
71c0: 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61  T./* Opcode: Rea
71d0: 6c 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  l * P2 * P4 *.**
71e0: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
71f0: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
7200: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
7210: 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74  alue..** Write t
7220: 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  hat value into r
7230: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
7240: 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20  ase OP_Real: {  
7250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
7260: 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f  e as TK_FLOAT, o
7270: 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
7280: 2f 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  /.  pOut->flags 
7290: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
72a0: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
72b0: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
72c0: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 72  al) );.  pOut->r
72d0: 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61   = *pOp->p4.pRea
72e0: 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  l;.  break;.}.#e
72f0: 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
7300: 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20 2a 20   String8 * P2 * 
7310: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f  P4 *.**.** P4 po
7320: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65  ints to a nul te
7330: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
7340: 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f  tring. This opco
7350: 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  de is transforme
7360: 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50  d .** into an OP
7370: 5f 53 74 72 69 6e 67 20 62 65 66 6f 72 65 20 69  _String before i
7380: 74 20 69 73 20 65 78 65 63 75 74 65 64 20 66 6f  t is executed fo
7390: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
73a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72  ..*/.case OP_Str
73b0: 69 6e 67 38 3a 20 7b 20 20 20 20 20 20 20 20 20  ing8: {         
73c0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54  /* same as TK_ST
73d0: 52 49 4e 47 2c 20 6f 75 74 32 2d 70 72 65 72 65  RING, out2-prere
73e0: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
73f0: 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  t( pOp->p4.z!=0 
7400: 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  );.  pOp->opcode
7410: 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20   = OP_String;.  
7420: 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65  pOp->p1 = sqlite
7430: 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70  3Strlen30(pOp->p
7440: 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  4.z);..#ifndef S
7450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
7460: 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21  .  if( encoding!
7470: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
7480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7490: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
74a0: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d  ut, pOp->p4.z, -
74b0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
74c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
74d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
74e0: 54 45 5f 54 4f 4f 42 49 47 20 29 20 67 6f 74 6f  TE_TOOBIG ) goto
74f0: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 69 66   too_big;.    if
7500: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7510: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
7520: 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
7530: 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20 6e 6f  oding) ) goto no
7540: 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74  _mem;.    assert
7550: 28 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d  ( pOut->zMalloc=
7560: 3d 70 4f 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20  =pOut->z );.    
7570: 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 66 6c  assert( pOut->fl
7580: 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b  ags & MEM_Dyn );
7590: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c  .    pOut->zMall
75a0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  oc = 0;.    pOut
75b0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
75c0: 74 61 74 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d  tatic;.    pOut-
75d0: 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44  >flags &= ~MEM_D
75e0: 79 6e 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  yn;.    if( pOp-
75f0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41  >p4type==P4_DYNA
7600: 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MIC ){.      sql
7610: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
7620: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d  Op->p4.z);.    }
7630: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
7640: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
7650: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70     pOp->p4.z = p
7660: 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d  Out->z;.    pOp-
7670: 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20  >p1 = pOut->n;. 
7680: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
7690: 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d  pOp->p1>db->aLim
76a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
76b0: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
76c0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
76d0: 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
76e0: 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  gh to the next c
76f0: 61 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a  ase, OP_String *
7700: 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65  /.}.  ./* Opcode
7710: 3a 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 2a  : String P1 P2 *
7720: 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20   P4 *.**.** The 
7730: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
7740: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
7750: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
7760: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
7770: 2f 0a 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67  /.case OP_String
7780: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  : {          /* 
7790: 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
77a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
77b0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
77c0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
77d0: 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c  _Str|MEM_Static|
77e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
77f0: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ->z = pOp->p4.z;
7800: 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70  .  pOut->n = pOp
7810: 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  ->p1;.  pOut->en
7820: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
7830: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
7840: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
7850: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7860: 3a 20 4e 75 6c 6c 20 2a 20 50 32 20 2a 20 2a 20  : Null * P2 * * 
7870: 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  *.**.** Write a 
7880: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
7890: 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
78a0: 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  P_Null: {       
78b0: 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72      /* out2-prer
78c0: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74  elease */.  pOut
78d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
78e0: 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ll;.  break;.}..
78f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62  ./* Opcode: Blob
7900: 20 50 31 20 50 32 20 2a 20 50 34 0a 2a 2a 0a 2a   P1 P2 * P4.**.*
7910: 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61  * P4 points to a
7920: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50 31   blob of data P1
7930: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53 74   bytes long.  St
7940: 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f 62  ore this.** blob
7950: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
7960: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f 62  .*/.case OP_Blob
7970: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
7980: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
7990: 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  lease */.  asser
79a0: 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53 51  t( pOp->p1 <= SQ
79b0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
79c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
79d0: 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20  MemSetStr(pOut, 
79e0: 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70 2d 3e  pOp->p4.z, pOp->
79f0: 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 75  p1, 0, 0);.  pOu
7a00: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
7a10: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
7a20: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
7a30: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
7a40: 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c 65 20  pcode: Variable 
7a50: 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a  P1 P2 * P4 *.**.
7a60: 2a 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  ** Transfer the 
7a70: 76 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20  values of bound 
7a80: 70 61 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74  parameter P1 int
7a90: 6f 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  o register P2.**
7aa0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
7ab0: 65 74 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74  eter is named, t
7ac0: 68 65 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70  hen its name app
7ad0: 65 61 72 73 20 69 6e 20 50 34 20 61 6e 64 20 50  ears in P4 and P
7ae0: 33 3d 3d 31 2e 0a 2a 2a 20 54 68 65 20 50 34 20  3==1..** The P4 
7af0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62 79  value is used by
7b00: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
7b10: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e 0a  rameter_name()..
7b20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69 61  */.case OP_Varia
7b30: 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ble: {          
7b40: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7b50: 65 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  ease */.  Mem *p
7b60: 56 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56 61  Var;       /* Va
7b70: 6c 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73 66  lue being transf
7b80: 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  erred */..  asse
7b90: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26  rt( pOp->p1>0 &&
7ba0: 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56 61   pOp->p1<=p->nVa
7bb0: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
7bc0: 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20 70  Op->p4.z==0 || p
7bd0: 4f 70 2d 3e 70 34 2e 7a 3d 3d 70 2d 3e 61 7a 56  Op->p4.z==p->azV
7be0: 61 72 5b 70 4f 70 2d 3e 70 31 2d 31 5d 20 29 3b  ar[pOp->p1-1] );
7bf0: 0a 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56  .  pVar = &p->aV
7c00: 61 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b  ar[pOp->p1 - 1];
7c10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
7c20: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72  beMemTooBig(pVar
7c30: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
7c40: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 73 71 6c  o_big;.  }.  sql
7c50: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
7c60: 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61  owCopy(pOut, pVa
7c70: 72 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a  r, MEM_Static);.
7c80: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
7c90: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
7ca0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
7cb0: 64 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50  de: Move P1 P2 P
7cc0: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  3 * *.**.** Move
7cd0: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
7ce0: 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b 50  egister P1..P1+P
7cf0: 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a 2a  3-1 over into.**
7d00: 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50   registers P2..P
7d10: 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74 65  2+P3-1.  Registe
7d20: 72 73 20 50 31 2e 2e 50 31 2b 50 31 2d 31 20 61  rs P1..P1+P1-1 a
7d30: 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64 69  re.** left holdi
7d40: 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ng a NULL.  It i
7d50: 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 72  s an error for r
7d60: 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a 2a  egister ranges.*
7d70: 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61 6e  * P1..P1+P3-1 an
7d80: 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74 6f  d P2..P2+P3-1 to
7d90: 20 6f 76 65 72 6c 61 70 2e 0a 2a 2f 0a 63 61 73   overlap..*/.cas
7da0: 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 63  e OP_Move: {.  c
7db0: 68 61 72 20 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20  har *zMalloc;   
7dc0: 2f 2a 20 48 6f 6c 64 69 6e 67 20 76 61 72 69 61  /* Holding varia
7dd0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ble for allocate
7de0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
7df0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t n;           /
7e00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
7e10: 73 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f  sters left to co
7e20: 70 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20  py */.  int p1; 
7e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
7e40: 73 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f  ster to copy fro
7e50: 6d 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20  m */.  int p2;  
7e60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
7e70: 74 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a  ter to copy to *
7e80: 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33  /..  n = pOp->p3
7e90: 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ;.  p1 = pOp->p1
7ea0: 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
7eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
7ec0: 26 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20  && p1>0 && p2>0 
7ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b  );.  assert( p1+
7ee0: 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70  n<=p2 || p2+n<=p
7ef0: 31 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26  1 );..  pIn1 = &
7f00: 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74  aMem[p1];.  pOut
7f10: 20 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20   = &aMem[p2];.  
7f20: 77 68 69 6c 65 28 20 6e 2d 2d 20 29 7b 0a 20 20  while( n-- ){.  
7f30: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 3c 3d    assert( pOut<=
7f40: 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 20 29  &aMem[p->nMem] )
7f50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
7f60: 6e 31 3c 3d 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65  n1<=&aMem[p->nMe
7f70: 6d 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  m] );.    assert
7f80: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
7f90: 31 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f  1) );.    memAbo
7fa0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
7fb0: 75 74 29 3b 0a 20 20 20 20 7a 4d 61 6c 6c 6f 63  ut);.    zMalloc
7fc0: 20 3d 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63   = pOut->zMalloc
7fd0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c  ;.    pOut->zMal
7fe0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  loc = 0;.    sql
7ff0: 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28  ite3VdbeMemMove(
8000: 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a 20 20 20  pOut, pIn1);.   
8010: 20 70 49 6e 31 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d   pIn1->zMalloc =
8020: 20 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 52 45   zMalloc;.    RE
8030: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b  GISTER_TRACE(p2+
8040: 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49  +, pOut);.    pI
8050: 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b  n1++;.    pOut++
8060: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
8070: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70  ../* Opcode: Cop
8080: 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  y P1 P2 * * *.**
8090: 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20  .** Make a copy 
80a0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
80b0: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
80c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
80d0: 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20  ruction makes a 
80e0: 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65  deep copy of the
80f0: 20 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69   value.  A dupli
8100: 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20  cate.** is made 
8110: 6f 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72  of any string or
8120: 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20   blob constant. 
8130: 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f   See also OP_SCo
8140: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  py..*/.case OP_C
8150: 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20  opy: {          
8160: 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 20     /* in1, out2 
8170: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
8180: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
8190: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
81a0: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
81b0: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73  Out!=pIn1 );.  s
81c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
81d0: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
81e0: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
81f0: 0a 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a  .  Deephemeraliz
8200: 65 28 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53  e(pOut);.  REGIS
8210: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
8220: 32 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  2, pOut);.  brea
8230: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
8240: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
8250: 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20   *.**.** Make a 
8260: 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20  shallow copy of 
8270: 72 65 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f  register P1 into
8280: 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
8290: 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63  .** This instruc
82a0: 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61  tion makes a sha
82b0: 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65  llow copy of the
82c0: 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20   value.  If the 
82d0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74  value.** is a st
82e0: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68  ring or blob, th
82f0: 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f  en the copy is o
8300: 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nly a pointer to
8310: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
8320: 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68   and hence if th
8330: 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67  e original chang
8340: 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63  es so will the c
8350: 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69  opy..** Worse, i
8360: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69  f the original i
8370: 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74  s deallocated, t
8380: 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20  he copy becomes 
8390: 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73  invalid..** Thus
83a0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73   the program mus
83b0: 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
83c0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69   the original wi
83d0: 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a  ll not change.**
83e0: 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65   during the life
83f0: 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79  time of the copy
8400: 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74  .  Use OP_Copy t
8410: 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74  o make a complet
8420: 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61  e.** copy..*/.ca
8430: 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20  se OP_SCopy: {  
8440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
8450: 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31  , out2 */.  pIn1
8460: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
8470: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
8480: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
8490: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
84a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
84b0: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
84c0: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
84d0: 45 70 68 65 6d 29 3b 0a 23 69 66 64 65 66 20 53  Ephem);.#ifdef S
84e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
84f0: 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72  ( pOut->pScopyFr
8500: 6f 6d 3d 3d 30 20 29 20 70 4f 75 74 2d 3e 70 53  om==0 ) pOut->pS
8510: 63 6f 70 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b  copyFrom = pIn1;
8520: 0a 23 65 6e 64 69 66 0a 20 20 52 45 47 49 53 54  .#endif.  REGIST
8530: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
8540: 2c 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  , pOut);.  break
8550: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
8560: 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50 32 20  ResultRow P1 P2 
8570: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
8580: 72 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72  registers P1 thr
8590: 6f 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e  ough P1+P2-1 con
85a0: 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  tain a single ro
85b0: 77 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e  w of.** results.
85c0: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75   This opcode cau
85d0: 73 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ses the sqlite3_
85e0: 73 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74  step() call to t
85f0: 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68  erminate.** with
8600: 20 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72   an SQLITE_ROW r
8610: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69  eturn code and i
8620: 74 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71  t sets up the sq
8630: 6c 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74  lite3_stmt.** st
8640: 72 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69  ructure to provi
8650: 64 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  de access to the
8660: 20 74 6f 70 20 50 31 20 76 61 6c 75 65 73 20 61   top P1 values a
8670: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
8680: 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  row..*/.case OP_
8690: 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d  ResultRow: {.  M
86a0: 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20  em *pMem;.  int 
86b0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
86c0: 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d  nResColumn==pOp-
86d0: 3e 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >p2 );.  assert(
86e0: 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20   pOp->p1>0 );.  
86f0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b  assert( pOp->p1+
8700: 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
8710: 2b 31 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +1 );..  /* If t
8720: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
8730: 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d 65 64  s violated immed
8740: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
8750: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 64 6f   constraints, do
8760: 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75 72 6e  .  ** not return
8770: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
8780: 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20 41 6e  ows modified. An
8790: 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41 53 45  d do not RELEASE
87a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
87b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
87c0: 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
87d0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 2a 2f  rolled back.  */
87e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
87f0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  !=(rc = sqlite3V
8800: 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
8810: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
8820: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
8830: 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a 20  E_CountRows );. 
8840: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 73     assert( p->us
8850: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 3b  esStmtJournal );
8860: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
8870: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
8880: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 66 6c  ITE_CountRows fl
8890: 61 67 20 69 73 20 73 65 74 20 69 6e 20 73 71 6c  ag is set in sql
88a0: 69 74 65 33 2e 66 6c 61 67 73 20 6d 61 73 6b 2c  ite3.flags mask,
88b0: 20 74 68 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20   then .  ** DML 
88c0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6b  statements invok
88d0: 65 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  e this opcode to
88e0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
88f0: 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a  er of rows .  **
8900: 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 74 68 65   modified to the
8910: 20 75 73 65 72 2e 20 54 68 69 73 20 69 73 20 74   user. This is t
8920: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
8930: 20 61 20 56 4d 20 74 68 61 74 0a 20 20 2a 2a 20   a VM that.  ** 
8940: 6f 70 65 6e 73 20 61 20 73 74 61 74 65 6d 65 6e  opens a statemen
8950: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
8960: 79 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70  y invoke this op
8970: 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  code..  **.  ** 
8980: 49 6e 20 63 61 73 65 20 74 68 69 73 20 69 73 20  In case this is 
8990: 73 75 63 68 20 61 20 73 74 61 74 65 6d 65 6e 74  such a statement
89a0: 2c 20 63 6c 6f 73 65 20 61 6e 79 20 73 74 61 74  , close any stat
89b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
89c0: 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62 79  n.  ** opened by
89d0: 20 74 68 69 73 20 56 4d 20 62 65 66 6f 72 65 20   this VM before 
89e0: 72 65 74 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f  returning contro
89f0: 6c 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 54  l to the user. T
8a00: 68 69 73 20 69 73 20 74 6f 0a 20 20 2a 2a 20 65  his is to.  ** e
8a10: 6e 73 75 72 65 20 74 68 61 74 20 73 74 61 74 65  nsure that state
8a20: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
8a30: 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 73  s are always nes
8a40: 74 65 64 2c 20 6e 6f 74 20 6f 76 65 72 6c 61 70  ted, not overlap
8a50: 70 69 6e 67 2e 0a 20 20 2a 2a 20 49 66 20 74 68  ping..  ** If th
8a60: 65 20 6f 70 65 6e 20 73 74 61 74 65 6d 65 6e 74  e open statement
8a70: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
8a80: 6e 6f 74 20 63 6c 6f 73 65 64 20 68 65 72 65 2c  not closed here,
8a90: 20 74 68 65 6e 20 74 68 65 20 75 73 65 72 0a 20   then the user. 
8aa0: 20 2a 2a 20 6d 61 79 20 73 74 65 70 20 61 6e 6f   ** may step ano
8ab0: 74 68 65 72 20 56 4d 20 74 68 61 74 20 6f 70 65  ther VM that ope
8ac0: 6e 73 20 69 74 73 20 6f 77 6e 20 73 74 61 74 65  ns its own state
8ad0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
8ae0: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20  . This.  ** may 
8af0: 6c 65 61 64 20 74 6f 20 6f 76 65 72 6c 61 70 70  lead to overlapp
8b00: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 74 72  ing statement tr
8b10: 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ansactions..  **
8b20: 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 65 6d  .  ** The statem
8b30: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
8b40: 69 73 20 6e 65 76 65 72 20 61 20 74 6f 70 2d 6c  is never a top-l
8b50: 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  evel transaction
8b60: 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
8b70: 65 20 52 45 4c 45 41 53 45 20 63 61 6c 6c 20 62  e RELEASE call b
8b80: 65 6c 6f 77 20 63 61 6e 20 6e 65 76 65 72 20 66  elow can never f
8b90: 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ail..  */.  asse
8ba0: 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
8bb0: 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 66 6c 61 67  t==0 || db->flag
8bc0: 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  s&SQLITE_CountRo
8bd0: 77 73 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ws );.  rc = sql
8be0: 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
8bf0: 74 65 6d 65 6e 74 28 70 2c 20 53 41 56 45 50 4f  tement(p, SAVEPO
8c00: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
8c10: 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51  if( NEVER(rc!=SQ
8c20: 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  LITE_OK) ){.    
8c30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
8c40: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
8c50: 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72  ephemeral cursor
8c60: 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f 0a 20   row caches */. 
8c70: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 28   p->cacheCtr = (
8c80: 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20 32 29  p->cacheCtr + 2)
8c90: 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  |1;..  /* Make s
8ca0: 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ure the results 
8cb0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
8cc0: 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65 72 6d  ow are \000 term
8cd0: 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e 64 20  inated.  ** and 
8ce0: 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64  have an assigned
8cf0: 20 74 79 70 65 2e 20 20 54 68 65 20 72 65 73 75   type.  The resu
8d00: 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68 65 6d  lts are de-ephem
8d10: 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20 2a 2a  eralized as.  **
8d20: 20 61 73 20 73 69 64 65 20 65 66 66 65 63 74 2e   as side effect.
8d30: 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20 70  .  */.  pMem = p
8d40: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
8d50: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
8d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 2d   for(i=0; i<pOp-
8d70: 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  >p2; i++){.    a
8d80: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
8d90: 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a 20  d(&pMem[i]) );. 
8da0: 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a     Deephemeraliz
8db0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
8dc0: 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b 69   assert( (pMem[i
8dd0: 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45 70  ].flags & MEM_Ep
8de0: 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  hem)==0.        
8df0: 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d 2e      || (pMem[i].
8e00: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72  flags & (MEM_Str
8e10: 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29  |MEM_Blob))==0 )
8e20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8e30: 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65  eMemNulTerminate
8e40: 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20  (&pMem[i]);.    
8e50: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
8e60: 6f 72 65 54 79 70 65 28 26 70 4d 65 6d 5b 69 5d  oreType(&pMem[i]
8e70: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
8e80: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c  TRACE(pOp->p1+i,
8e90: 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a   &pMem[i]);.  }.
8ea0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
8eb0: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  Failed ) goto no
8ec0: 5f 6d 65 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  _mem;..  /* Retu
8ed0: 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20  rn SQLITE_ROW.  
8ee0: 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 20  */.  p->pc = pc 
8ef0: 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  + 1;.  rc = SQLI
8f00: 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76  TE_ROW;.  goto v
8f10: 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  dbe_return;.}../
8f20: 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74  * Opcode: Concat
8f30: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
8f40: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74  .** Add the text
8f50: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
8f60: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
8f70: 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72  the text in.** r
8f80: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
8f90: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
8fa0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
8fb0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  ** If either the
8fc0: 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61   P1 or P2 text a
8fd0: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f  re NULL then sto
8fe0: 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a  re NULL in P3..*
8ff0: 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c  *.**   P3 = P2 |
9000: 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  | P1.**.** It is
9010: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20   illegal for P1 
9020: 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65  and P3 to be the
9030: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20   same register. 
9040: 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66  Sometimes,.** if
9050: 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20   P3 is the same 
9060: 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20  register as P2, 
9070: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
9080: 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f  on is able.** to
9090: 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28   avoid a memcpy(
90a0: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
90b0: 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ncat: {         
90c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
90d0: 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32  CONCAT, in1, in2
90e0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
90f0: 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d  nByte;..  pIn1 =
9100: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
9110: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
9120: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
9130: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
9140: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
9150: 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28  1!=pOut );.  if(
9160: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
9170: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
9180: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
9190: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
91a0: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
91b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
91c0: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
91d0: 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28  ) || ExpandBlob(
91e0: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
91f0: 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  mem;.  Stringify
9200: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
9210: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
9220: 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n2, encoding);. 
9230: 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e   nByte = pIn1->n
9240: 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66   + pIn2->n;.  if
9250: 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
9260: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
9270: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
9280: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
9290: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
92a0: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72 29  g(pOut, MEM_Str)
92b0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ;.  if( sqlite3V
92c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c  dbeMemGrow(pOut,
92d0: 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70   (int)nByte+2, p
92e0: 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20  Out==pIn2) ){.  
92f0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
9300: 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70   }.  if( pOut!=p
9310: 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  In2 ){.    memcp
9320: 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d  y(pOut->z, pIn2-
9330: 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20  >z, pIn2->n);.  
9340: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74  }.  memcpy(&pOut
9350: 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49  ->z[pIn2->n], pI
9360: 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b  n1->z, pIn1->n);
9370: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
9380: 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a  ] = 0;.  pOut->z
9390: 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20  [nByte+1] = 0;. 
93a0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20   pOut->flags |= 
93b0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74  MEM_Term;.  pOut
93c0: 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65  ->n = (int)nByte
93d0: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
93e0: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
93f0: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
9400: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
9410: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64  }../* Opcode: Ad
9420: 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
9430: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c  *.** Add the val
9440: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
9450: 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
9460: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
9470: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
9480: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
9490: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
94a0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
94b0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
94c0: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
94d0: 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20  de: Multiply P1 
94e0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 0a  P2 P3 * *.**.**.
94f0: 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20  ** Multiply the 
9500: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
9510: 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75  r P1 by the valu
9520: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
9530: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
9540: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
9550: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
9560: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
9570: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
9580: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
9590: 70 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20  pcode: Subtract 
95a0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
95b0: 2a 2a 20 53 75 62 74 72 61 63 74 20 74 68 65 20  ** Subtract the 
95c0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
95d0: 72 20 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61  r P1 from the va
95e0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
95f0: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
9600: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
9610: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
9620: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
9630: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
9640: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
9650: 20 4f 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20   Opcode: Divide 
9660: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
9670: 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20 76 61  ** Divide the va
9680: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
9690: 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  P1 by the value 
96a0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
96b0: 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
96c0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
96d0: 65 72 20 50 33 20 28 50 33 3d 50 32 2f 50 31 29  er P3 (P3=P2/P1)
96e0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  . If the value i
96f0: 6e 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  n .** register P
9700: 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  1 is zero, then 
9710: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
9720: 4c 4c 2e 20 49 66 20 65 69 74 68 65 72 20 69 6e  LL. If either in
9730: 70 75 74 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c  put is .** NULL,
9740: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
9750: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
9760: 65 3a 20 52 65 6d 61 69 6e 64 65 72 20 50 31 20  e: Remainder P1 
9770: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
9780: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 6d 61  Compute the rema
9790: 69 6e 64 65 72 20 61 66 74 65 72 20 69 6e 74 65  inder after inte
97a0: 67 65 72 20 64 69 76 69 73 69 6f 6e 20 6f 66 20  ger division of 
97b0: 74 68 65 20 76 61 6c 75 65 20 69 6e 0a 2a 2a 20  the value in.** 
97c0: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
97d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
97e0: 73 74 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72  ster P2 and stor
97f0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
9800: 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 76  P3. .** If the v
9810: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
9820: 20 50 32 20 69 73 20 7a 65 72 6f 20 74 68 65 20   P2 is zero the 
9830: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
9840: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 70 65  ** If either ope
9850: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20 74 68  rand is NULL, th
9860: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
9870: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64  ..*/.case OP_Add
9880: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9890: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
98a0: 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69 6e 32  K_PLUS, in1, in2
98b0: 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f  , out3 */.case O
98c0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 20  P_Subtract:     
98d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
98e0: 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20 69 6e   as TK_MINUS, in
98f0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9900: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
9910: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
9920: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 54 41  * same as TK_STA
9930: 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  R, in1, in2, out
9940: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 69 76  3 */.case OP_Div
9950: 69 64 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  ide:            
9960: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
9970: 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20 69 6e  K_SLASH, in1, in
9980: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9990: 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20 7b 20  OP_Remainder: { 
99a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
99b0: 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69 6e 31  e as TK_REM, in1
99c0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
99d0: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
99e0: 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d   /* Combined MEM
99f0: 5f 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f  _* flags from bo
9a00: 74 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 69  th inputs */.  i
9a10: 36 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f  64 iA;         /
9a20: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
9a30: 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  of left operand 
9a40: 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20  */.  i64 iB;    
9a50: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9a60: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
9a70: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62  perand */.  doub
9a80: 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52  le rA;      /* R
9a90: 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  eal value of lef
9aa0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64  t operand */.  d
9ab0: 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f  ouble rB;      /
9ac0: 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20  * Real value of 
9ad0: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f  right operand */
9ae0: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
9af0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70 70  [pOp->p1];.  app
9b00: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
9b10: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20  y(pIn1);.  pIn2 
9b20: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
9b30: 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ;.  applyNumeric
9b40: 41 66 66 69 6e 69 74 79 28 70 49 6e 32 29 3b 0a  Affinity(pIn2);.
9b50: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
9b60: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
9b70: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c   = pIn1->flags |
9b80: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn2->flags;.  
9b90: 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
9ba0: 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f  _Null)!=0 ) goto
9bb0: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
9bc0: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66  lt_is_null;.  if
9bd0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
9be0: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn2->flags & M
9bf0: 45 4d 5f 49 6e 74 29 3d 3d 4d 45 4d 5f 49 6e 74  EM_Int)==MEM_Int
9c00: 20 29 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e   ){.    iA = pIn
9c10: 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d  1->u.i;.    iB =
9c20: 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn2->u.i;.    
9c30: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63  switch( pOp->opc
9c40: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
9c50: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
9c60: 69 66 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e  if( sqlite3AddIn
9c70: 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f  t64(&iB,iA) ) go
9c80: 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65  to fp_math;  bre
9c90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
9ca0: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66 28  P_Subtract:  if(
9cb0: 20 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34   sqlite3SubInt64
9cc0: 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20  (&iB,iA) ) goto 
9cd0: 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b  fp_math;  break;
9ce0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d  .      case OP_M
9cf0: 75 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71  ultiply:  if( sq
9d00: 6c 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69  lite3MulInt64(&i
9d10: 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f  B,iA) ) goto fp_
9d20: 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20  math;  break;.  
9d30: 20 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69      case OP_Divi
9d40: 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  de: {.        if
9d50: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
9d60: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9d70: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
9d80: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20    if( iA==-1 && 
9d90: 69 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  iB==SMALLEST_INT
9da0: 36 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74  64 ) goto fp_mat
9db0: 68 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d  h;.        iB /=
9dc0: 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65   iA;.        bre
9dd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9de0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9df0: 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29       if( iA==0 )
9e00: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
9e10: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
9e20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d  .        if( iA=
9e30: 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20  =-1 ) iA = 1;.  
9e40: 20 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a        iB %= iA;.
9e50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9e60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9e70: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b   pOut->u.i = iB;
9e80: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
9e90: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
9ea0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 66 70 5f  t);.  }else{.fp_
9eb0: 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73  math:.    rA = s
9ec0: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
9ed0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72  lue(pIn1);.    r
9ee0: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  B = sqlite3VdbeR
9ef0: 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  ealValue(pIn2);.
9f00: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
9f10: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  >opcode ){.     
9f20: 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20   case OP_Add:   
9f30: 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20        rB += rA; 
9f40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9f50: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
9f60: 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41  act:    rB -= rA
9f70: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f80: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
9f90: 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20  tiply:    rB *= 
9fa0: 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  rA;       break;
9fb0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44  .      case OP_D
9fc0: 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  ivide: {.       
9fd0: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
9fe0: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
9ff0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
a000: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  INT... */.      
a010: 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c    if( rA==(doubl
a020: 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  e)0 ) goto arith
a030: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a040: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42  null;.        rB
a050: 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20   /= rA;.        
a060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
a070: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
a080: 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69 36          iA = (i6
a090: 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42  4)rA;.        iB
a0a0: 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20   = (i64)rB;.    
a0b0: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
a0c0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
a0d0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
a0e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
a0f0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
a100: 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c       rB = (doubl
a110: 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20  e)(iB % iA);.   
a120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a130: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
a140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
a150: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
a160: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a  pOut->u.i = rB;.
a170: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
a180: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
a190: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
a1a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42   sqlite3IsNaN(rB
a1b0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
a1c0: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
a1d0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d  t_is_null;.    }
a1e0: 0a 20 20 20 20 70 4f 75 74 2d 3e 72 20 3d 20 72  .    pOut->r = r
a1f0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
a200: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
a210: 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 28  Real);.    if( (
a220: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
a230: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
a240: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
a250: 41 66 66 69 6e 69 74 79 28 70 4f 75 74 29 3b 0a  Affinity(pOut);.
a260: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a270: 0a 20 20 62 72 65 61 6b 3b 0a 0a 61 72 69 74 68  .  break;..arith
a280: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
a290: 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56  null:.  sqlite3V
a2a0: 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
a2b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
a2c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c  ./* Opcode: Coll
a2d0: 53 65 71 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a  Seq * * P4.**.**
a2e0: 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
a2f0: 20 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74   to a CollSeq st
a300: 72 75 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78  ruct. If the nex
a310: 74 20 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72  t call to a user
a320: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20   function.** or 
a330: 61 67 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20  aggregate calls 
a340: 73 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f  sqlite3GetFuncCo
a350: 6c 6c 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f  llSeq(), this co
a360: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
a370: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75   will.** be retu
a380: 72 6e 65 64 2e 20 54 68 69 73 20 69 73 20 75 73  rned. This is us
a390: 65 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d  ed by the built-
a3a0: 69 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20  in min(), max() 
a3b0: 61 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20  and nullif().** 
a3c0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
a3d0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 75   The interface u
a3e0: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
a3f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
a400: 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64 20   aforementioned 
a410: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f 20  functions.** to 
a420: 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 6c  retrieve the col
a430: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a440: 73 65 74 20 62 79 20 74 68 69 73 20 6f 70 63 6f  set by this opco
a450: 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  de is not availa
a460: 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79 2c  ble.** publicly,
a470: 20 6f 6e 6c 79 20 74 6f 20 75 73 65 72 20 66 75   only to user fu
a480: 6e 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  nctions defined 
a490: 69 6e 20 66 75 6e 63 2e 63 2e 0a 2a 2f 0a 63 61  in func.c..*/.ca
a4a0: 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b  se OP_CollSeq: {
a4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a4c0: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
a4d0: 45 51 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  EQ );.  break;.}
a4e0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e  ../* Opcode: Fun
a4f0: 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
a500: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  4 P5.**.** Invok
a510: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
a520: 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69 6e 74  n (P4 is a point
a530: 65 72 20 74 6f 20 61 20 46 75 6e 63 74 69 6f 6e  er to a Function
a540: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 0a   structure that.
a550: 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  ** defines the f
a560: 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35  unction) with P5
a570: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
a580: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
a590: 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73  2 and.** success
a5a0: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
a5b0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
a5c0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
a5d0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65  gister P3..** Re
a5e0: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
a5f0: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
a600: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
a610: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
a620: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
a630: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
a640: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
a650: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
a660: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
a670: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
a680: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
a690: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
a6a0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
a6b0: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
a6c0: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
a6d0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
a6e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a6f0: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
a700: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
a710: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
a720: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
a730: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
a740: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
a750: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
a760: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
a770: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
a780: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
a790: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
a7a0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 41 67 67 53  * See also: AggS
a7b0: 74 65 70 20 61 6e 64 20 41 67 67 46 69 6e 61 6c  tep and AggFinal
a7c0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63  .*/.case OP_Func
a7d0: 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b  tion: {.  int i;
a7e0: 0a 20 20 4d 65 6d 20 2a 70 41 72 67 3b 0a 20 20  .  Mem *pArg;.  
a7f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a800: 63 74 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ctx;.  sqlite3_v
a810: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 3b 0a 20 20  alue **apVal;.  
a820: 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f  int n;..  n = pO
a830: 70 2d 3e 70 35 3b 0a 20 20 61 70 56 61 6c 20 3d  p->p5;.  apVal =
a840: 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73   p->apArg;.  ass
a850: 65 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d  ert( apVal || n=
a860: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
a870: 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
a880: 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
a890: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
a8a0: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
a8b0: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
a8c0: 70 4f 75 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  pOut);..  assert
a8d0: 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e  ( n==0 || (pOp->
a8e0: 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b  p2>0 && pOp->p2+
a8f0: 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 29 20 29 3b  n<=p->nMem+1) );
a900: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a910: 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f  p3<pOp->p2 || pO
a920: 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e  p->p3>=pOp->p2+n
a930: 20 29 3b 0a 20 20 70 41 72 67 20 3d 20 26 61 4d   );.  pArg = &aM
a940: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66  em[pOp->p2];.  f
a950: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
a960: 2c 20 70 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61  , pArg++){.    a
a970: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
a980: 64 28 70 41 72 67 29 20 29 3b 0a 20 20 20 20 61  d(pArg) );.    a
a990: 70 56 61 6c 5b 69 5d 20 3d 20 70 41 72 67 3b 0a  pVal[i] = pArg;.
a9a0: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
a9b0: 7a 65 28 70 41 72 67 29 3b 0a 20 20 20 20 73 71  ze(pArg);.    sq
a9c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 6f 72  lite3VdbeMemStor
a9d0: 65 54 79 70 65 28 70 41 72 67 29 3b 0a 20 20 20  eType(pArg);.   
a9e0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
a9f0: 70 4f 70 2d 3e 70 32 2b 69 2c 20 70 41 72 67 29  pOp->p2+i, pArg)
aa00: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
aa10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
aa20: 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70 4f 70 2d  _FUNCDEF || pOp-
aa30: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 44 42 45  >p4type==P4_VDBE
aa40: 46 55 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 4f  FUNC );.  if( pO
aa50: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
aa60: 4e 43 44 45 46 20 29 7b 0a 20 20 20 20 63 74 78  NCDEF ){.    ctx
aa70: 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34  .pFunc = pOp->p4
aa80: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63 74 78 2e  .pFunc;.    ctx.
aa90: 70 56 64 62 65 46 75 6e 63 20 3d 20 30 3b 0a 20  pVdbeFunc = 0;. 
aaa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 74 78 2e   }else{.    ctx.
aab0: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
aac0: 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70 34 2e 70  eFunc*)pOp->p4.p
aad0: 56 64 62 65 46 75 6e 63 3b 0a 20 20 20 20 63 74  VdbeFunc;.    ct
aae0: 78 2e 70 46 75 6e 63 20 3d 20 63 74 78 2e 70 56  x.pFunc = ctx.pV
aaf0: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 3b 0a  dbeFunc->pFunc;.
ab00: 20 20 7d 0a 0a 20 20 63 74 78 2e 73 2e 66 6c 61    }..  ctx.s.fla
ab10: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
ab20: 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62 3b 0a   ctx.s.db = db;.
ab30: 20 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30    ctx.s.xDel = 0
ab40: 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c 6f  ;.  ctx.s.zMallo
ab50: 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  c = 0;..  /* The
ab60: 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61 79   output cell may
ab70: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
ab80: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
ab90: 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  . Move.  ** the 
aba0: 70 6f 69 6e 74 65 72 20 74 6f 20 63 74 78 2e 73  pointer to ctx.s
abb0: 20 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20   so in case the 
abc0: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 63 61  user-function ca
abd0: 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 61  n use.  ** the a
abe0: 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
abf0: 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
ac00: 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
ac10: 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
ac20: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
ac30: 76 65 28 26 63 74 78 2e 73 2c 20 70 4f 75 74 29  ve(&ctx.s, pOut)
ac40: 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
ac50: 61 67 28 26 63 74 78 2e 73 2c 20 4d 45 4d 5f 4e  ag(&ctx.s, MEM_N
ac60: 75 6c 6c 29 3b 0a 0a 20 20 63 74 78 2e 69 73 45  ull);..  ctx.isE
ac70: 72 72 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  rror = 0;.  if( 
ac80: 63 74 78 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  ctx.pFunc->flags
ac90: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
aca0: 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 61  EEDCOLL ){.    a
acb0: 73 73 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29  ssert( pOp>aOp )
acc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
acd0: 70 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34  p[-1].p4type==P4
ace0: 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20  _COLLSEQ );.    
acf0: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
ad00: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53  opcode==OP_CollS
ad10: 65 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43  eq );.    ctx.pC
ad20: 6f 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34  oll = pOp[-1].p4
ad30: 2e 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 64 62  .pColl;.  }.  db
ad40: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61  ->lastRowid = la
ad50: 73 74 52 6f 77 69 64 3b 0a 20 20 28 2a 63 74 78  stRowid;.  (*ctx
ad60: 2e 70 46 75 6e 63 2d 3e 78 46 75 6e 63 29 28 26  .pFunc->xFunc)(&
ad70: 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29 3b 20  ctx, n, apVal); 
ad80: 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d  /* IMP: R-24505-
ad90: 32 33 32 33 30 20 2a 2f 0a 20 20 6c 61 73 74 52  23230 */.  lastR
ada0: 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52  owid = db->lastR
adb0: 6f 77 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  owid;..  /* If a
adc0: 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ny auxiliary dat
add0: 61 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  a functions have
ade0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 62 79 20   been called by 
adf0: 74 68 69 73 20 75 73 65 72 20 66 75 6e 63 74 69  this user functi
ae00: 6f 6e 2c 0a 20 20 2a 2a 20 69 6d 6d 65 64 69 61  on,.  ** immedia
ae10: 74 65 6c 79 20 63 61 6c 6c 20 74 68 65 20 64 65  tely call the de
ae20: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e 79  structor for any
ae30: 20 6e 6f 6e 2d 73 74 61 74 69 63 20 76 61 6c 75   non-static valu
ae40: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  es..  */.  if( c
ae50: 74 78 2e 70 56 64 62 65 46 75 6e 63 20 29 7b 0a  tx.pVdbeFunc ){.
ae60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
ae70: 65 6c 65 74 65 41 75 78 44 61 74 61 28 63 74 78  eleteAuxData(ctx
ae80: 2e 70 56 64 62 65 46 75 6e 63 2c 20 70 4f 70 2d  .pVdbeFunc, pOp-
ae90: 3e 70 31 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  >p1);.    pOp->p
aea0: 34 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 63 74  4.pVdbeFunc = ct
aeb0: 78 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20 20  x.pVdbeFunc;.   
aec0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
aed0: 34 5f 56 44 42 45 46 55 4e 43 3b 0a 20 20 7d 0a  4_VDBEFUNC;.  }.
aee0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
aef0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 2f  cFailed ){.    /
af00: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 61 20  * Even though a 
af10: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 66 61 69  malloc() has fai
af20: 6c 65 64 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65  led, the impleme
af30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  ntation of the. 
af40: 20 20 20 2a 2a 20 75 73 65 72 20 66 75 6e 63 74     ** user funct
af50: 69 6f 6e 20 6d 61 79 20 68 61 76 65 20 63 61 6c  ion may have cal
af60: 6c 65 64 20 61 6e 20 73 71 6c 69 74 65 33 5f 72  led an sqlite3_r
af70: 65 73 75 6c 74 5f 58 58 58 28 29 20 66 75 6e 63  esult_XXX() func
af80: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 72  tion.    ** to r
af90: 65 74 75 72 6e 20 61 20 76 61 6c 75 65 2e 20 54  eturn a value. T
afa0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
afb0: 6c 20 72 65 6c 65 61 73 65 73 20 61 6e 79 20 72  l releases any r
afc0: 65 73 6f 75 72 63 65 73 0a 20 20 20 20 2a 2a 20  esources.    ** 
afd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
afe0: 73 75 63 68 20 61 20 76 61 6c 75 65 2e 0a 20 20  such a value..  
aff0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
b000: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
b010: 63 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f  ctx.s);.    goto
b020: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20   no_mem;.  }..  
b030: 2f 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  /* If the functi
b040: 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
b050: 72 72 6f 72 2c 20 74 68 72 6f 77 20 61 6e 20 65  rror, throw an e
b060: 78 63 65 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  xception */.  if
b070: 28 20 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b  ( ctx.isError ){
b080: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
b090: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b0a0: 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c  g, db, "%s", sql
b0b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b0c0: 26 63 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63  &ctx.s));.    rc
b0d0: 20 3d 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a   = ctx.isError;.
b0e0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74    }..  /* Copy t
b0f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b100: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f 20 72   function into r
b110: 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a 20 20  egister P3 */.  
b120: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b130: 65 45 6e 63 6f 64 69 6e 67 28 26 63 74 78 2e 73  eEncoding(&ctx.s
b140: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 73  , encoding);.  s
b150: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76  qlite3VdbeMemMov
b160: 65 28 70 4f 75 74 2c 20 26 63 74 78 2e 73 29 3b  e(pOut, &ctx.s);
b170: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
b180: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4f 75 74  beMemTooBig(pOut
b190: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ) ){.    goto to
b1a0: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 23 69 66 20  o_big;.  }..#if 
b1b0: 30 0a 20 20 2f 2a 20 54 68 65 20 61 70 70 2d 64  0.  /* The app-d
b1c0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 20  efined function 
b1d0: 68 61 73 20 64 6f 6e 65 20 73 6f 6d 65 74 68 69  has done somethi
b1e0: 6e 67 20 74 68 61 74 20 61 73 20 63 61 75 73 65  ng that as cause
b1f0: 64 20 74 68 69 73 0a 20 20 2a 2a 20 73 74 61 74  d this.  ** stat
b200: 65 6d 65 6e 74 20 74 6f 20 65 78 70 69 72 65 2e  ement to expire.
b210: 20 20 28 50 65 72 68 61 70 73 20 74 68 65 20 66    (Perhaps the f
b220: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 73  unction called s
b230: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 20 20  qlite3_exec().  
b240: 2a 2a 20 77 69 74 68 20 61 20 43 52 45 41 54 45  ** with a CREATE
b250: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b260: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  .).  */.  if( p-
b270: 3e 65 78 70 69 72 65 64 20 29 20 72 63 20 3d 20  >expired ) rc = 
b280: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 23 65  SQLITE_ABORT;.#e
b290: 6e 64 69 66 0a 0a 20 20 52 45 47 49 53 54 45 52  ndif..  REGISTER
b2a0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
b2b0: 70 4f 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f  pOut);.  UPDATE_
b2c0: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75  MAX_BLOBSIZE(pOu
b2d0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
b2e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e  /* Opcode: BitAn
b2f0: 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
b300: 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69  *.** Take the bi
b310: 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68  t-wise AND of th
b320: 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
b330: 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61  ster P1 and P2 a
b340: 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20  nd.** store the 
b350: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
b360: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
b370: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
b380: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
b390: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
b3a0: 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32  ode: BitOr P1 P2
b3b0: 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61   P3 * *.**.** Ta
b3c0: 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65 20  ke the bit-wise 
b3d0: 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  OR of the values
b3e0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b3f0: 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74  and P2 and.** st
b400: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b410: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b420: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
b430: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
b440: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b450: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69  /./* Opcode: Shi
b460: 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33 20  ftLeft P1 P2 P3 
b470: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20  * *.**.** Shift 
b480: 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
b490: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b4a0: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79 20   to the left by 
b4b0: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
b4c0: 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20   bits specified 
b4d0: 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69  by the integer i
b4e0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
b4f0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
b500: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b510: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b520: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b530: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b540: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b550: 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20 50   ShiftRight P1 P
b560: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  2 P3 * *.**.** S
b570: 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72  hift the integer
b580: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b590: 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69 67  er P2 to the rig
b5a0: 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d  ht by the.** num
b5b0: 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65 63  ber of bits spec
b5c0: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e 74  ified by the int
b5d0: 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65 72  eger in register
b5e0: 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68   P1..** Store th
b5f0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b600: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b610: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b620: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b630: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  is NULL..*/.case
b640: 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20 20   OP_BitAnd:     
b650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b660: 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e 44  ame as TK_BITAND
b670: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
b680: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f   */.case OP_BitO
b690: 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r:              
b6a0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b6b0: 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e  K_BITOR, in1, in
b6c0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b6d0: 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20 20  OP_ShiftLeft:   
b6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
b6f0: 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c  me as TK_LSHIFT,
b700: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b710: 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66 74  */.case OP_Shift
b720: 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20 20  Right: {        
b730: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
b740: 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e  _RSHIFT, in1, in
b750: 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  2, out3 */.  i64
b760: 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a 20   iA;.  u64 uA;. 
b770: 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f 70   i64 iB;.  u8 op
b780: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
b790: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
b7a0: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
b7b0: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
b7c0: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
b7d0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
b7e0: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
b7f0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
b800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b810: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
b820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b830: 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  iA = sqlite3Vdbe
b840: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  IntValue(pIn2);.
b850: 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56 64    iB = sqlite3Vd
b860: 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
b870: 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f 70  ;.  op = pOp->op
b880: 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  code;.  if( op==
b890: 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20 20  OP_BitAnd ){.   
b8a0: 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65 6c   iA &= iB;.  }el
b8b0: 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69  se if( op==OP_Bi
b8c0: 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c 3d  tOr ){.    iA |=
b8d0: 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   iB;.  }else if(
b8e0: 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61 73   iB!=0 ){.    as
b8f0: 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68 69  sert( op==OP_Shi
b900: 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d 4f  ftRight || op==O
b910: 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 0a  P_ShiftLeft );..
b920: 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74 69      /* If shifti
b930: 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76 65  ng by a negative
b940: 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20 69   amount, shift i
b950: 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72 65  n the other dire
b960: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ction */.    if(
b970: 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20 61   iB<0 ){.      a
b980: 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74 52  ssert( OP_ShiftR
b990: 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c 65  ight==OP_ShiftLe
b9a0: 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f 70  ft+1 );.      op
b9b0: 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65 66   = 2*OP_ShiftLef
b9c0: 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20 20  t + 1 - op;.    
b9d0: 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29 20    iB = iB>(-64) 
b9e0: 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20 20  ? -iB : 64;.    
b9f0: 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d 36  }..    if( iB>=6
ba00: 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d 20  4 ){.      iA = 
ba10: 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f 50  (iA>=0 || op==OP
ba20: 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30 20  _ShiftLeft) ? 0 
ba30: 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : -1;.    }else{
ba40: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75  .      memcpy(&u
ba50: 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28 75  A, &iA, sizeof(u
ba60: 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  A));.      if( o
ba70: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
ba80: 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c 3c  ){.        uA <<
ba90: 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = iB;.      }els
baa0: 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e 3e  e{.        uA >>
bab0: 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f 2a  = iB;.        /*
bac0: 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e 20   Sign-extend on 
bad0: 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f 66  a right shift of
bae0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
baf0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  er */.        if
bb00: 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20 28  ( iA<0 ) uA |= (
bb10: 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66 66  (((u64)0xfffffff
bb20: 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66 66  f)<<32)|0xffffff
bb30: 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b 0a  ff) << (64-iB);.
bb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
bb50: 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20 73  mcpy(&iA, &uA, s
bb60: 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20 20  izeof(iA));.    
bb70: 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e  }.  }.  pOut->u.
bb80: 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65 74  i = iA;.  MemSet
bb90: 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
bba0: 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61 6b  EM_Int);.  break
bbb0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
bbc0: 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a 20  AddImm  P1 P2 * 
bbd0: 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  * *.** .** Add t
bbe0: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
bbf0: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
bc00: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
bc10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
bc20: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
bc30: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
bc40: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
bc50: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
bc60: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
bc70: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
bc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
bc90: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
bca0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
bcb0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
bcc0: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
bcd0: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
bce0: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
bcf0: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
bd00: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
bd10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
bd20: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
bd30: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
bd40: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
bd50: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
bd60: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
bd70: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
bd80: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
bd90: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
bda0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
bdb0: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
bdc0: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
bdd0: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
bde0: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
bdf0: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
be00: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
be10: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
be20: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
be30: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
be40: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
be50: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
be60: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 70  m[pOp->p1];.  ap
be70: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31  plyAffinity(pIn1
be80: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
be90: 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  ERIC, encoding);
bea0: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
beb0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
bec0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70  0 ){.    if( pOp
bed0: 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2==0 ){.     
bee0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53   rc = SQLITE_MIS
bef0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 67 6f 74  MATCH;.      got
bf00: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
bf10: 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rror;.    }else{
bf20: 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  .      pc = pOp-
bf30: 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  >p2 - 1;.    }. 
bf40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65 6d 53   }else{.    MemS
bf50: 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c  etTypeFlag(pIn1,
bf60: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20   MEM_Int);.  }. 
bf70: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
bf80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
bf90: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
bfa0: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
bfb0: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
bfc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
bfd0: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
bfe0: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
bff0: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
c000: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
c010: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
c020: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
c030: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
c040: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
c050: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
c060: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
c070: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
c080: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
c090: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
c0a0: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
c0b0: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
c0c0: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
c0d0: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
c0e0: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
c0f0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
c100: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
c110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
c120: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
c130: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
c140: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
c150: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
c160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
c170: 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20  Realify(pIn1);. 
c180: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
c190: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
c1a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
c1b0: 2a 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74  * Opcode: ToText
c1c0: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
c1d0: 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75  * Force the valu
c1e0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
c1f0: 20 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20   to be text..** 
c200: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
c210: 6e 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74  numeric, convert
c220: 20 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20   it to a string 
c230: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
c240: 69 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74  ivalent of print
c250: 66 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65  f().  Blob value
c260: 73 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20  s are unchanged 
c270: 61 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72  and.** are after
c280: 77 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74  wards simply int
c290: 65 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74  erpreted as text
c2a0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
c2b0: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
c2c0: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
c2d0: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
c2e0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
c2f0: 50 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20  P_ToText: {     
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c310: 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45  same as TK_TO_TE
c320: 58 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  XT, in1 */.  pIn
c330: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
c340: 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f  1];.  memAboutTo
c350: 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b  Change(p, pIn1);
c360: 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
c370: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20  gs & MEM_Null ) 
c380: 62 72 65 61 6b 3b 0a 20 20 61 73 73 65 72 74 28  break;.  assert(
c390: 20 4d 45 4d 5f 53 74 72 3d 3d 28 4d 45 4d 5f 42   MEM_Str==(MEM_B
c3a0: 6c 6f 62 3e 3e 33 29 20 29 3b 0a 20 20 70 49 6e  lob>>3) );.  pIn
c3b0: 31 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 49 6e  1->flags |= (pIn
c3c0: 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f  1->flags&MEM_Blo
c3d0: 62 29 3e 3e 33 3b 0a 20 20 61 70 70 6c 79 41 66  b)>>3;.  applyAf
c3e0: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
c3f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 65 6e  ITE_AFF_TEXT, en
c400: 63 6f 64 69 6e 67 29 3b 0a 20 20 72 63 20 3d 20  coding);.  rc = 
c410: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29  ExpandBlob(pIn1)
c420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
c430: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
c440: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
c450: 61 69 6c 65 64 20 29 3b 0a 20 20 70 49 6e 31 2d  ailed );.  pIn1-
c460: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f  >flags &= ~(MEM_
c470: 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
c480: 5f 42 6c 6f 62 7c 4d 45 4d 5f 5a 65 72 6f 29 3b  _Blob|MEM_Zero);
c490: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
c4a0: 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20  OBSIZE(pIn1);.  
c4b0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c4c0: 6f 64 65 3a 20 54 6f 42 6c 6f 62 20 50 31 20 2a  ode: ToBlob P1 *
c4d0: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72   * * *.**.** For
c4e0: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
c4f0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
c500: 65 20 61 20 42 4c 4f 42 2e 0a 2a 2a 20 49 66 20  e a BLOB..** If 
c510: 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e 75 6d  the value is num
c520: 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20 69 74  eric, convert it
c530: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 66 69 72   to a string fir
c540: 73 74 2e 0a 2a 2a 20 53 74 72 69 6e 67 73 20 61  st..** Strings a
c550: 72 65 20 73 69 6d 70 6c 79 20 72 65 69 6e 74 65  re simply reinte
c560: 72 70 72 65 74 65 64 20 61 73 20 62 6c 6f 62 73  rpreted as blobs
c570: 20 77 69 74 68 20 6e 6f 20 63 68 61 6e 67 65 0a   with no change.
c580: 2a 2a 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c  ** to the underl
c590: 79 69 6e 67 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  ying data..**.**
c5a0: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
c5b0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
c5c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
c5d0: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
c5e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 42 6c 6f  */.case OP_ToBlo
c5f0: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
c600: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
c610: 20 54 4b 5f 54 4f 5f 42 4c 4f 42 2c 20 69 6e 31   TK_TO_BLOB, in1
c620: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
c630: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
c640: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
c650: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61   MEM_Null ) brea
c660: 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  k;.  if( (pIn1->
c670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
c680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
c690: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
c6a0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
c6b0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
c6c0: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
c6d0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
c6e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c6f0: 64 20 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54  d );.    MemSetT
c700: 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20 4d 45  ypeFlag(pIn1, ME
c710: 4d 5f 42 6c 6f 62 29 3b 0a 20 20 7d 65 6c 73 65  M_Blob);.  }else
c720: 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 66 6c 61 67  {.    pIn1->flag
c730: 73 20 26 3d 20 7e 28 4d 45 4d 5f 54 79 70 65 4d  s &= ~(MEM_TypeM
c740: 61 73 6b 26 7e 4d 45 4d 5f 42 6c 6f 62 29 3b 0a  ask&~MEM_Blob);.
c750: 20 20 7d 0a 20 20 55 50 44 41 54 45 5f 4d 41 58    }.  UPDATE_MAX
c760: 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b  _BLOBSIZE(pIn1);
c770: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
c780: 4f 70 63 6f 64 65 3a 20 54 6f 4e 75 6d 65 72 69  Opcode: ToNumeri
c790: 63 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  c P1 * * * *.**.
c7a0: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
c7b0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
c7c0: 31 20 74 6f 20 62 65 20 6e 75 6d 65 72 69 63 20  1 to be numeric 
c7d0: 28 65 69 74 68 65 72 20 61 6e 0a 2a 2a 20 69 6e  (either an.** in
c7e0: 74 65 67 65 72 20 6f 72 20 61 20 66 6c 6f 61 74  teger or a float
c7f0: 69 6e 67 2d 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing-point number
c800: 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  .).** If the val
c810: 75 65 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c  ue is text or bl
c820: 6f 62 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65  ob, try to conve
c830: 72 74 20 69 74 20 74 6f 20 61 6e 20 75 73 69 6e  rt it to an usin
c840: 67 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c  g the.** equival
c850: 65 6e 74 20 6f 66 20 61 74 6f 69 28 29 20 6f 72  ent of atoi() or
c860: 20 61 74 6f 66 28 29 20 61 6e 64 20 73 74 6f 72   atof() and stor
c870: 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63  e 0 if no such c
c880: 6f 6e 76 65 72 73 69 6f 6e 20 0a 2a 2a 20 69 73  onversion .** is
c890: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a   possible..**.**
c8a0: 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73   A NULL value is
c8b0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20   not changed by 
c8c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49  this routine.  I
c8d0: 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a  t remains NULL..
c8e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 6f 4e 75 6d  */.case OP_ToNum
c8f0: 65 72 69 63 3a 20 7b 20 20 20 20 20 20 20 20 20  eric: {         
c900: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
c910: 20 61 73 20 54 4b 5f 54 4f 5f 4e 55 4d 45 52 49   as TK_TO_NUMERI
c920: 43 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  C, in1 */.  pIn1
c930: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
c940: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
c950: 4d 65 6d 4e 75 6d 65 72 69 66 79 28 70 49 6e 31  MemNumerify(pIn1
c960: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
c970: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c980: 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20  MIT_CAST */../* 
c990: 4f 70 63 6f 64 65 3a 20 54 6f 49 6e 74 20 50 31  Opcode: ToInt P1
c9a0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46   * * * *.**.** F
c9b0: 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69  orce the value i
c9c0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f  n register P1 to
c9d0: 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   be an integer. 
c9e0: 20 49 66 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65   If.** The value
c9f0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20   is currently a 
ca00: 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 64 72 6f  real number, dro
ca10: 70 20 69 74 73 20 66 72 61 63 74 69 6f 6e 61 6c  p its fractional
ca20: 20 70 61 72 74 2e 0a 2a 2a 20 49 66 20 74 68 65   part..** If the
ca30: 20 76 61 6c 75 65 20 69 73 20 74 65 78 74 20 6f   value is text o
ca40: 72 20 62 6c 6f 62 2c 20 74 72 79 20 74 6f 20 63  r blob, try to c
ca50: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 6e 20  onvert it to an 
ca60: 69 6e 74 65 67 65 72 20 75 73 69 6e 67 20 74 68  integer using th
ca70: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
ca80: 6f 66 20 61 74 6f 69 28 29 20 61 6e 64 20 73 74  of atoi() and st
ca90: 6f 72 65 20 30 20 69 66 20 6e 6f 20 73 75 63 68  ore 0 if no such
caa0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 70   conversion is p
cab0: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ossible..**.** A
cac0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e   NULL value is n
cad0: 6f 74 20 63 68 61 6e 67 65 64 20 62 79 20 74 68  ot changed by th
cae0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20  is routine.  It 
caf0: 72 65 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f  remains NULL..*/
cb00: 0a 63 61 73 65 20 4f 50 5f 54 6f 49 6e 74 3a 20  .case OP_ToInt: 
cb10: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
cb20: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
cb30: 5f 54 4f 5f 49 4e 54 2c 20 69 6e 31 20 2a 2f 0a  _TO_INT, in1 */.
cb40: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
cb50: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
cb60: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
cb70: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
cb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
cb90: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
cba0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
cbb0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
cbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 29  QLITE_OMIT_CAST)
cbd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
cbe0: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
cbf0: 47 5f 50 4f 49 4e 54 29 0a 2f 2a 20 4f 70 63 6f  G_POINT)./* Opco
cc00: 64 65 3a 20 54 6f 52 65 61 6c 20 50 31 20 2a 20  de: ToReal P1 * 
cc10: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63  * * *.**.** Forc
cc20: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
cc30: 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65  egister P1 to be
cc40: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
cc50: 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49 66 20  t number..** If 
cc60: 54 68 65 20 76 61 6c 75 65 20 69 73 20 63 75 72  The value is cur
cc70: 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65 67 65  rently an intege
cc80: 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e 0a 2a  r, convert it..*
cc90: 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69  * If the value i
cca0: 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c 20  s text or blob, 
ccb0: 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 69  try to convert i
ccc0: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
ccd0: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75  using the.** equ
cce0: 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69 28  ivalent of atoi(
ccf0: 29 20 61 6e 64 20 73 74 6f 72 65 20 30 2e 30 20  ) and store 0.0 
cd00: 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65  if no such conve
cd10: 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c  rsion is possibl
cd20: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20  e..**.** A NULL 
cd30: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61  value is not cha
cd40: 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  nged by this rou
cd50: 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e  tine.  It remain
cd60: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
cd70: 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20 20 20  OP_ToReal: {    
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd90: 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 52   same as TK_TO_R
cda0: 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  EAL, in1 */.  pI
cdb0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
cdc0: 70 31 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  p1];.  memAboutT
cdd0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
cde0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
cdf0: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
ce00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
ce10: 65 33 56 64 62 65 4d 65 6d 52 65 61 6c 69 66 79  e3VdbeMemRealify
ce20: 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72  (pIn1);.  }.  br
ce30: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
ce40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ce50: 5f 4f 4d 49 54 5f 43 41 53 54 29 20 26 26 20 21  _OMIT_CAST) && !
ce60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ce70: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
ce80: 4e 54 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  NT) */../* Opcod
ce90: 65 3a 20 4c 74 20 50 31 20 50 32 20 50 33 20 50  e: Lt P1 P2 P3 P
cea0: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61  4 P5.**.** Compa
ceb0: 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  re the values in
cec0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
ced0: 20 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29   P3.  If reg(P3)
cee0: 3c 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a  <reg(P1) then.**
cef0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
cf00: 20 50 32 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20   P2.  .**.** If 
cf10: 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  the SQLITE_JUMPI
cf20: 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20  FNULL bit of P5 
cf30: 69 73 20 73 65 74 20 61 6e 64 20 65 69 74 68 65  is set and eithe
cf40: 72 20 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20  r reg(P1) or.** 
cf50: 72 65 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20  reg(P3) is NULL 
cf60: 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
cf70: 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51 4c 49  mp.  If the SQLI
cf80: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a  TE_JUMPIFNULL .*
cf90: 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72 20 74  * bit is clear t
cfa0: 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
cfb0: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
cfc0: 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  nd is NULL..**.*
cfd0: 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46 46  * The SQLITE_AFF
cfe0: 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f 66  _MASK portion of
cff0: 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20 61   P5 must be an a
d000: 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74 65  ffinity characte
d010: 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  r -.** SQLITE_AF
d020: 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f 41  F_TEXT, SQLITE_A
d030: 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64 20  FF_INTEGER, and 
d040: 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74 74  so forth. An att
d050: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a 2a  empt is made .**
d060: 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68 20   to coerce both 
d070: 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e 67  inputs according
d080: 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69 74   to this affinit
d090: 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20  y before the.** 
d0a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
d0b0: 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49 54  de. If the SQLIT
d0c0: 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30 78  E_AFF_MASK is 0x
d0d0: 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  00, then numeric
d0e0: 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73 20  .** affinity is 
d0f0: 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  used. Note that 
d100: 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e  the affinity con
d110: 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74 6f  versions are sto
d120: 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f  red.** back into
d130: 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73   the input regis
d140: 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 20  ters P1 and P3. 
d150: 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65 20   So this opcode 
d160: 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65 72  can cause.** per
d170: 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73 20  sistent changes 
d180: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31 20  to registers P1 
d190: 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  and P3..**.** On
d1a0: 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69 6f  ce any conversio
d1b0: 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c  ns have taken pl
d1c0: 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65 72  ace, and neither
d1d0: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
d1e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
d1f0: 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66 20  re compared. If 
d200: 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20  both values are 
d210: 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63 6d  blobs then memcm
d220: 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  p() is.** used t
d230: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
d240: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
d250: 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 62  omparison.  If b
d260: 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  oth values.** ar
d270: 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68 65  e text, then the
d280: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
d290: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
d2a0: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a 20  specified in.** 
d2b0: 50 34 20 69 73 20 20 75 73 65 64 20 74 6f 20 64  P4 is  used to d
d2c0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
d2d0: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
d2e0: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
d2f0: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
d300: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
d310: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
d320: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
d330: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
d340: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
d350: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
d360: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
d370: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
d380: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
d390: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
d3a0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
d3b0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
d3c0: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
d3d0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
d3e0: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
d3f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52   the SQLITE_STOR
d400: 45 50 32 20 62 69 74 20 6f 66 20 50 35 20 69 73  EP2 bit of P5 is
d410: 20 73 65 74 2c 20 74 68 65 6e 20 64 6f 20 6e 6f   set, then do no
d420: 74 20 6a 75 6d 70 2e 20 20 49 6e 73 74 65 61 64  t jump.  Instead
d430: 2c 0a 2a 2a 20 73 74 6f 72 65 20 61 20 62 6f 6f  ,.** store a boo
d440: 6c 65 61 6e 20 72 65 73 75 6c 74 20 28 65 69 74  lean result (eit
d450: 68 65 72 20 30 2c 20 6f 72 20 31 2c 20 6f 72 20  her 0, or 1, or 
d460: 4e 55 4c 4c 29 20 69 6e 20 72 65 67 69 73 74 65  NULL) in registe
d470: 72 20 50 32 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  r P2..*/./* Opco
d480: 64 65 3a 20 4e 65 20 50 31 20 50 32 20 50 33 20  de: Ne P1 P2 P3 
d490: 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73  P4 P5.**.** This
d4a0: 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
d4b0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65   the Lt opcode e
d4c0: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a  xcept that the j
d4d0: 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a  ump is taken if.
d4e0: 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20  ** the operands 
d4f0: 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31 20  in registers P1 
d500: 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20 65  and P3 are not e
d510: 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20 4c  qual.  See the L
d520: 74 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a 20  t opcode for.** 
d530: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
d540: 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  mation..**.** If
d550: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
d560: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
d570: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
d580: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
d590: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
d5a0: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
d5b0: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
d5c0: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
d5d0: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
d5e0: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
d5f0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 66 61  comparison is fa
d600: 6c 73 65 2e 20 20 49 66 20 65 69 74 68 65 72 20  lse.  If either 
d610: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
d620: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
d630: 69 73 20 74 72 75 65 2e 0a 2a 2a 20 49 66 20 6e  is true..** If n
d640: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
d650: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
d660: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
d670: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
d680: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
d690: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
d6a0: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
d6b0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71  */./* Opcode: Eq
d6c0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
d6d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
d6e0: 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c   just like the L
d6f0: 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20  t opcode except 
d700: 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73  that the jump is
d710: 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65   taken if.** the
d720: 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67   operands in reg
d730: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
d740: 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 20 53   are equal..** S
d750: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
d760: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
d770: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
d780: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c  ** If SQLITE_NUL
d790: 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35  LEQ is set in P5
d7a0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
d7b0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
d7c0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a  s always either.
d7d0: 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  ** true or false
d7e0: 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55   and is never NU
d7f0: 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65  LL.  If both ope
d800: 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74  rands are NULL t
d810: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
d820: 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  * of comparison 
d830: 69 73 20 74 72 75 65 2e 20 20 49 66 20 65 69 74  is true.  If eit
d840: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
d850: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
d860: 75 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ult is false..**
d870: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72   If neither oper
d880: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20  and is NULL the 
d890: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61  result is the sa
d8a0: 6d 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62  me as it would b
d8b0: 65 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e if.** the SQLI
d8c0: 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77  TE_NULLEQ flag w
d8d0: 65 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  ere omitted from
d8e0: 20 50 35 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64   P5..*/./* Opcod
d8f0: 65 3a 20 4c 65 20 50 31 20 50 32 20 50 33 20 50  e: Le P1 P2 P3 P
d900: 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
d910: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
d920: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
d930: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
d940: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
d950: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
d960: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
d970: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
d980: 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  al to the conten
d990: 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72  t of.** register
d9a0: 20 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74   P1.  See the Lt
d9b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69   opcode for addi
d9c0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
d9d0: 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  on..*/./* Opcode
d9e0: 3a 20 47 74 20 50 31 20 50 32 20 50 33 20 50 34  : Gt P1 P2 P3 P4
d9f0: 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77   P5.**.** This w
da00: 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74  orks just like t
da10: 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63  he Lt opcode exc
da20: 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d  ept that the jum
da30: 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a  p is taken if.**
da40: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
da50: 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 67  register P3 is g
da60: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
da70: 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65  content of.** re
da80: 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65 20  gister P1.  See 
da90: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f  the Lt opcode fo
daa0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
dab0: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  ormation..*/./* 
dac0: 4f 70 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32  Opcode: Ge P1 P2
dad0: 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
dae0: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
daf0: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
db00: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
db10: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
db20: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
db30: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
db40: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
db50: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
db60: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
db70: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
db80: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
db90: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
dba0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
dbb0: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20  ase OP_Eq:      
dbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
dbd0: 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c   as TK_EQ, jump,
dbe0: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
dbf0: 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20  e OP_Ne:        
dc00: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
dc10: 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69  s TK_NE, jump, i
dc20: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
dc30: 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Lt:          
dc40: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dc50: 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LT, jump, in1
dc60: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
dc70: 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Le:            
dc80: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
dc90: 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LE, jump, in1, 
dca0: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
dcb0: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
dcc0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
dcd0: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
dce0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a  3 */.case OP_Ge:
dcf0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
dd00: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c  * same as TK_GE,
dd10: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
dd20: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20  */.  int res;   
dd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
dd40: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
dd50: 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61  ison of pIn1 aga
dd60: 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63  inst pIn3 */.  c
dd70: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
dd80: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
dd90: 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
dda0: 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  ison */.  u16 fl
ddb0: 61 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags1;         /*
ddc0: 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   Copy of initial
ddd0: 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e   value of pIn1->
dde0: 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66  flags */.  u16 f
ddf0: 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f  lags3;         /
de00: 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  * Copy of initia
de10: 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d  l value of pIn3-
de20: 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e  >flags */..  pIn
de30: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
de40: 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
de50: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
de60: 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c  lags1 = pIn1->fl
de70: 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20  ags;.  flags3 = 
de80: 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn3->flags;.  i
de90: 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61  f( (flags1 | fla
dea0: 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs3)&MEM_Null ){
deb0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62  .    /* One or b
dec0: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
ded0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
dee0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
def0: 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20  E_NULLEQ ){.    
df00: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e    /* If SQLITE_N
df10: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77 68  ULLEQ is set (wh
df20: 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ich will only ha
df30: 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65 72  ppen if the oper
df40: 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ator is.      **
df50: 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29   OP_Eq or OP_Ne)
df60: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
df70: 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ump or not depen
df80: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
df90: 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20        ** or not 
dfa0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
dfb0: 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  e null..      */
dfc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dfd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
dfe0: 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  q || pOp->opcode
dff0: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
e000: 20 72 65 73 20 3d 20 28 66 6c 61 67 73 31 20 26   res = (flags1 &
e010: 20 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 4e 75   flags3 & MEM_Nu
e020: 6c 6c 29 3d 3d 30 3b 0a 20 20 20 20 7d 65 6c 73  ll)==0;.    }els
e030: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  e{.      /* SQLI
e040: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65  TE_NULLEQ is cle
e050: 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ar and at least 
e060: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
e070: 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ULL,.      ** th
e080: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
e090: 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20   always NULL..  
e0a0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20      ** The jump 
e0b0: 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
e0c0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
e0d0: 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20 20  L bit is set..  
e0e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
e0f0: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
e100: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
e110: 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65       pOut = &aMe
e120: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
e130: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
e140: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  ag(pOut, MEM_Nul
e150: 6c 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49  l);.        REGI
e160: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
e170: 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20  p2, pOut);.     
e180: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
e190: 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
e1a0: 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
e1b0: 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31    pc = pOp->p2-1
e1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e1e0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69  else{.    /* Nei
e1f0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
e200: 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70  NULL.  Do a comp
e210: 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61  arison. */.    a
e220: 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
e230: 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  5 & SQLITE_AFF_M
e240: 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ASK;.    if( aff
e250: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 61  inity ){.      a
e260: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
e270: 31 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63  1, affinity, enc
e280: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 70  oding);.      ap
e290: 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e 33  plyAffinity(pIn3
e2a0: 2c 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f  , affinity, enco
e2b0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 69 66 28  ding);.      if(
e2c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e2d0: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
e2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
e2f0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
e300: 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70  =P4_COLLSEQ || p
e310: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20  Op->p4.pColl==0 
e320: 29 3b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f  );.    ExpandBlo
e330: 62 28 70 49 6e 31 29 3b 0a 20 20 20 20 45 78 70  b(pIn1);.    Exp
e340: 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a 20  andBlob(pIn3);. 
e350: 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
e360: 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c  MemCompare(pIn3,
e370: 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70   pIn1, pOp->p4.p
e380: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 77 69  Coll);.  }.  swi
e390: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
e3a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f   ){.    case OP_
e3b0: 45 71 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73  Eq:    res = res
e3c0: 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ==0;     break;.
e3d0: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a 20      case OP_Ne: 
e3e0: 20 20 20 72 65 73 20 3d 20 72 65 73 21 3d 30 3b     res = res!=0;
e3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e400: 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 72  case OP_Lt:    r
e410: 65 73 20 3d 20 72 65 73 3c 30 3b 20 20 20 20 20  es = res<0;     
e420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e430: 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65 73 20 3d   OP_Le:    res =
e440: 20 72 65 73 3c 3d 30 3b 20 20 20 20 20 62 72 65   res<=0;     bre
e450: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f  ak;.    case OP_
e460: 47 74 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73  Gt:    res = res
e470: 3e 30 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  >0;      break;.
e480: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
e490: 20 20 20 72 65 73 20 3d 20 72 65 73 3e 3d 30 3b     res = res>=0;
e4a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
e4b0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26  .  if( pOp->p5 &
e4c0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
e4d0: 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61  ){.    pOut = &a
e4e0: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
e4f0: 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
e500: 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20  ge(p, pOut);.   
e510: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
e520: 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
e530: 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
e540: 72 65 73 3b 0a 20 20 20 20 52 45 47 49 53 54 45  res;.    REGISTE
e550: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
e560: 20 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 20   pOut);.  }else 
e570: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70  if( res ){.    p
e580: 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20  c = pOp->p2-1;. 
e590: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20 61 6e   }..  /* Undo an
e5a0: 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  y changes made b
e5b0: 79 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28  y applyAffinity(
e5c0: 29 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  ) to the input r
e5d0: 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 70  egisters. */.  p
e5e0: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 28 70 49  In1->flags = (pI
e5f0: 6e 31 2d 3e 66 6c 61 67 73 26 7e 4d 45 4d 5f 54  n1->flags&~MEM_T
e600: 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67  ypeMask) | (flag
e610: 73 31 26 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  s1&MEM_TypeMask)
e620: 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  ;.  pIn3->flags 
e630: 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 26 7e  = (pIn3->flags&~
e640: 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
e650: 28 66 6c 61 67 73 33 26 4d 45 4d 5f 54 79 70 65  (flags3&MEM_Type
e660: 4d 61 73 6b 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  Mask);.  break;.
e670: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65  }../* Opcode: Pe
e680: 72 6d 75 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20  rmutation * * * 
e690: 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  P4 *.**.** Set t
e6a0: 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
e6b0: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 43 6f  sed by the OP_Co
e6c0: 6d 70 61 72 65 20 6f 70 65 72 61 74 6f 72 20 74  mpare operator t
e6d0: 6f 20 62 65 20 74 68 65 20 61 72 72 61 79 0a 2a  o be the array.*
e6e0: 2a 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  * of integers in
e6f0: 20 50 34 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70   P4..**.** The p
e700: 65 72 6d 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e  ermutation is on
e710: 6c 79 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ly valid until t
e720: 68 65 20 6e 65 78 74 20 4f 50 5f 50 65 72 6d 75  he next OP_Permu
e730: 74 61 74 69 6f 6e 2c 20 4f 50 5f 43 6f 6d 70 61  tation, OP_Compa
e740: 72 65 2c 0a 2a 2a 20 4f 50 5f 48 61 6c 74 2c 20  re,.** OP_Halt, 
e750: 6f 72 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2e  or OP_ResultRow.
e760: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 65 20    Typically the 
e770: 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 20 73  OP_Permutation s
e780: 68 6f 75 6c 64 20 6f 63 63 75 72 0a 2a 2a 20 69  hould occur.** i
e790: 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 69 6f 72  mmediately prior
e7a0: 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   to the OP_Compa
e7b0: 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50  re..*/.case OP_P
e7c0: 65 72 6d 75 74 61 74 69 6f 6e 3a 20 7b 0a 20 20  ermutation: {.  
e7d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
e7e0: 79 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59  ype==P4_INTARRAY
e7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
e800: 70 2d 3e 70 34 2e 61 69 20 29 3b 0a 20 20 61 50  p->p4.ai );.  aP
e810: 65 72 6d 75 74 65 20 3d 20 70 4f 70 2d 3e 70 34  ermute = pOp->p4
e820: 2e 61 69 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .ai;.  break;.}.
e830: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6d 70  ./* Opcode: Comp
e840: 61 72 65 20 50 31 20 50 32 20 50 33 20 50 34 20  are P1 P2 P3 P4 
e850: 2a 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  *.**.** Compare 
e860: 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
e870: 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
e880: 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
e890: 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
e8a0: 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
e8b0: 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
e8c0: 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
e8d0: 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
e8e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
e8f0: 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
e900: 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
e910: 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
e920: 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66  * P4 is a KeyInf
e930: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
e940: 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69   defines collati
e950: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64  ng sequences and
e960: 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20   sort.** orders 
e970: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
e980: 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61  on.  The permuta
e990: 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20  tion applies to 
e9a0: 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c  registers.** onl
e9b0: 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  y.  The KeyInfo 
e9c0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65  elements are use
e9d0: 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a  d sequentially..
e9e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72  **.** The compar
e9f0: 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63  ison is a sort c
ea00: 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55  omparison, so NU
ea10: 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61  LLs compare equa
ea20: 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20  l,.** NULLs are 
ea30: 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72  less than number
ea40: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c  s, numbers are l
ea50: 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73  ess than strings
ea60: 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73  ,.** and strings
ea70: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62   are less than b
ea80: 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  lobs..*/.case OP
ea90: 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e  _Compare: {.  in
eaa0: 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t n;.  int i;.  
eab0: 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32  int p1;.  int p2
eac0: 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66  ;.  const KeyInf
ead0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
eae0: 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65  nt idx;.  CollSe
eaf0: 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20  q *pColl;    /* 
eb00: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
eb10: 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69  ce to use on thi
eb20: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  s term */.  int 
eb30: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
eb40: 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45  * True for DESCE
eb50: 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72  NDING sort order
eb60: 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e   */..  n = pOp->
eb70: 70 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  p3;.  pKeyInfo =
eb80: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
eb90: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  o;.  assert( n>0
eba0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
ebb0: 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70  eyInfo!=0 );.  p
ebc0: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  1 = pOp->p1;.  p
ebd0: 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66  2 = pOp->p2;.#if
ebe0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ebf0: 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
ec00: 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20      int k, mx = 
ec10: 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
ec20: 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50  k<n; k++) if( aP
ec30: 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d  ermute[k]>mx ) m
ec40: 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b  x = aPermute[k];
ec50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
ec60: 30 20 26 26 20 70 31 2b 6d 78 3c 3d 70 2d 3e 6e  0 && p1+mx<=p->n
ec70: 4d 65 6d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  Mem+1 );.    ass
ec80: 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
ec90: 6d 78 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  mx<=p->nMem+1 );
eca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ecb0: 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70 31  sert( p1>0 && p1
ecc0: 2b 6e 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  +n<=p->nMem+1 );
ecd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
ece0: 30 20 26 26 20 70 32 2b 6e 3c 3d 70 2d 3e 6e 4d  0 && p2+n<=p->nM
ecf0: 65 6d 2b 31 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  em+1 );.  }.#end
ed00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
ed10: 55 47 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  UG */.  for(i=0;
ed20: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
ed30: 69 64 78 20 3d 20 61 50 65 72 6d 75 74 65 20 3f  idx = aPermute ?
ed40: 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3a 20 69   aPermute[i] : i
ed50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
ed60: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
ed70: 31 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 61  1+idx]) );.    a
ed80: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
ed90: 64 28 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29  d(&aMem[p2+idx])
eda0: 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
edb0: 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20 26  _TRACE(p1+idx, &
edc0: 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 3b 0a 20  aMem[p1+idx]);. 
edd0: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
ede0: 45 28 70 32 2b 69 64 78 2c 20 26 61 4d 65 6d 5b  E(p2+idx, &aMem[
edf0: 70 32 2b 69 64 78 5d 29 3b 0a 20 20 20 20 61 73  p2+idx]);.    as
ee00: 73 65 72 74 28 20 69 3c 70 4b 65 79 49 6e 66 6f  sert( i<pKeyInfo
ee10: 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 20 20 20 20  ->nField );.    
ee20: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
ee30: 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  ->aColl[i];.    
ee40: 62 52 65 76 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  bRev = pKeyInfo-
ee50: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a  >aSortOrder[i];.
ee60: 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 73      iCompare = s
ee70: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
ee80: 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 2c 20  (&aMem[p1+idx], 
ee90: 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70  &aMem[p2+idx], p
eea0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 69  Coll);.    if( i
eeb0: 43 6f 6d 70 61 72 65 20 29 7b 0a 20 20 20 20 20  Compare ){.     
eec0: 20 69 66 28 20 62 52 65 76 20 29 20 69 43 6f 6d   if( bRev ) iCom
eed0: 70 61 72 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65  pare = -iCompare
eee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d     }.  }.  aPerm
ef00: 75 74 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  ute = 0;.  break
ef10: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
ef20: 4a 75 6d 70 20 50 31 20 50 32 20 50 33 20 2a 20  Jump P1 P2 P3 * 
ef30: 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  *.**.** Jump to 
ef40: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
ef50: 61 74 20 61 64 64 72 65 73 73 20 50 31 2c 20 50  at address P1, P
ef60: 32 2c 20 6f 72 20 50 33 20 64 65 70 65 6e 64 69  2, or P3 dependi
ef70: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a  ng on whether.**
ef80: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
ef90: 65 6e 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69  ent OP_Compare i
efa0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 50  nstruction the P
efb0: 31 20 76 65 63 74 6f 72 20 77 61 73 20 6c 65 73  1 vector was les
efc0: 73 20 74 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20  s than.** equal 
efd0: 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
efe0: 68 61 6e 20 74 68 65 20 50 32 20 76 65 63 74 6f  han the P2 vecto
eff0: 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  r, respectively.
f000: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70  .*/.case OP_Jump
f010: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
f020: 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28  /* jump */.  if(
f030: 20 69 43 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20   iCompare<0 ){. 
f040: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 31 20     pc = pOp->p1 
f050: 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  - 1;.  }else if(
f060: 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a   iCompare==0 ){.
f070: 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
f080: 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 1;.  }else{. 
f090: 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 33 20     pc = pOp->p3 
f0a0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
f0b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
f0c0: 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
f0d0: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
f0e0: 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74  logical AND of t
f0f0: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
f100: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 32  isters P1 and P2
f110: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68   and.** write th
f120: 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65  e result into re
f130: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
f140: 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
f150: 20 50 32 20 69 73 20 30 20 28 66 61 6c 73 65 29   P2 is 0 (false)
f160: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
f170: 20 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a   is 0 even if.**
f180: 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74   the other input
f190: 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c   is NULL.  A NUL
f1a0: 4c 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77  L and true or tw
f1b0: 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20  o NULLs give.** 
f1c0: 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a  a NULL output..*
f1d0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20  /./* Opcode: Or 
f1e0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
f1f0: 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67 69  ** Take the logi
f200: 63 61 6c 20 4f 52 20 6f 66 20 74 68 65 20 76 61  cal OR of the va
f210: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f220: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
f230: 2a 20 73 74 6f 72 65 20 74 68 65 20 61 6e 73 77  * store the answ
f240: 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
f250: 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  3..**.** If eith
f260: 65 72 20 50 31 20 6f 72 20 50 32 20 69 73 20 6e  er P1 or P2 is n
f270: 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29 20 74 68  onzero (true) th
f280: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
f290: 20 31 20 28 74 72 75 65 29 0a 2a 2a 20 65 76 65   1 (true).** eve
f2a0: 6e 20 69 66 20 74 68 65 20 6f 74 68 65 72 20 69  n if the other i
f2b0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
f2c0: 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20   NULL and false 
f2d0: 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20  or two NULLs.** 
f2e0: 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70  give a NULL outp
f2f0: 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ut..*/.case OP_A
f300: 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd:             
f310: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 41   /* same as TK_A
f320: 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  ND, in1, in2, ou
f330: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72  t3 */.case OP_Or
f340: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
f350: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52  /* same as TK_OR
f360: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
f370: 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b 20 20 20   */.  int v1;   
f380: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
f390: 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  :  0==FALSE, 1==
f3a0: 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
f3b0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
f3c0: 74 20 76 32 3b 20 20 20 20 2f 2a 20 52 69 67 68  t v2;    /* Righ
f3d0: 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d 3d 46 41  t operand: 0==FA
f3e0: 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
f3f0: 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
f400: 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   */..  pIn1 = &a
f410: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
f420: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
f430: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
f440: 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c 73    v1 = 2;.  }els
f450: 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  e{.    v1 = sqli
f460: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
f470: 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20 20  pIn1)!=0;.  }.  
f480: 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
f490: 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e  ->p2];.  if( pIn
f4a0: 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  2->flags & MEM_N
f4b0: 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32 20 3d 20  ull ){.    v2 = 
f4c0: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
f4d0: 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  v2 = sqlite3Vdbe
f4e0: 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 21 3d  IntValue(pIn2)!=
f4f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
f500: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64  ->opcode==OP_And
f510: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
f520: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f530: 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d  ar and_logic[] =
f540: 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31   { 0, 0, 0, 0, 1
f550: 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20 7d 3b 0a  , 2, 0, 2, 2 };.
f560: 20 20 20 20 76 31 20 3d 20 61 6e 64 5f 6c 6f 67      v1 = and_log
f570: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
f580: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
f590: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f5a0: 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20  char or_logic[] 
f5b0: 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 31 2c 20  = { 0, 1, 2, 1, 
f5c0: 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32 20 7d 3b  1, 1, 2, 1, 2 };
f5d0: 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f 6c 6f 67  .    v1 = or_log
f5e0: 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d  ic[v1*3+v2];.  }
f5f0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
f600: 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
f610: 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d  v1==2 ){.    Mem
f620: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
f630: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  , MEM_Null);.  }
f640: 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  else{.    pOut->
f650: 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65  u.i = v1;.    Me
f660: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
f670: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
f680: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
f690: 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50  Opcode: Not P1 P
f6a0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e  2 * * *.**.** In
f6b0: 74 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75  terpret the valu
f6c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
f6d0: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
f6e0: 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a  lue.  Store the.
f6f0: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c  ** boolean compl
f700: 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ement in registe
f710: 72 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61  r P2.  If the va
f720: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
f730: 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20  P1 is .** NULL, 
f740: 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73  then a NULL is s
f750: 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a  tored in P2..*/.
f760: 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20  case OP_Not: {  
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f780: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c   same as TK_NOT,
f790: 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
f7a0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
f7b0: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
f7c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
f7d0: 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67    if( pIn1->flag
f7e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
f7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
f800: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
f810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
f820: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
f830: 6e 74 36 34 28 70 4f 75 74 2c 20 21 73 71 6c 69  nt64(pOut, !sqli
f840: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
f850: 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20 20 62 72  pIn1));.  }.  br
f860: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
f870: 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32 20  e: BitNot P1 P2 
f880: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  * * *.**.** Inte
f890: 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e  rpret the conten
f8a0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  t of register P1
f8b0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   as an integer. 
f8c0: 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e   Store the.** on
f8d0: 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66  es-complement of
f8e0: 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e   the P1 value in
f8f0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
f900: 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20   If P1 holds.** 
f910: 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  a NULL then stor
f920: 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a  e a NULL in P2..
f930: 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f  */.case OP_BitNo
f940: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
f950: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
f960: 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32  ITNOT, in1, out2
f970: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
f980: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
f990: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
f9a0: 3e 70 32 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31  >p2];.  if( pIn1
f9b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
f9c0: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
f9d0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
f9e0: 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pOut);.  }else{.
f9f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
fa00: 65 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c  emSetInt64(pOut,
fa10: 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74   ~sqlite3VdbeInt
fa20: 56 61 6c 75 65 28 70 49 6e 31 29 29 3b 0a 20 20  Value(pIn1));.  
fa30: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
fa40: 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50   Opcode: If P1 P
fa50: 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a  2 P3 * *.**.** J
fa60: 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65  ump to P2 if the
fa70: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
fa80: 65 72 20 50 31 20 69 73 20 74 72 75 65 2e 20 20  er P1 is true.  
fa90: 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  The value.** is 
faa0: 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65 20  considered true 
fab0: 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63  if it is numeric
fac0: 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20   and non-zero.  
fad0: 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
fae0: 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
faf0: 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
fb00: 20 69 66 20 50 33 20 69 73 20 74 72 75 65 2e 0a   if P3 is true..
fb10: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  */./* Opcode: If
fb20: 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Not P1 P2 P3 * *
fb30: 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
fb40: 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
fb50: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
fb60: 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c   False.  The val
fb70: 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
fb80: 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20 68  red true if it h
fb90: 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  as a numeric val
fba0: 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20  ue of zero.  If 
fbb0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
fbc0: 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
fbd0: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
fbe0: 20 50 33 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   P3 is true..*/.
fbf0: 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20  case OP_If:     
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a              /* j
fc10: 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65  ump, in1 */.case
fc20: 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20   OP_IfNot: {    
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
fc40: 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b   in1 */.  int c;
fc50: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
fc60: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20  pOp->p1];.  if( 
fc70: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
fc80: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20  M_Null ){.    c 
fc90: 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c  = pOp->p3;.  }el
fca0: 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
fcb0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
fcc0: 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71  POINT.    c = sq
fcd0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
fce0: 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73  e(pIn1)!=0;.#els
fcf0: 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  e.    c = sqlite
fd00: 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70  3VdbeRealValue(p
fd10: 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69  In1)!=0.0;.#endi
fd20: 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  f.    if( pOp->o
fd30: 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20  pcode==OP_IfNot 
fd40: 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20  ) c = !c;.  }.  
fd50: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63 20  if( c ){.    pc 
fd60: 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20 7d  = pOp->p2-1;.  }
fd70: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
fd80: 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
fd90: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
fda0: 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
fdb0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
fdc0: 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e  ster P1 is NULL.
fdd0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75  .*/.case OP_IsNu
fde0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
fdf0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49   /* same as TK_I
fe00: 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31  SNULL, jump, in1
fe10: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
fe20: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
fe30: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
fe40: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
fe50: 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
fe60: 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
fe70: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
fe80: 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32  e: NotNull P1 P2
fe90: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d   * * *.**.** Jum
fea0: 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76  p to P2 if the v
feb0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
fec0: 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   P1 is not NULL.
fed0: 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f    .*/.case OP_No
fee0: 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20  tNull: {        
fef0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ff00: 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  K_NOTNULL, jump,
ff10: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
ff20: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
ff30: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
ff40: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
ff50: 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70  =0 ){.    pc = p
ff60: 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
ff70: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
ff80: 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
ff90: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
ffa0: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65  ** Interpret the
ffb0: 20 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f   data that curso
ffc0: 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61  r P1 points to a
ffd0: 73 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75  s a structure bu
ffe0: 69 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  ilt using.** the
fff0: 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
10000 72 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74  ruction.  (See t
10010 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  he MakeRecord op
10020 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
10030 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  nal.** informati
10040 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72  on about the for
10050 6d 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e  mat of the data.
10060 29 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50  )  Extract the P
10070 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66  2-th column.** f
10080 72 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e  rom this record.
10090 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c    If there are l
100a0 65 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20  ess that (P2+1) 
100b0 0a 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68  .** values in th
100c0 65 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63  e record, extrac
100d0 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  t a NULL..**.** 
100e0 54 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63  The value extrac
100f0 74 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ted is stored in
10100 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
10110 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d  .** If the colum
10120 6e 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  n contains fewer
10130 20 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c   than P2 fields,
10140 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20   then extract a 
10150 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66  NULL.  Or,.** if
10160 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74   the P4 argument
10170 20 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65   is a P4_MEM use
10180 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
10190 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73  e P4 argument as
101a0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  .** the result..
101b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46  **.** If the OPF
101c0 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62  LAG_CLEARCACHE b
101d0 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20  it is set on P5 
101e0 61 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75  and P1 is a pseu
101f0 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  do-table cursor,
10200 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63  .** then the cac
10210 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  he of the cursor
10220 20 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20   is reset prior 
10230 74 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68  to extracting th
10240 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  e column..** The
10250 20 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e   first OP_Column
10260 20 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64   against a pseud
10270 6f 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68  o-table after th
10280 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
10290 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74  ontent.** regist
102a0 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73  er has changed s
102b0 68 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20  hould have this 
102c0 62 69 74 20 73 65 74 2e 0a 2a 2f 0a 63 61 73 65  bit set..*/.case
102d0 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
102e0 75 33 32 20 70 61 79 6c 6f 61 64 53 69 7a 65 3b  u32 payloadSize;
102f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10300 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 65 63  bytes in the rec
10310 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 70 61 79  ord */.  i64 pay
10320 6c 6f 61 64 53 69 7a 65 36 34 3b 20 2f 2a 20 4e  loadSize64; /* N
10330 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10340 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
10350 20 20 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20    int p1;       
10360 20 20 20 20 20 2f 2a 20 50 31 20 76 61 6c 75 65       /* P1 value
10370 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 2a   of the opcode *
10380 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20  /.  int p2;     
10390 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e         /* column
103a0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69   number to retri
103b0 65 76 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  eve */.  VdbeCur
103c0 73 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54  sor *pC;    /* T
103d0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a  he VDBE cursor *
103e0 2f 0a 20 20 63 68 61 72 20 2a 7a 52 65 63 3b 20  /.  char *zRec; 
103f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10400 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 72 65  r to complete re
10410 63 6f 72 64 2d 64 61 74 61 20 2a 2f 0a 20 20 42  cord-data */.  B
10420 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 20  tCursor *pCrsr; 
10430 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 63    /* The BTree c
10440 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20 2a  ursor */.  u32 *
10450 61 54 79 70 65 3b 20 20 20 20 20 20 20 20 2f 2a  aType;        /*
10460 20 61 54 79 70 65 5b 69 5d 20 68 6f 6c 64 73 20   aType[i] holds 
10470 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
10480 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   of the i-th col
10490 75 6d 6e 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f  umn */.  u32 *aO
104a0 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 61  ffset;      /* a
104b0 4f 66 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 66  Offset[i] is off
104c0 73 65 74 20 74 6f 20 73 74 61 72 74 20 6f 66 20  set to start of 
104d0 64 61 74 61 20 66 6f 72 20 69 2d 74 68 20 63 6f  data for i-th co
104e0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  lumn */.  int nF
104f0 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  ield;        /* 
10500 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
10510 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a   in the record *
10520 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20  /.  int len;    
10530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
10540 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 72 69  ngth of the seri
10550 61 6c 69 7a 65 64 20 64 61 74 61 20 66 6f 72 20  alized data for 
10560 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
10570 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10580 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10590 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  er */.  char *zD
105a0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  ata;       /* Pa
105b0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
105c0 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
105d0 2f 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20  /.  Mem *pDest; 
105e0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
105f0 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74  to write the ext
10600 72 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a  racted value */.
10610 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20    Mem sMem;     
10620 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72       /* For stor
10630 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62  ing the record b
10640 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
10650 20 20 75 38 20 2a 7a 49 64 78 3b 20 20 20 20 20    u8 *zIdx;     
10660 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
10670 74 6f 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  to header */.  u
10680 38 20 2a 7a 45 6e 64 48 64 72 3b 20 20 20 20 20  8 *zEndHdr;     
10690 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
106a0 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
106b0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
106c0 20 75 33 32 20 6f 66 66 73 65 74 3b 20 20 20 20   u32 offset;    
106d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
106e0 74 6f 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  to the data */. 
106f0 20 75 33 32 20 73 7a 46 69 65 6c 64 3b 20 20 20   u32 szField;   
10700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10710 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 6f   bytes in the co
10720 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 65 6c 64  ntent of a field
10730 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 48 64 72 3b   */.  int szHdr;
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10750 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 73   of the header s
10760 69 7a 65 20 66 69 65 6c 64 20 61 74 20 73 74 61  ize field at sta
10770 72 74 20 6f 66 20 72 65 63 6f 72 64 20 2a 2f 0a  rt of record */.
10780 20 20 69 6e 74 20 61 76 61 69 6c 3b 20 20 20 20    int avail;    
10790 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
107a0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
107b0 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20 4d  able data */.  M
107c0 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20  em *pReg;       
107d0 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65    /* PseudoTable
107e0 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 20   input register 
107f0 2a 2f 0a 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d  */...  p1 = pOp-
10800 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  >p1;.  p2 = pOp-
10810 3e 70 32 3b 0a 20 20 70 43 20 3d 20 30 3b 0a 20  >p2;.  pC = 0;. 
10820 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30   memset(&sMem, 0
10830 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b  , sizeof(sMem));
10840 0a 20 20 61 73 73 65 72 74 28 20 70 31 3c 70 2d  .  assert( p1<p-
10850 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
10860 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
10870 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
10880 4d 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d  Mem );.  pDest =
10890 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
108a0 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
108b0 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20  nge(p, pDest);. 
108c0 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
108d0 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  pDest, MEM_Null)
108e0 3b 0a 20 20 7a 52 65 63 20 3d 20 30 3b 0a 0a 20  ;.  zRec = 0;.. 
108f0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
10900 65 74 73 20 74 68 65 20 76 61 72 69 61 62 6c 65  ets the variable
10910 20 70 61 79 6c 6f 61 64 53 69 7a 65 20 74 6f 20   payloadSize to 
10920 62 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  be the total num
10930 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 79 74 65  ber of.  ** byte
10940 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2e  s in the record.
10950 0a 20 20 2a 2a 0a 20 20 2a 2a 20 7a 52 65 63 20  .  **.  ** zRec 
10960 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68 65  is set to be the
10970 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10980 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 66 20  f the record if 
10990 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
109a0 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  ** The comple
109b0 74 65 20 72 65 63 6f 72 64 20 74 65 78 74 20 69  te record text i
109c0 73 20 61 6c 77 61 79 73 20 61 76 61 69 6c 61 62  s always availab
109d0 6c 65 20 66 6f 72 20 70 73 65 75 64 6f 2d 74 61  le for pseudo-ta
109e0 62 6c 65 73 0a 20 20 2a 2a 20 49 66 20 74 68 65  bles.  ** If the
109f0 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65   record is store
10a00 64 20 69 6e 20 61 20 63 75 72 73 6f 72 2c 20 74  d in a cursor, t
10a10 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f  he complete reco
10a20 72 64 20 74 65 78 74 0a 20 20 2a 2a 20 6d 69 67  rd text.  ** mig
10a30 68 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20  ht be available 
10a40 69 6e 20 74 68 65 20 20 70 43 2d 3e 61 52 6f 77  in the  pC->aRow
10a50 20 63 61 63 68 65 2e 20 20 4f 72 20 69 74 20 6d   cache.  Or it m
10a60 69 67 68 74 20 6e 6f 74 20 62 65 2e 0a 20 20 2a  ight not be..  *
10a70 2a 20 49 66 20 74 68 65 20 64 61 74 61 20 69 73  * If the data is
10a80 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20 20 7a   unavailable,  z
10a90 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Rec is set to NU
10aa0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  LL..  **.  ** We
10ab0 20 61 6c 73 6f 20 63 6f 6d 70 75 74 65 20 74 68   also compute th
10ac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10ad0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72  mns in the recor
10ae0 64 2e 20 20 46 6f 72 20 63 75 72 73 6f 72 73 2c  d.  For cursors,
10af0 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
10b00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 73   of columns is s
10b10 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
10b20 65 43 75 72 73 6f 72 2e 6e 46 69 65 6c 64 20 65  eCursor.nField e
10b30 6c 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70  lement..  */.  p
10b40 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 31 5d  C = p->apCsr[p1]
10b50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
10b60 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
10b70 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10b80 54 41 42 4c 45 0a 20 20 61 73 73 65 72 74 28 20  TABLE.  assert( 
10b90 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3d  pC->pVtabCursor=
10ba0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  =0 );.#endif.  p
10bb0 43 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  Crsr = pC->pCurs
10bc0 6f 72 3b 0a 20 20 69 66 28 20 70 43 72 73 72 21  or;.  if( pCrsr!
10bd0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
10be0 20 72 65 63 6f 72 64 20 69 73 20 73 74 6f 72 65   record is store
10bf0 64 20 69 6e 20 61 20 42 2d 54 72 65 65 20 2a 2f  d in a B-Tree */
10c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10c10 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
10c20 6f 28 70 43 29 3b 0a 20 20 20 20 69 66 28 20 72  o(pC);.    if( r
10c30 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
10c40 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
10c50 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77   if( pC->nullRow
10c60 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61   ){.      payloa
10c70 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  dSize = 0;.    }
10c80 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 63 61 63  else if( pC->cac
10c90 68 65 53 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63  heStatus==p->cac
10ca0 68 65 43 74 72 20 29 7b 0a 20 20 20 20 20 20 70  heCtr ){.      p
10cb0 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d  ayloadSize = pC-
10cc0 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20  >payloadSize;.  
10cd0 20 20 20 20 7a 52 65 63 20 3d 20 28 63 68 61 72      zRec = (char
10ce0 2a 29 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20  *)pC->aRow;.    
10cf0 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 69 73  }else if( pC->is
10d00 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 61  Index ){.      a
10d10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
10d20 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
10d30 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20  (pCrsr) );.     
10d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10d50 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c  eeKeySize(pCrsr,
10d60 20 26 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 29   &payloadSize64)
10d70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10d90 20 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75     /* True becau
10da0 73 65 20 6f 66 20 43 75 72 73 6f 72 4d 6f 76 65  se of CursorMove
10db0 74 6f 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 20  to() call above 
10dc0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  */.      /* sqli
10dd0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
10de0 6c 50 74 72 28 29 20 75 73 65 73 20 67 65 74 56  lPtr() uses getV
10df0 61 72 69 6e 74 33 32 28 29 20 74 6f 20 65 78 74  arint32() to ext
10e00 72 61 63 74 20 74 68 65 0a 20 20 20 20 20 20 2a  ract the.      *
10e10 2a 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 2c 20  * payload size, 
10e20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  so it is impossi
10e30 62 6c 65 20 66 6f 72 20 70 61 79 6c 6f 61 64 53  ble for payloadS
10e40 69 7a 65 36 34 20 74 6f 20 62 65 0a 20 20 20 20  ize64 to be.    
10e50 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e    ** larger than
10e60 20 33 32 20 62 69 74 73 2e 20 2a 2f 0a 20 20 20   32 bits. */.   
10e70 20 20 20 61 73 73 65 72 74 28 20 28 70 61 79 6c     assert( (payl
10e80 6f 61 64 53 69 7a 65 36 34 20 26 20 53 51 4c 49  oadSize64 & SQLI
10e90 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
10ea0 34 29 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 20  4)payloadSize64 
10eb0 29 3b 0a 20 20 20 20 20 20 70 61 79 6c 6f 61 64  );.      payload
10ec0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 79 6c  Size = (u32)payl
10ed0 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20 20 20 7d  oadSize64;.    }
10ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
10ef0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
10f00 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
10f10 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20 72 63  rsr) );.      rc
10f20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
10f30 61 74 61 53 69 7a 65 28 70 43 72 73 72 2c 20 26  ataSize(pCrsr, &
10f40 70 61 79 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20  payloadSize);.  
10f50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
10f60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 2f  SQLITE_OK );   /
10f70 2a 20 44 61 74 61 53 69 7a 65 28 29 20 63 61 6e  * DataSize() can
10f80 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20  not fail */.    
10f90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
10fa0 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  ->pseudoTableReg
10fb0 3e 30 20 29 7b 0a 20 20 20 20 70 52 65 67 20 3d  >0 ){.    pReg =
10fc0 20 26 61 4d 65 6d 5b 70 43 2d 3e 70 73 65 75 64   &aMem[pC->pseud
10fd0 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20 20 20  oTableReg];.    
10fe0 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c  assert( pReg->fl
10ff0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
11000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
11010 6d 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29  mIsValid(pReg) )
11020 3b 0a 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a  ;.    payloadSiz
11030 65 20 3d 20 70 52 65 67 2d 3e 6e 3b 0a 20 20 20  e = pReg->n;.   
11040 20 7a 52 65 63 20 3d 20 70 52 65 67 2d 3e 7a 3b   zRec = pReg->z;
11050 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74  .    pC->cacheSt
11060 61 74 75 73 20 3d 20 28 70 4f 70 2d 3e 70 35 26  atus = (pOp->p5&
11070 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
11080 45 29 20 3f 20 43 41 43 48 45 5f 53 54 41 4c 45  E) ? CACHE_STALE
11090 20 3a 20 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a   : p->cacheCtr;.
110a0 20 20 20 20 61 73 73 65 72 74 28 20 70 61 79 6c      assert( payl
110b0 6f 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a 52  oadSize==0 || zR
110c0 65 63 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ec!=0 );.  }else
110d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
110e0 72 20 74 68 65 20 72 6f 77 20 74 6f 20 62 65 20  r the row to be 
110f0 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 70 61 79 6c  NULL */.    payl
11100 6f 61 64 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d  oadSize = 0;.  }
11110 0a 0a 20 20 2f 2a 20 49 66 20 70 61 79 6c 6f 61  ..  /* If payloa
11120 64 53 69 7a 65 20 69 73 20 30 2c 20 74 68 65 6e  dSize is 0, then
11130 20 6a 75 73 74 20 73 74 6f 72 65 20 61 20 4e 55   just store a NU
11140 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 61 79 6c  LL */.  if( payl
11150 6f 61 64 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  oadSize==0 ){.  
11160 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11170 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  >flags&MEM_Null 
11180 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63  );.    goto op_c
11190 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 7d 0a 20  olumn_out;.  }. 
111a0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 4c 69   assert( db->aLi
111b0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
111c0 5f 4c 45 4e 47 54 48 5d 3e 3d 30 20 29 3b 0a 20  _LENGTH]>=0 );. 
111d0 20 69 66 28 20 70 61 79 6c 6f 61 64 53 69 7a 65   if( payloadSize
111e0 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   > (u32)db->aLim
111f0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11200 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
11210 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
11220 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 43 2d  ..  nField = pC-
11230 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65 72  >nField;.  asser
11240 74 28 20 70 32 3c 6e 46 69 65 6c 64 20 29 3b 0a  t( p2<nField );.
11250 0a 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 70  .  /* Read and p
11260 61 72 73 65 20 74 68 65 20 74 61 62 6c 65 20 68  arse the table h
11270 65 61 64 65 72 2e 20 20 53 74 6f 72 65 20 74 68  eader.  Store th
11280 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
11290 20 70 61 72 73 65 0a 20 20 2a 2a 20 69 6e 74 6f   parse.  ** into
112a0 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64   the record head
112b0 65 72 20 63 61 63 68 65 20 66 69 65 6c 64 73 20  er cache fields 
112c0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20  of the cursor.. 
112d0 20 2a 2f 0a 20 20 61 54 79 70 65 20 3d 20 70 43   */.  aType = pC
112e0 2d 3e 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ->aType;.  if( p
112f0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 3d 3d  C->cacheStatus==
11300 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 0a 20  p->cacheCtr ){. 
11310 20 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43 2d     aOffset = pC-
11320 3e 61 4f 66 66 73 65 74 3b 0a 20 20 7d 65 6c 73  >aOffset;.  }els
11330 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 61 54  e{.    assert(aT
11340 79 70 65 29 3b 0a 20 20 20 20 61 76 61 69 6c 20  ype);.    avail 
11350 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 61 4f 66  = 0;.    pC->aOf
11360 66 73 65 74 20 3d 20 61 4f 66 66 73 65 74 20 3d  fset = aOffset =
11370 20 26 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b   &aType[nField];
11380 0a 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64  .    pC->payload
11390 53 69 7a 65 20 3d 20 70 61 79 6c 6f 61 64 53 69  Size = payloadSi
113a0 7a 65 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68  ze;.    pC->cach
113b0 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63  eStatus = p->cac
113c0 68 65 43 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 46  heCtr;..    /* F
113d0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
113e0 6e 79 20 62 79 74 65 73 20 61 72 65 20 69 6e 20  ny bytes are in 
113f0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
11400 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20    if( zRec ){.  
11410 20 20 20 20 7a 44 61 74 61 20 3d 20 7a 52 65 63      zData = zRec
11420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11430 20 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64     if( pC->isInd
11440 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  ex ){.        zD
11450 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ata = (char*)sql
11460 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
11470 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29  h(pCrsr, &avail)
11480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11490 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28         zData = (
114a0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74 72  char*)sqlite3Btr
114b0 65 65 44 61 74 61 46 65 74 63 68 28 70 43 72 73  eeDataFetch(pCrs
114c0 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
114d0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
114e0 4b 65 79 46 65 74 63 68 28 29 2f 44 61 74 61 46  KeyFetch()/DataF
114f0 65 74 63 68 28 29 20 6d 61 6e 61 67 65 64 20 74  etch() managed t
11500 6f 20 67 65 74 20 74 68 65 20 65 6e 74 69 72 65  o get the entire
11510 20 70 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20 20   payload,.      
11520 2a 2a 20 73 61 76 65 20 74 68 65 20 70 61 79 6c  ** save the payl
11530 6f 61 64 20 69 6e 20 74 68 65 20 70 43 2d 3e 61  oad in the pC->a
11540 52 6f 77 20 63 61 63 68 65 2e 20 20 54 68 61 74  Row cache.  That
11550 20 77 69 6c 6c 20 73 61 76 65 20 75 73 20 66 72   will save us fr
11560 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 69  om.      ** havi
11570 6e 67 20 74 6f 20 6d 61 6b 65 20 61 64 64 69 74  ng to make addit
11580 69 6f 6e 61 6c 20 63 61 6c 6c 73 20 74 6f 20 66  ional calls to f
11590 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
115a0 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20 20 20 20   portion of.    
115b0 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64 2e    ** the record.
115c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
115d0 61 73 73 65 72 74 28 20 61 76 61 69 6c 3e 3d 30  assert( avail>=0
115e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61   );.      if( pa
115f0 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28 75 33  yloadSize <= (u3
11600 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20 20 20  2)avail ){.     
11610 20 20 20 7a 52 65 63 20 3d 20 7a 44 61 74 61 3b     zRec = zData;
11620 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  .        pC->aRo
11630 77 20 3d 20 28 75 38 2a 29 7a 44 61 74 61 3b 0a  w = (u8*)zData;.
11640 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11650 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20       pC->aRow = 
11660 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
11670 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
11680 6f 77 69 6e 67 20 61 73 73 65 72 74 20 69 73 20  owing assert is 
11690 74 72 75 65 20 69 6e 20 61 6c 6c 20 63 61 73 65  true in all case
116a0 73 20 61 63 63 65 70 74 20 77 68 65 6e 0a 20 20  s accept when.  
116b0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
116c0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
116d0 63 6f 72 72 75 70 74 65 64 20 65 78 74 65 72 6e  corrupted extern
116e0 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ally..    **    
116f0 61 73 73 65 72 74 28 20 7a 52 65 63 21 3d 30 20  assert( zRec!=0 
11700 7c 7c 20 61 76 61 69 6c 3e 3d 70 61 79 6c 6f 61  || avail>=payloa
11710 64 53 69 7a 65 20 7c 7c 20 61 76 61 69 6c 3e 3d  dSize || avail>=
11720 39 20 29 3b 20 2a 2f 0a 20 20 20 20 73 7a 48 64  9 ); */.    szHd
11730 72 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  r = getVarint32(
11740 28 75 38 2a 29 7a 44 61 74 61 2c 20 6f 66 66 73  (u8*)zData, offs
11750 65 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  et);..    /* Mak
11760 65 20 73 75 72 65 20 61 20 63 6f 72 72 75 70 74  e sure a corrupt
11770 20 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f   database has no
11780 74 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f 76  t given us an ov
11790 65 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a 20  ersize header.. 
117a0 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e 6f     ** Do this no
117b0 77 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f 76  w to avoid an ov
117c0 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61 6c  ersize memory al
117d0 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  location..    **
117e0 0a 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74  .    ** Type ent
117f0 72 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77  ries can be betw
11800 65 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65  een 1 and 5 byte
11810 73 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61  s each.  But 4 a
11820 6e 64 20 35 20 62 79 74 65 0a 20 20 20 20 2a 2a  nd 5 byte.    **
11830 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d 75   types use so mu
11840 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74 68  ch data space th
11850 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e 6c  at there can onl
11860 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33 32  y be 4096 and 32
11870 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 6d 2c   of.    ** them,
11880 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
11890 53 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68  So the maximum h
118a0 65 61 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73  eader length res
118b0 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20  ults from a.    
118c0 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 66  ** 3-byte type f
118d0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d  or each of the m
118e0 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20  aximum of 32768 
118f0 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
11900 65 65 0a 20 20 20 20 2a 2a 20 65 78 74 72 61 20  ee.    ** extra 
11910 62 79 74 65 73 20 66 6f 72 20 74 68 65 20 68 65  bytes for the he
11920 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74 73 65  ader length itse
11930 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b 20 33  lf.  32768*3 + 3
11940 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20 2a 2f   = 98307..    */
11950 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20  .    if( offset 
11960 3e 20 39 38 33 30 37 20 29 7b 0a 20 20 20 20 20  > 98307 ){.     
11970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
11980 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
11990 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
119a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
119b0 2f 2a 20 43 6f 6d 70 75 74 65 20 69 6e 20 6c 65  /* Compute in le
119c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
119d0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 77 65  bytes of data we
119e0 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 69 6e   need to read in
119f0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 74 6f   order.    ** to
11a00 20 67 65 74 20 6e 46 69 65 6c 64 20 74 79 70 65   get nField type
11a10 20 76 61 6c 75 65 73 2e 20 20 6f 66 66 73 65 74   values.  offset
11a20 20 69 73 20 61 6e 20 75 70 70 65 72 20 62 6f 75   is an upper bou
11a30 6e 64 20 6f 6e 20 74 68 69 73 2e 20 20 42 75 74  nd on this.  But
11a40 0a 20 20 20 20 2a 2a 20 6e 46 69 65 6c 64 20 6d  .    ** nField m
11a50 69 67 68 74 20 62 65 20 73 69 67 6e 69 66 69 63  ight be signific
11a60 61 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20  antly less than 
11a70 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 20  the true number 
11a80 6f 66 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  of columns.    *
11a90 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  * in the table, 
11aa0 61 6e 64 20 69 6e 20 74 68 61 74 20 63 61 73 65  and in that case
11ab0 2c 20 35 2a 6e 46 69 65 6c 64 2b 33 20 6d 69 67  , 5*nField+3 mig
11ac0 68 74 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ht be smaller th
11ad0 61 6e 20 6f 66 66 73 65 74 2e 0a 20 20 20 20 2a  an offset..    *
11ae0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 6d 69 6e  * We want to min
11af0 69 6d 69 7a 65 20 6c 65 6e 20 69 6e 20 6f 72 64  imize len in ord
11b00 65 72 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  er to limit the 
11b10 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  size of the memo
11b20 72 79 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  ry.    ** alloca
11b30 74 69 6f 6e 2c 20 65 73 70 65 63 69 61 6c 6c 79  tion, especially
11b40 20 69 66 20 61 20 63 6f 72 72 75 70 74 20 64 61   if a corrupt da
11b50 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
11b60 63 61 75 73 65 64 20 6f 66 66 73 65 74 0a 20 20  caused offset.  
11b70 20 20 2a 2a 20 74 6f 20 62 65 20 6f 76 65 72 73    ** to be overs
11b80 69 7a 65 64 2e 20 4f 66 66 73 65 74 20 69 73 20  ized. Offset is 
11b90 6c 69 6d 69 74 65 64 20 74 6f 20 39 38 33 30 37  limited to 98307
11ba0 20 61 62 6f 76 65 2e 20 20 42 75 74 20 39 38 33   above.  But 983
11bb0 30 37 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  07 might.    ** 
11bc0 73 74 69 6c 6c 20 65 78 63 65 65 64 20 52 6f 62  still exceed Rob
11bd0 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  son memory alloc
11be0 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 6f 6e 20  ation limits on 
11bf0 73 6f 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69  some configurati
11c00 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 73  ons..    ** On s
11c10 79 73 74 65 6d 73 20 74 68 61 74 20 63 61 6e 6e  ystems that cann
11c20 6f 74 20 74 6f 6c 65 72 61 74 65 20 6c 61 72 67  ot tolerate larg
11c30 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
11c40 69 6f 6e 73 2c 20 6e 46 69 65 6c 64 2a 35 2b 33  ions, nField*5+3
11c50 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6c 69 6b  .    ** will lik
11c60 65 6c 79 20 62 65 20 6d 75 63 68 20 73 6d 61 6c  ely be much smal
11c70 6c 65 72 20 73 69 6e 63 65 20 6e 46 69 65 6c 64  ler since nField
11c80 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 62 65 20   will likely be 
11c90 6c 65 73 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  less than.    **
11ca0 20 32 30 20 6f 72 20 73 6f 2e 20 20 54 68 69 73   20 or so.  This
11cb0 20 69 6e 73 75 72 65 73 20 74 68 61 74 20 52 6f   insures that Ro
11cc0 62 73 6f 6e 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  bson memory allo
11cd0 63 61 74 69 6f 6e 20 6c 69 6d 69 74 73 20 61 72  cation limits ar
11ce0 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 78 63  e.    ** not exc
11cf0 65 65 64 65 64 20 65 76 65 6e 20 66 6f 72 20 63  eeded even for c
11d00 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
11d10 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
11d20 20 20 6c 65 6e 20 3d 20 6e 46 69 65 6c 64 2a 35    len = nField*5
11d30 20 2b 20 33 3b 0a 20 20 20 20 69 66 28 20 6c 65   + 3;.    if( le
11d40 6e 20 3e 20 28 69 6e 74 29 6f 66 66 73 65 74 20  n > (int)offset 
11d50 29 20 6c 65 6e 20 3d 20 28 69 6e 74 29 6f 66 66  ) len = (int)off
11d60 73 65 74 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  set;..    /* The
11d70 20 4b 65 79 46 65 74 63 68 28 29 20 6f 72 20 44   KeyFetch() or D
11d80 61 74 61 46 65 74 63 68 28 29 20 61 62 6f 76 65  ataFetch() above
11d90 20 61 72 65 20 66 61 73 74 20 61 6e 64 20 77 69   are fast and wi
11da0 6c 6c 20 67 65 74 20 74 68 65 20 65 6e 74 69 72  ll get the entir
11db0 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20  e.    ** record 
11dc0 68 65 61 64 65 72 20 69 6e 20 6d 6f 73 74 20 63  header in most c
11dd0 61 73 65 73 2e 20 20 42 75 74 20 74 68 65 79 20  ases.  But they 
11de0 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 67 65 74  will fail to get
11df0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20 20   the complete.  
11e00 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65 61 64    ** record head
11e10 65 72 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  er if the record
11e20 20 68 65 61 64 65 72 20 64 6f 65 73 20 6e 6f 74   header does not
11e30 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
11e40 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
11e50 74 68 65 20 42 2d 54 72 65 65 2e 20 20 57 68 65  the B-Tree.  Whe
11e60 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  n that happens, 
11e70 75 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 4d  use sqlite3VdbeM
11e80 65 6d 46 72 6f 6d 42 74 72 65 65 28 29 20 74 6f  emFromBtree() to
11e90 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72 65 20  .    ** acquire 
11ea0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  the complete hea
11eb0 64 65 72 20 74 65 78 74 2e 0a 20 20 20 20 2a 2f  der text..    */
11ec0 0a 20 20 20 20 69 66 28 20 21 7a 52 65 63 20 26  .    if( !zRec &
11ed0 26 20 61 76 61 69 6c 3c 6c 65 6e 20 29 7b 0a 20  & avail<len ){. 
11ee0 20 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20       sMem.flags 
11ef0 3d 20 30 3b 0a 20 20 20 20 20 20 73 4d 65 6d 2e  = 0;.      sMem.
11f00 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  db = 0;.      rc
11f10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11f20 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
11f30 2c 20 30 2c 20 6c 65 6e 2c 20 70 43 2d 3e 69 73  , 0, len, pC->is
11f40 49 6e 64 65 78 2c 20 26 73 4d 65 6d 29 3b 0a 20  Index, &sMem);. 
11f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f70 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e    goto op_column
11f80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
11f90 20 20 20 20 7a 44 61 74 61 20 3d 20 73 4d 65 6d      zData = sMem
11fa0 2e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 45  .z;.    }.    zE
11fb0 6e 64 48 64 72 20 3d 20 28 75 38 20 2a 29 26 7a  ndHdr = (u8 *)&z
11fc0 44 61 74 61 5b 6c 65 6e 5d 3b 0a 20 20 20 20 7a  Data[len];.    z
11fd0 49 64 78 20 3d 20 28 75 38 20 2a 29 26 7a 44 61  Idx = (u8 *)&zDa
11fe0 74 61 5b 73 7a 48 64 72 5d 3b 0a 0a 20 20 20 20  ta[szHdr];..    
11ff0 2f 2a 20 53 63 61 6e 20 74 68 65 20 68 65 61 64  /* Scan the head
12000 65 72 20 61 6e 64 20 75 73 65 20 69 74 20 74 6f  er and use it to
12010 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 61 54 79   fill in the aTy
12020 70 65 5b 5d 20 61 6e 64 20 61 4f 66 66 73 65 74  pe[] and aOffset
12030 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 73  [].    ** arrays
12040 2e 20 20 61 54 79 70 65 5b 69 5d 20 77 69 6c 6c  .  aType[i] will
12050 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 79 70   contain the typ
12060 65 20 69 6e 74 65 67 65 72 20 66 6f 72 20 74 68  e integer for th
12070 65 20 69 2d 74 68 0a 20 20 20 20 2a 2a 20 63 6f  e i-th.    ** co
12080 6c 75 6d 6e 20 61 6e 64 20 61 4f 66 66 73 65 74  lumn and aOffset
12090 5b 69 5d 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  [i] will contain
120a0 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d   the offset from
120b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
120c0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63     ** of the rec
120d0 6f 72 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  ord to the start
120e0 20 6f 66 20 74 68 65 20 64 61 74 61 20 66 6f 72   of the data for
120f0 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
12100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
12110 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69  i=0; i<nField; i
12120 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
12130 49 64 78 3c 7a 45 6e 64 48 64 72 20 29 7b 0a 20  Idx<zEndHdr ){. 
12140 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b 69         aOffset[i
12150 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  ] = offset;.    
12160 20 20 20 20 7a 49 64 78 20 2b 3d 20 67 65 74 56      zIdx += getV
12170 61 72 69 6e 74 33 32 28 7a 49 64 78 2c 20 61 54  arint32(zIdx, aT
12180 79 70 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ype[i]);.       
12190 20 73 7a 46 69 65 6c 64 20 3d 20 73 71 6c 69 74   szField = sqlit
121a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
121b0 4c 65 6e 28 61 54 79 70 65 5b 69 5d 29 3b 0a 20  Len(aType[i]);. 
121c0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
121d0 20 73 7a 46 69 65 6c 64 3b 0a 20 20 20 20 20 20   szField;.      
121e0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 73 7a 46    if( offset<szF
121f0 69 65 6c 64 20 29 7b 20 20 2f 2a 20 54 72 75 65  ield ){  /* True
12200 20 69 66 20 6f 66 66 73 65 74 20 6f 76 65 72 66   if offset overf
12210 6c 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  lows */.        
12220 20 20 7a 49 64 78 20 3d 20 26 7a 45 6e 64 48 64    zIdx = &zEndHd
12230 72 5b 31 5d 3b 20 20 2f 2a 20 46 6f 72 63 65 73  r[1];  /* Forces
12240 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
12250 72 65 74 75 72 6e 20 62 65 6c 6f 77 20 2a 2f 0a  return below */.
12260 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12290 2f 2a 20 49 66 20 69 20 69 73 20 6c 65 73 73 20  /* If i is less 
122a0 74 68 61 74 20 6e 46 69 65 6c 64 2c 20 74 68 65  that nField, the
122b0 6e 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  n there are less
122c0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 69 73 0a   fields in this.
122d0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 6f 72          ** recor
122e0 64 20 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f 6c  d than SetNumCol
122f0 75 6d 6e 73 20 69 6e 64 69 63 61 74 65 64 20 74  umns indicated t
12300 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73  here are columns
12310 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
12320 2a 2a 20 74 61 62 6c 65 2e 20 53 65 74 20 74 68  ** table. Set th
12330 65 20 6f 66 66 73 65 74 20 66 6f 72 20 61 6e 79  e offset for any
12340 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
12350 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20  ot present in.  
12360 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 63        ** the rec
12370 6f 72 64 20 74 6f 20 30 2e 20 54 68 69 73 20 74  ord to 0. This t
12380 65 6c 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77 20  ells code below 
12390 74 6f 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 0a  to store a NULL.
123a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 65          ** inste
123b0 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c 69 7a  ad of deserializ
123c0 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72 6f 6d  ing a value from
123d0 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20 20   the record..   
123e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
123f0 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b 0a  aOffset[i] = 0;.
12400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12410 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12420 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a  Release(&sMem);.
12430 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20 3d      sMem.flags =
12440 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20 20   MEM_Null;..    
12450 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 72 65  /* If we have re
12460 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72 20 64  ad more header d
12470 61 74 61 20 74 68 61 6e 20 77 61 73 20 63 6f 6e  ata than was con
12480 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65  tained in the he
12490 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72 20  ader,.    ** or 
124a0 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  if the end of th
124b0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70 70  e last field app
124c0 65 61 72 73 20 74 6f 20 62 65 20 70 61 73 74 20  ears to be past 
124d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
124e0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72     ** record, or
124f0 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   if the end of t
12500 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70  he last field ap
12510 70 65 61 72 73 20 74 6f 20 62 65 20 62 65 66 6f  pears to be befo
12520 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  re the end.    *
12530 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  * of the record 
12540 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64 73  (when all fields
12550 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65 6e 20   present), then 
12560 77 65 20 6d 75 73 74 20 62 65 20 64 65 61 6c 69  we must be deali
12570 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ng .    ** with 
12580 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
12590 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
125a0 66 28 20 28 7a 49 64 78 20 3e 20 7a 45 6e 64 48  f( (zIdx > zEndH
125b0 64 72 29 20 7c 7c 20 28 6f 66 66 73 65 74 20 3e  dr) || (offset >
125c0 20 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20   payloadSize).  
125d0 20 20 20 20 20 20 20 7c 7c 20 28 7a 49 64 78 3d         || (zIdx=
125e0 3d 7a 45 6e 64 48 64 72 20 26 26 20 6f 66 66 73  =zEndHdr && offs
125f0 65 74 21 3d 70 61 79 6c 6f 61 64 53 69 7a 65 29  et!=payloadSize)
12600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12610 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12620 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  PT;.      goto o
12630 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
12640 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65    }.  }..  /* Ge
12650 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 66  t the column inf
12660 6f 72 6d 61 74 69 6f 6e 2e 20 49 66 20 61 4f 66  ormation. If aOf
12670 66 73 65 74 5b 70 32 5d 20 69 73 20 6e 6f 6e 2d  fset[p2] is non-
12680 7a 65 72 6f 2c 20 74 68 65 6e 20 0a 20 20 2a 2a  zero, then .  **
12690 20 64 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   deserialize the
126a0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
126b0 72 65 63 6f 72 64 2e 20 49 66 20 61 4f 66 66 73  record. If aOffs
126c0 65 74 5b 70 32 5d 20 69 73 20 7a 65 72 6f 2c 0a  et[p2] is zero,.
126d0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
126e0 61 72 65 20 6e 6f 74 20 65 6e 6f 75 67 68 20 66  are not enough f
126f0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63  ields in the rec
12700 6f 72 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  ord to satisfy t
12710 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 2e  he.  ** request.
12720 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20    In this case, 
12730 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 4e 55  set the value NU
12740 4c 4c 20 6f 72 20 74 6f 20 50 34 20 69 66 20 50  LL or to P4 if P
12750 34 20 69 73 0a 20 20 2a 2a 20 61 20 70 6f 69 6e  4 is.  ** a poin
12760 74 65 72 20 74 6f 20 61 20 4d 65 6d 20 6f 62 6a  ter to a Mem obj
12770 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
12780 61 4f 66 66 73 65 74 5b 70 32 5d 20 29 7b 0a 20  aOffset[p2] ){. 
12790 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
127a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
127b0 69 66 28 20 7a 52 65 63 20 29 7b 0a 20 20 20 20  if( zRec ){.    
127c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
127d0 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28  ReleaseExternal(
127e0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  pDest);.      sq
127f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
12800 65 74 28 28 75 38 20 2a 29 26 7a 52 65 63 5b 61  et((u8 *)&zRec[a
12810 4f 66 66 73 65 74 5b 70 32 5d 5d 2c 20 61 54 79  Offset[p2]], aTy
12820 70 65 5b 70 32 5d 2c 20 70 44 65 73 74 29 3b 0a  pe[p2], pDest);.
12830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12840 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64   len = sqlite3Vd
12850 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
12860 61 54 79 70 65 5b 70 32 5d 29 3b 0a 20 20 20 20  aType[p2]);.    
12870 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
12880 4d 6f 76 65 28 26 73 4d 65 6d 2c 20 70 44 65 73  Move(&sMem, pDes
12890 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
128a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
128b0 6d 42 74 72 65 65 28 70 43 72 73 72 2c 20 61 4f  mBtree(pCrsr, aO
128c0 66 66 73 65 74 5b 70 32 5d 2c 20 6c 65 6e 2c 20  ffset[p2], len, 
128d0 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26 73 4d  pC->isIndex, &sM
128e0 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  em);.      if( r
128f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12900 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
12910 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20  column_out;.    
12920 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74 61 20    }.      zData 
12930 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 20  = sMem.z;.      
12940 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
12950 6c 47 65 74 28 28 75 38 2a 29 7a 44 61 74 61 2c  lGet((u8*)zData,
12960 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44 65 73   aType[p2], pDes
12970 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  t);.    }.    pD
12980 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  est->enc = encod
12990 69 6e 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ing;.  }else{.  
129a0 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
129b0 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20  e==P4_MEM ){.   
129c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
129d0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65  mShallowCopy(pDe
129e0 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  st, pOp->p4.pMem
129f0 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
12a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a10 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 66  assert( pDest->f
12a20 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  lags&MEM_Null );
12a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12a40 20 49 66 20 77 65 20 64 79 6e 61 6d 69 63 61 6c   If we dynamical
12a50 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  ly allocated spa
12a60 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  ce to hold the d
12a70 61 74 61 20 28 69 6e 20 74 68 65 0a 20 20 2a 2a  ata (in the.  **
12a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
12a90 72 6f 6d 42 74 72 65 65 28 29 20 63 61 6c 6c 20  romBtree() call 
12aa0 61 62 6f 76 65 29 20 74 68 65 6e 20 74 72 61 6e  above) then tran
12ab0 73 66 65 72 20 63 6f 6e 74 72 6f 6c 20 6f 66 20  sfer control of 
12ac0 74 68 61 74 0a 20 20 2a 2a 20 64 79 6e 61 6d 69  that.  ** dynami
12ad0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
12ae0 73 70 61 63 65 20 6f 76 65 72 20 74 6f 20 74 68  space over to th
12af0 65 20 70 44 65 73 74 20 73 74 72 75 63 74 75 72  e pDest structur
12b00 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 65  e..  ** This pre
12b10 76 65 6e 74 73 20 61 20 6d 65 6d 6f 72 79 20 63  vents a memory c
12b20 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
12b30 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  sMem.zMalloc ){.
12b40 20 20 20 20 61 73 73 65 72 74 28 20 73 4d 65 6d      assert( sMem
12b50 2e 7a 3d 3d 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63  .z==sMem.zMalloc
12b60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12b70 21 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26  !(pDest->flags &
12b80 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20   MEM_Dyn) );.   
12b90 20 61 73 73 65 72 74 28 20 21 28 70 44 65 73 74   assert( !(pDest
12ba0 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 42  ->flags & (MEM_B
12bb0 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 29 20 7c 7c  lob|MEM_Str)) ||
12bc0 20 70 44 65 73 74 2d 3e 7a 3d 3d 73 4d 65 6d 2e   pDest->z==sMem.
12bd0 7a 20 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  z );.    pDest->
12be0 66 6c 61 67 73 20 26 3d 20 7e 28 4d 45 4d 5f 45  flags &= ~(MEM_E
12bf0 70 68 65 6d 7c 4d 45 4d 5f 53 74 61 74 69 63 29  phem|MEM_Static)
12c00 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61  ;.    pDest->fla
12c10 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a  gs |= MEM_Term;.
12c20 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 73      pDest->z = s
12c30 4d 65 6d 2e 7a 3b 0a 20 20 20 20 70 44 65 73 74  Mem.z;.    pDest
12c40 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 73 4d 65 6d  ->zMalloc = sMem
12c50 2e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20  .zMalloc;.  }.. 
12c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12c70 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
12c80 65 28 70 44 65 73 74 29 3b 0a 0a 6f 70 5f 63 6f  e(pDest);..op_co
12c90 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41  lumn_out:.  UPDA
12ca0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
12cb0 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54  pDest);.  REGIST
12cc0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
12cd0 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61  , pDest);.  brea
12ce0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
12cf0 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32 20   Affinity P1 P2 
12d00 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 41 70 70  * P4 *.**.** App
12d10 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  ly affinities to
12d20 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20 72   a range of P2 r
12d30 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
12d40 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a  g with P1..**.**
12d50 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67 20   P4 is a string 
12d60 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61  that is P2 chara
12d70 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20  cters long. The 
12d80 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
12d90 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
12da0 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
12db0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
12dc0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
12dd0 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
12de0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
12df0 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73  he range..*/.cas
12e00 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b  e OP_Affinity: {
12e10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12e20 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54  Affinity;   /* T
12e30 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62  he affinity to b
12e40 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63  e applied */.  c
12e50 68 61 72 20 63 41 66 66 3b 20 20 20 20 20 20 20  har cAff;       
12e60 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
12e70 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  gle character of
12e80 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20   affinity */..  
12e90 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
12ea0 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
12eb0 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b   zAffinity!=0 );
12ec0 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
12ed0 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30  nity[pOp->p2]==0
12ee0 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
12ef0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77  em[pOp->p1];.  w
12f00 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20 2a 28  hile( (cAff = *(
12f10 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30  zAffinity++))!=0
12f20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12f30 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
12f40 5b 70 2d 3e 6e 4d 65 6d 5d 20 29 3b 0a 20 20 20  [p->nMem] );.   
12f50 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
12f60 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
12f70 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
12f80 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  );.    applyAffi
12f90 6e 69 74 79 28 70 49 6e 31 2c 20 63 41 66 66 2c  nity(pIn1, cAff,
12fa0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
12fb0 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72  pIn1++;.  }.  br
12fc0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12fd0 65 3a 20 4d 61 6b 65 52 65 63 6f 72 64 20 50 31  e: MakeRecord P1
12fe0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
12ff0 2a 20 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67  * Convert P2 reg
13000 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  isters beginning
13010 20 77 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68   with P1 into th
13020 65 20 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  e [record format
13030 5d 0a 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61  ].** use as a da
13040 74 61 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64  ta record in a d
13050 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
13060 20 61 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20   as a key.** in 
13070 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f  an index.  The O
13080 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
13090 63 61 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72  can decode the r
130a0 65 63 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a  ecord later..**.
130b0 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 73  ** P4 may be a s
130c0 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
130d0 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
130e0 2e 20 20 54 68 65 20 6e 74 68 20 63 68 61 72 61  .  The nth chara
130f0 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73  cter of the.** s
13100 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20  tring indicates 
13110 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  the column affin
13120 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ity that should 
13130 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
13140 6e 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  nth.** field of 
13150 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a  the index key..*
13160 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67  *.** The mapping
13170 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20   from character 
13180 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67  to affinity is g
13190 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49  iven by the SQLI
131a0 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f  TE_AFF_.** macro
131b0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
131c0 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20  iteInt.h..**.** 
131d0 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68  If P4 is NULL th
131e0 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65  en all index fie
131f0 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66  lds have the aff
13200 69 6e 69 74 79 20 4e 4f 4e 45 2e 0a 2a 2f 0a 63  inity NONE..*/.c
13210 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  ase OP_MakeRecor
13220 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52  d: {.  u8 *zNewR
13230 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a  ecord;        /*
13240 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
13250 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  d the data for t
13260 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
13270 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20  .  Mem *pRec;   
13280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13290 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
132a0 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20   u64 nData;     
132b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
132c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
132d0 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e  ta space */.  in
132e0 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20  t nHdr;         
132f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13300 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
13310 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34  r space */.  i64
13320 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
13330 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63      /* Data spac
13340 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
13350 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  his record */.  
13360 69 6e 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  int nZero;      
13370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13380 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61   of zero bytes a
13390 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
133a0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
133b0 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20   nVarint;       
133c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
133d0 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69   bytes in a vari
133e0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  nt */.  u32 seri
133f0 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f  al_type;       /
13400 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a  * Type field */.
13410 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20    Mem *pData0;  
13420 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
13430 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f  t field to be co
13440 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20  mbined into the 
13450 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
13460 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  *pLast;         
13470 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64     /* Last field
13480 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
13490 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
134a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
134b0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
134c0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
134d0 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74    char *zAffinit
134e0 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
134f0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
13500 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
13510 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  /.  int file_for
13520 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69  mat;       /* Fi
13530 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  le format to use
13540 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f   for encoding */
13550 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
13570 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52  ce used in zNewR
13580 65 63 6f 72 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ecord[] */.  int
13590 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
135a0 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
135b0 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 2f   a field */..  /
135c0 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 72  * Assuming the r
135d0 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e  ecord contains N
135e0 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72 65 63   fields, the rec
135f0 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73  ord format looks
13600 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  .  ** like this:
13610 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d  .  **.  ** -----
13620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73  ---.  ** | hdr-s
13670 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c 20 74  ize | type 0 | t
13680 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79  ype 1 | ... | ty
13690 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c  pe N-1 | data0 |
136a0 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20   ... | data N-1 
136b0 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  | .  ** --------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28  .  **.  ** Data(
13710 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  0) is taken from
13720 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 44   register P1.  D
13730 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66 72 6f  ata(1) comes fro
13740 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b 31 0a  m register P1+1.
13750 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74    ** and so frot
13760 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63  h..  **.  ** Eac
13770 68 20 74 79 70 65 20 66 69 65 6c 64 20 69 73 20  h type field is 
13780 61 20 76 61 72 69 6e 74 20 72 65 70 72 65 73 65  a varint represe
13790 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c  nting the serial
137a0 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a 20 20   type of the .  
137b0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
137c0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 28 73   data element (s
137d0 65 65 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ee sqlite3VdbeSe
137e0 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54 68 65  rialType()). The
137f0 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66  .  ** hdr-size f
13800 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61 20 76  ield is also a v
13810 61 72 69 6e 74 20 77 68 69 63 68 20 69 73 20 74  arint which is t
13820 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74  he offset from t
13830 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a  he beginning.  *
13840 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  * of the record 
13850 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20  to data0..  */. 
13860 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20   nData = 0;     
13870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13880 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73   bytes of data s
13890 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72 20 3d  pace */.  nHdr =
138a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
138b0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
138c0 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20  of header space 
138d0 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 20  */.  nZero = 0; 
138e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
138f0 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20  r of zero bytes 
13900 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
13910 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 6e 46  e record */.  nF
13920 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ield = pOp->p1;.
13930 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f    zAffinity = pO
13940 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72  p->p4.z;.  asser
13950 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26 20 70  t( nField>0 && p
13960 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d  Op->p2>0 && pOp-
13970 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 70 2d 3e 6e  >p2+nField<=p->n
13980 4d 65 6d 2b 31 20 29 3b 0a 20 20 70 44 61 74 61  Mem+1 );.  pData
13990 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69 65 6c 64  0 = &aMem[nField
139a0 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  ];.  nField = pO
139b0 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73 74 20 3d  p->p2;.  pLast =
139c0 20 26 70 44 61 74 61 30 5b 6e 46 69 65 6c 64 2d   &pData0[nField-
139d0 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f 72 6d 61  1];.  file_forma
139e0 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  t = p->minWriteF
139f0 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20 20 2f 2a  ileFormat;..  /*
13a00 20 49 64 65 6e 74 69 66 79 20 74 68 65 20 6f 75   Identify the ou
13a10 74 70 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f  tput register */
13a20 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
13a30 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c 20 70 4f  p3<pOp->p1 || pO
13a40 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 31 2b 70  p->p3>=pOp->p1+p
13a50 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70 4f 75 74  Op->p2 );.  pOut
13a60 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
13a70 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
13a80 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
13a90 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
13aa0 67 68 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  gh the elements 
13ab0 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75  that will make u
13ac0 70 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  p the record to 
13ad0 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20  figure.  ** out 
13ae0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
13af0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  s required for t
13b00 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20  he new record.. 
13b10 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65 63 3d 70   */.  for(pRec=p
13b20 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61  Data0; pRec<=pLa
13b30 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  st; pRec++){.   
13b40 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
13b50 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20  lid(pRec) );.   
13b60 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29   if( zAffinity )
13b70 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  {.      applyAff
13b80 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66  inity(pRec, zAff
13b90 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61  inity[pRec-pData
13ba0 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  0], encoding);. 
13bb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 65     }.    if( pRe
13bc0 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72  c->flags&MEM_Zer
13bd0 6f 20 26 26 20 70 52 65 63 2d 3e 6e 3e 30 20 29  o && pRec->n>0 )
13be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13bf0 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
13c00 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20  (pRec);.    }.  
13c10 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
13c20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13c30 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65  lType(pRec, file
13c40 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 65  _format);.    le
13c50 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  n = sqlite3VdbeS
13c60 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
13c70 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6e  ial_type);.    n
13c80 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20  Data += len;.   
13c90 20 6e 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   nHdr += sqlite3
13ca0 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
13cb0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  _type);.    if( 
13cc0 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRec->flags & ME
13cd0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
13ce0 2f 2a 20 4f 6e 6c 79 20 70 75 72 65 20 7a 65 72  /* Only pure zer
13cf0 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 73 20 63  o-filled BLOBs c
13d00 61 6e 20 62 65 20 69 6e 70 75 74 20 74 6f 20 74  an be input to t
13d10 68 69 73 20 4f 70 63 6f 64 65 2e 0a 20 20 20 20  his Opcode..    
13d20 20 20 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61    ** We do not a
13d30 6c 6c 6f 77 20 62 6c 6f 62 73 20 77 69 74 68 20  llow blobs with 
13d40 61 20 70 72 65 66 69 78 20 61 6e 64 20 61 20 7a  a prefix and a z
13d50 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
13d60 20 2a 2f 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20   */.      nZero 
13d70 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
13d80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
13d90 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65  len ){.      nZe
13da0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ro = 0;.    }.  
13db0 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
13dc0 69 6e 69 74 69 61 6c 20 68 65 61 64 65 72 20 76  initial header v
13dd0 61 72 69 6e 74 20 61 6e 64 20 74 6f 74 61 6c 20  arint and total 
13de0 74 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 6e 48  the size */.  nH
13df0 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 20 3d 20  dr += nVarint = 
13e00 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
13e10 28 6e 48 64 72 29 3b 0a 20 20 69 66 28 20 6e 56  (nHdr);.  if( nV
13e20 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72  arint<sqlite3Var
13e30 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 7b 0a  intLen(nHdr) ){.
13e40 20 20 20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a      nHdr++;.  }.
13e50 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e    nByte = nHdr+n
13e60 44 61 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66  Data-nZero;.  if
13e70 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
13e80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13e90 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
13ea0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
13eb0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13ec0 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69   the output regi
13ed0 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65  ster has a buffe
13ee0 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  r large enough t
13ef0 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68  o store .  ** th
13f00 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68  e new record. Th
13f10 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65  e output registe
13f20 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e  r (pOp->p3) is n
13f30 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
13f40 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ** be one of the
13f50 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
13f60 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f   (because the fo
13f70 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a  llowing call to.
13f80 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
13f90 4d 65 6d 47 72 6f 77 28 29 20 63 6f 75 6c 64 20  MemGrow() could 
13fa0 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75  clobber the valu
13fb0 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
13fc0 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sed)..  */.  if(
13fd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
13fe0 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e  row(pOut, (int)n
13ff0 42 79 74 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Byte, 0) ){.    
14000 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
14010 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20  .  zNewRecord = 
14020 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a  (u8 *)pOut->z;..
14030 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
14040 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70  ecord */.  i = p
14050 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52  utVarint32(zNewR
14060 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20  ecord, nHdr);.  
14070 66 6f 72 28 70 52 65 63 3d 70 44 61 74 61 30 3b  for(pRec=pData0;
14080 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b 20 70 52   pRec<=pLast; pR
14090 65 63 2b 2b 29 7b 0a 20 20 20 20 73 65 72 69 61  ec++){.    seria
140a0 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
140b0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
140c0 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Rec, file_format
140d0 29 3b 0a 20 20 20 20 69 20 2b 3d 20 70 75 74 56  );.    i += putV
140e0 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52 65 63  arint32(&zNewRec
140f0 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74  ord[i], serial_t
14100 79 70 65 29 3b 20 20 20 20 20 20 2f 2a 20 73 65  ype);      /* se
14110 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 7d  rial type */.  }
14120 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44 61 74  .  for(pRec=pDat
14130 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73 74 3b  a0; pRec<=pLast;
14140 20 70 52 65 63 2b 2b 29 7b 20 20 2f 2a 20 73 65   pRec++){  /* se
14150 72 69 61 6c 20 64 61 74 61 20 2a 2f 0a 20 20 20  rial data */.   
14160 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   i += sqlite3Vdb
14170 65 53 65 72 69 61 6c 50 75 74 28 26 7a 4e 65 77  eSerialPut(&zNew
14180 52 65 63 6f 72 64 5b 69 5d 2c 20 28 69 6e 74 29  Record[i], (int)
14190 28 6e 42 79 74 65 2d 69 29 2c 20 70 52 65 63 2c  (nByte-i), pRec,
141a0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20  file_format);.  
141b0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e  }.  assert( i==n
141c0 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72  Byte );..  asser
141d0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
141e0 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
141f0 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20   );.  pOut->n = 
14200 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f  (int)nByte;.  pO
14210 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
14220 42 6c 6f 62 20 7c 20 4d 45 4d 5f 44 79 6e 3b 0a  Blob | MEM_Dyn;.
14230 20 20 70 4f 75 74 2d 3e 78 44 65 6c 20 3d 20 30    pOut->xDel = 0
14240 3b 0a 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b  ;.  if( nZero ){
14250 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65  .    pOut->u.nZe
14260 72 6f 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20  ro = nZero;.    
14270 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pOut->flags |= M
14280 45 4d 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 70  EM_Zero;.  }.  p
14290 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Out->enc = SQLIT
142a0 45 5f 55 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63  E_UTF8;  /* In c
142b0 61 73 65 20 74 68 65 20 62 6c 6f 62 20 69 73 20  ase the blob is 
142c0 65 76 65 72 20 63 6f 6e 76 65 72 74 65 64 20 74  ever converted t
142d0 6f 20 74 65 78 74 20 2a 2f 0a 20 20 52 45 47 49  o text */.  REGI
142e0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
142f0 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50 44  p3, pOut);.  UPD
14300 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
14310 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
14320 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  .}../* Opcode: C
14330 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  ount P1 P2 * * *
14340 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65  .**.** Store the
14350 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
14360 65 73 20 28 61 6e 20 69 6e 74 65 67 65 72 20 76  es (an integer v
14370 61 6c 75 65 29 20 69 6e 20 74 68 65 20 74 61 62  alue) in the tab
14380 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a 2a 2a 20  le or index .** 
14390 6f 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72  opened by cursor
143a0 20 50 31 20 69 6e 20 72 65 67 69 73 74 65 72 20   P1 in register 
143b0 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  P2.*/.#ifndef SQ
143c0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
143d0 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f 43 6f 75  OUNT.case OP_Cou
143e0 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  nt: {         /*
143f0 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65   out2-prerelease
14400 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72 79   */.  i64 nEntry
14410 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14420 72 73 72 3b 0a 0a 20 20 70 43 72 73 72 20 3d 20  rsr;..  pCrsr = 
14430 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
14440 5d 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  ]->pCursor;.  if
14450 28 20 70 43 72 73 72 20 29 7b 0a 20 20 20 20 72  ( pCrsr ){.    r
14460 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14470 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
14480 6e 74 72 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ntry);.  }else{.
14490 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a      nEntry = 0;.
144a0 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20    }.  pOut->u.i 
144b0 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61  = nEntry;.  brea
144c0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
144d0 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e  Opcode: Savepoin
144e0 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  t P1 * * P4 *.**
144f0 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73  .** Open, releas
14500 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e or rollback th
14510 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65  e savepoint name
14520 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50  d by parameter P
14530 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  4, depending.** 
14540 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
14550 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65  P1. To open a ne
14560 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  w savepoint, P1=
14570 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28  =0. To release (
14580 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78  commit) an.** ex
14590 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
145a0 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72  , P1==1, or to r
145b0 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74  ollback an exist
145c0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31  ing savepoint P1
145d0 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ==2..*/.case OP_
145e0 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  Savepoint: {.  i
145f0 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14610 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70  * Value of P1 op
14620 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20  erand */.  char 
14630 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
14640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
14650 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20  me of savepoint 
14660 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
14670 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65    Savepoint *pNe
14680 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  w;.  Savepoint *
14690 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61  pSavepoint;.  Sa
146a0 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20  vepoint *pTmp;. 
146b0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b   int iSavepoint;
146c0 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31  .  int ii;..  p1
146d0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e   = pOp->p1;.  zN
146e0 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ame = pOp->p4.z;
146f0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
14700 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65  at the p1 parame
14710 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c  ter is valid. Al
14720 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65  so that if there
14730 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a   is no open.  **
14740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
14750 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20  en there cannot 
14760 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  be any savepoint
14770 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
14780 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t( db->pSavepoin
14790 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  t==0 || db->auto
147a0 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
147b0 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50  ssert( p1==SAVEP
147c0 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d  OINT_BEGIN||p1==
147d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
147e0 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  E||p1==SAVEPOINT
147f0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
14800 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
14810 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54  point || db->isT
14820 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
14830 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  int==0 );.  asse
14840 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
14850 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 0a  ntCount(db) );..
14860 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
14870 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20 20 20  INT_BEGIN ){.   
14880 20 69 66 28 20 64 62 2d 3e 77 72 69 74 65 56 64   if( db->writeVd
14890 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  beCnt>0 ){.     
148a0 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
148b0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
148c0 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
148d0 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
148e0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
148f0 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
14900 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
14910 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
14920 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
14930 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
14940 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
14950 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 6f  g, db, "cannot o
14960 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 2d 20  pen savepoint - 
14970 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20 73  ".        "SQL s
14980 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f  tatements in pro
14990 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72  gress");.      r
149a0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
149b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
149c0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
149d0 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
149e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
149f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14a00 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  BLE.      /* Thi
14a10 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65  s call is Ok eve
14a20 6e 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f  n if this savepo
14a30 69 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  int is actually 
14a40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
14a50 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
14a60 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
14a70 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70  should not promp
14a80 74 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20  t xSavepoint()) 
14a90 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20  callbacks..     
14aa0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
14ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
14ac0 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65  epoint being ope
14ad0 6e 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  ned, it is guara
14ae0 6e 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  nteed.      ** t
14af0 68 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72  hat the db->aVTr
14b00 61 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65  ans[] array is e
14b10 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mpty.  */.      
14b20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f  assert( db->auto
14b30 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
14b40 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20  >nVTrans==0 );. 
14b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b60 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
14b70 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  b, SAVEPOINT_BEG
14b80 49 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN,.            
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
14bb0 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
14bc0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
14bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
14be0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
14bf0 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20  error;.#endif.. 
14c00 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
14c10 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73   new savepoint s
14c20 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
14c30 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
14c40 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
14c50 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e   sizeof(Savepoin
14c60 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  t)+nName+1);.   
14c70 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
14c80 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61         pNew->zNa
14c90 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e  me = (char *)&pN
14ca0 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ew[1];.        m
14cb0 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d  emcpy(pNew->zNam
14cc0 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
14cd0 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20  1);.    .       
14ce0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14cf0 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  no open transact
14d00 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ion, then mark t
14d10 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
14d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61  .        ** "tra
14d30 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
14d40 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nt". */.        
14d50 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
14d60 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
14d70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14d80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
14d90 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
14da0 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20  avepoint = 1;.  
14db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14dc0 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
14dd0 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  point++;.       
14de0 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 20 20   }.    .        
14df0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
14e00 73 61 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74  savepoint into t
14e10 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
14e20 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  le's list. */.  
14e30 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
14e40 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  t = db->pSavepoi
14e50 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  nt;.        db->
14e60 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65  pSavepoint = pNe
14e70 77 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  w;.        pNew-
14e80 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14e90 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
14ea0 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ns;.      }.    
14eb0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
14ec0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a  Savepoint = 0;..
14ed0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
14ee0 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  named savepoint.
14ef0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
14f00 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 2c 20  such savepoint, 
14f10 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61  then an.    ** a
14f20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
14f30 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
14f40 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20    */.    for(.  
14f50 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d      pSavepoint =
14f60 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
14f70 20 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69   .      pSavepoi
14f80 6e 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  nt && sqlite3Str
14f90 49 43 6d 70 28 70 53 61 76 65 70 6f 69 6e 74 2d  ICmp(pSavepoint-
14fa0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  >zName, zName);.
14fb0 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
14fc0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70   = pSavepoint->p
14fd0 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20 20 20 20  Next.    ){.    
14fe0 20 20 69 53 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a    iSavepoint++;.
14ff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
15000 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
15010 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
15020 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
15030 20 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 73 61   db, "no such sa
15040 76 65 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e  vepoint: %s", zN
15050 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ame);.      rc =
15060 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15070 20 20 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20     }else if( .  
15080 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56        db->writeV
15090 64 62 65 43 6e 74 3e 30 20 7c 7c 20 28 70 31 3d  dbeCnt>0 || (p1=
150a0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
150b0 41 43 4b 20 26 26 20 64 62 2d 3e 61 63 74 69 76  ACK && db->activ
150c0 65 56 64 62 65 43 6e 74 3e 31 29 20 0a 20 20 20  eVdbeCnt>1) .   
150d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
150e0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
150f0 74 6f 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  to release (comm
15100 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 20  it) a savepoint 
15110 69 66 20 74 68 65 72 65 20 61 72 65 20 0a 20 20  if there are .  
15120 20 20 20 20 2a 2a 20 61 63 74 69 76 65 20 77 72      ** active wr
15130 69 74 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ite statements. 
15140 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
15150 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  le to rollback a
15160 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
15170 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
15180 20 61 6e 79 20 61 63 74 69 76 65 20 73 74 61 74   any active stat
15190 65 6d 65 6e 74 73 20 61 74 20 61 6c 6c 2e 0a 20  ements at all.. 
151a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
151b0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
151c0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
151d0 0a 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74  .        "cannot
151e0 20 25 73 20 73 61 76 65 70 6f 69 6e 74 20 2d 20   %s savepoint - 
151f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
15200 6e 20 70 72 6f 67 72 65 73 73 22 2c 0a 20 20 20  n progress",.   
15210 20 20 20 20 20 28 70 31 3d 3d 53 41 56 45 50 4f       (p1==SAVEPO
15220 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 3f 20 22  INT_ROLLBACK ? "
15230 72 6f 6c 6c 62 61 63 6b 22 3a 20 22 72 65 6c 65  rollback": "rele
15240 61 73 65 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  ase").      );. 
15250 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15260 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
15270 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65  {..      /* Dete
15280 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
15290 20 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74   not this is a t
152a0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
152b0 6f 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20  oint. If so,.   
152c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69     ** and this i
152d0 73 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d  s a RELEASE comm
152e0 61 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  and, then the cu
152f0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
15300 6e 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  n .      ** is c
15310 6f 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20  ommitted. .     
15320 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
15330 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53  Transaction = pS
15340 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d  avepoint->pNext=
15350 3d 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e  =0 && db->isTran
15360 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
15370 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72  ;.      if( isTr
15380 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d  ansaction && p1=
15390 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
153a0 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  SE ){.        if
153b0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56  ( (rc = sqlite3V
153c0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
153d0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
153e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76            goto v
153f0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
15400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62      }.        db
15410 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
15420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
15430 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
15440 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
15450 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63  .          p->pc
15460 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 20 20 20   = pc;.         
15470 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
15480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
15490 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c 49  ->rc = rc = SQLI
154a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
154b0 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74     goto vdbe_ret
154c0 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
154d0 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
154e0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
154f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
15500 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  c = p->rc;.     
15510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15520 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  iSavepoint = db-
15530 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53  >nSavepoint - iS
15540 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20  avepoint - 1;.  
15550 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
15560 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b  ii<db->nDb; ii++
15570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
15580 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
15590 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  vepoint(db->aDb[
155a0 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69 53 61  ii].pBt, p1, iSa
155b0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
155c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
155d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
155e0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
155f0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
15600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15620 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p1==SAVEPOINT_RO
15630 4c 4c 42 41 43 4b 20 26 26 20 28 64 62 2d 3e 66  LLBACK && (db->f
15640 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
15650 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 29 7b  rnChanges)!=0 ){
15660 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15670 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
15680 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
15690 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
156a0 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
156b0 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20  hema(db, -1);.  
156c0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
156d0 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c  s = (db->flags |
156e0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
156f0 61 6e 67 65 73 29 3b 0a 20 20 20 20 20 20 20 20  anges);.        
15700 7d 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  }.      }.  .   
15710 20 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73     /* Regardless
15720 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 69 73   of whether this
15730 20 69 73 20 61 20 52 45 4c 45 41 53 45 20 6f 72   is a RELEASE or
15740 20 52 4f 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72   ROLLBACK, destr
15750 6f 79 20 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a  oy all .      **
15760 20 73 61 76 65 70 6f 69 6e 74 73 20 6e 65 73 74   savepoints nest
15770 65 64 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  ed inside of the
15780 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
15790 20 6f 70 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f   operated on. */
157a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62  .      while( db
157b0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 21 3d 70 53  ->pSavepoint!=pS
157c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
157d0 20 20 20 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70      pTmp = db->p
157e0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20  Savepoint;.     
157f0 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
15800 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
15810 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15820 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
15830 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53  ;.        db->nS
15840 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20  avepoint--;.    
15850 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
15860 20 69 74 20 69 73 20 61 20 52 45 4c 45 41 53 45   it is a RELEASE
15870 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74  , then destroy t
15880 68 65 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69  he savepoint bei
15890 6e 67 20 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a  ng operated on .
158a0 20 20 20 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66        ** too. If
158b0 20 69 74 20 69 73 20 61 20 52 4f 4c 4c 42 41 43   it is a ROLLBAC
158c0 4b 20 54 4f 2c 20 74 68 65 6e 20 73 65 74 20 74  K TO, then set t
158d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 66  he number of def
158e0 65 72 72 65 64 20 0a 20 20 20 20 20 20 2a 2a 20  erred .      ** 
158f0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
15900 74 69 6f 6e 73 20 70 72 65 73 65 6e 74 20 69 6e  tions present in
15910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
15920 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
15930 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  d.      ** when 
15940 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 61  the savepoint wa
15950 73 20 63 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20  s created.  */. 
15960 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41 56       if( p1==SAV
15970 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
15980 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15990 28 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62  ( pSavepoint==db
159a0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->pSavepoint );.
159b0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
159c0 65 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f  epoint = pSavepo
159d0 69 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  int->pNext;.    
159e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
159f0 65 28 64 62 2c 20 70 53 61 76 65 70 6f 69 6e 74  e(db, pSavepoint
15a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
15a10 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  isTransaction ){
15a20 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
15a30 53 61 76 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20  Savepoint--;.   
15a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
15a50 73 65 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  se{.        db->
15a60 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
15a70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66  pSavepoint->nDef
15a80 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20  erredCons;.     
15a90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 21 69   }..      if( !i
15aa0 73 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  sTransaction ){.
15ab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15ac0 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
15ad0 74 28 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70  t(db, p1, iSavep
15ae0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69  oint);.        i
15af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15b00 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
15b10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
15b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15b30 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
15b40 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69 74  code: AutoCommit
15b50 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
15b60 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  ** Set the datab
15b70 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  ase auto-commit 
15b80 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f 72  flag to P1 (1 or
15b90 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74 72   0). If P2 is tr
15ba0 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63 6b  ue, roll.** back
15bb0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 61   any currently a
15bc0 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61 6e  ctive btree tran
15bd0 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 65  sactions. If the
15be0 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76  re are any activ
15bf0 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74 20  e.** VMs (apart 
15c00 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c 20  from this one), 
15c10 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20  then a ROLLBACK 
15c20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49 54  fails.  A COMMIT
15c30 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68 65   fails if.** the
15c40 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77 72  re are active wr
15c50 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63 74  iting VMs or act
15c60 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73 65  ive VMs that use
15c70 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a 2a   shared cache..*
15c80 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75  *.** This instru
15c90 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68 65  ction causes the
15ca0 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f 0a   VM to halt..*/.
15cb0 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
15cc0 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73 69  it: {.  int desi
15cd0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
15ce0 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b 0a   int iRollback;.
15cf0 20 20 69 6e 74 20 74 75 72 6e 4f 6e 41 43 3b 0a    int turnOnAC;.
15d00 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  .  desiredAutoCo
15d10 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  mmit = pOp->p1;.
15d20 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70 4f    iRollback = pO
15d30 70 2d 3e 70 32 3b 0a 20 20 74 75 72 6e 4f 6e 41  p->p2;.  turnOnA
15d40 43 20 3d 20 64 65 73 69 72 65 64 41 75 74 6f 43  C = desiredAutoC
15d50 6f 6d 6d 69 74 20 26 26 20 21 64 62 2d 3e 61 75  ommit && !db->au
15d60 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 61 73 73 65  toCommit;.  asse
15d70 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
15d80 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69  ommit==1 || desi
15d90 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  redAutoCommit==0
15da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
15db0 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d  siredAutoCommit=
15dc0 3d 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d  =1 || iRollback=
15dd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15de0 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
15df0 74 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65  t>0 );  /* At le
15e00 61 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d 20  ast this one VM 
15e10 69 73 20 61 63 74 69 76 65 20 2a 2f 0a 0a 20 20  is active */..  
15e20 69 66 28 20 74 75 72 6e 4f 6e 41 43 20 26 26 20  if( turnOnAC && 
15e30 69 52 6f 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d  iRollback && db-
15e40 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
15e50 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
15e60 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
15e70 6d 70 6c 65 6d 65 6e 74 73 20 61 20 52 4f 4c 4c  mplements a ROLL
15e80 42 41 43 4b 20 61 6e 64 20 6f 74 68 65 72 20 56  BACK and other V
15e90 4d 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 74  Ms are.    ** st
15ea0 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 61 6e 64  ill running, and
15eb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15ec0 73 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  s active, return
15ed0 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69 63 61   an error indica
15ee0 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 61 74  ting.    ** that
15ef0 20 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d   the other VMs m
15f00 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72  ust complete fir
15f10 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  st. .    */.    
15f20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
15f30 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
15f40 2c 20 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  , "cannot rollba
15f50 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d  ck transaction -
15f60 20 22 0a 20 20 20 20 20 20 20 20 22 53 51 4c 20   ".        "SQL 
15f70 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
15f80 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 72 63  ogress");.    rc
15f90 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
15fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 74 75 72 6e    }else if( turn
15fb0 4f 6e 41 43 20 26 26 20 21 69 52 6f 6c 6c 62 61  OnAC && !iRollba
15fc0 63 6b 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56  ck && db->writeV
15fd0 64 62 65 43 6e 74 3e 30 20 29 7b 0a 20 20 20 20  dbeCnt>0 ){.    
15fe0 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 73 74 72  /* If this instr
15ff0 75 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  uction implement
16000 73 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f  s a COMMIT and o
16010 74 68 65 72 20 56 4d 73 20 61 72 65 20 77 72 69  ther VMs are wri
16020 74 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 74 75  ting.    ** retu
16030 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
16040 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
16050 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 63  other VMs must c
16060 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20 0a  omplete first. .
16070 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
16080 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
16090 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 63 61  zErrMsg, db, "ca
160a0 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e  nnot commit tran
160b0 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20  saction - ".    
160c0 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
160d0 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
160e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
160f0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
16100 20 69 66 28 20 64 65 73 69 72 65 64 41 75 74 6f   if( desiredAuto
16110 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f  Commit!=db->auto
16120 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 69 66  Commit ){.    if
16130 28 20 69 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( iRollback ){. 
16140 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
16150 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
16160 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
16170 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
16180 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74  );.      db->aut
16190 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
161a0 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d   }else if( (rc =
161b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
161c0 6b 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49  kFk(p, 1))!=SQLI
161d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
161e0 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
161f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16200 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16210 20 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75   = (u8)desiredAu
16220 74 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20  toCommit;.      
16230 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48  if( sqlite3VdbeH
16240 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42  alt(p)==SQLITE_B
16250 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70  USY ){.        p
16260 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20  ->pc = pc;.     
16270 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
16280 74 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72  t = (u8)(1-desir
16290 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20  edAutoCommit);. 
162a0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
162b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
162c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64  .        goto vd
162d0 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
162e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
162f0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
16300 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ent==0 );.    sq
16310 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
16320 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66  ints(db);.    if
16330 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16340 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
16350 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16370 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
16380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
16390 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
163a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
163b0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
163c0 7a 45 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20 20  zErrMsg, db,.   
163d0 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41 75       (!desiredAu
163e0 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f  toCommit)?"canno
163f0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
16400 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74  ction within a t
16410 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20  ransaction":(.  
16420 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b        (iRollback
16430 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61  )?"cannot rollba
16440 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  ck - no transact
16450 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a 0a  ion is active":.
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69     "cannot commi
16480 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
16490 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29 3b  on is active"));
164a0 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 72  .         .    r
164b0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
164c0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
164d0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  ../* Opcode: Tra
164e0 6e 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20 2a  nsaction P1 P2 *
164f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e   * *.**.** Begin
16500 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
16510 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
16520 20 65 6e 64 73 20 77 68 65 6e 20 61 20 43 6f 6d   ends when a Com
16530 6d 69 74 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 0a  mit or Rollback.
16540 2a 2a 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  ** opcode is enc
16550 6f 75 6e 74 65 72 65 64 2e 20 20 44 65 70 65 6e  ountered.  Depen
16560 64 69 6e 67 20 6f 6e 20 74 68 65 20 4f 4e 20 43  ding on the ON C
16570 4f 4e 46 4c 49 43 54 20 73 65 74 74 69 6e 67 2c  ONFLICT setting,
16580 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
16590 69 6f 6e 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  ion might also b
165a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66  e rolled back if
165b0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
165c0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
165d0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
165e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
165f0 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68  file on which th
16600 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
16610 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20 49 6e  .** started.  In
16620 64 65 78 20 30 20 69 73 20 74 68 65 20 6d 61 69  dex 0 is the mai
16630 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
16640 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73 20 74  and index 1 is t
16650 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65 64 20  he.** file used 
16660 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61  for temporary ta
16670 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73 20 6f  bles.  Indices o
16680 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72 65 20  f 2 or more are 
16690 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61  used for.** atta
166a0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a  ched databases..
166b0 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e  **.** If P2 is n
166c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
166d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
166e0 6e 20 69 73 20 73 74 61 72 74 65 64 2e 20 20 41  n is started.  A
166f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16700 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 6f 6e  s.** obtained on
16710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16720 6c 65 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  le when a write-
16730 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
16740 74 61 72 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20 6f  tarted.  No.** o
16750 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e  ther process can
16760 20 73 74 61 72 74 20 61 6e 6f 74 68 65 72 20 77   start another w
16770 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16780 20 77 68 69 6c 65 20 74 68 69 73 20 74 72 61 6e   while this tran
16790 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e  saction is.** un
167a0 64 65 72 77 61 79 2e 20 20 53 74 61 72 74 69 6e  derway.  Startin
167b0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
167c0 63 74 69 6f 6e 20 61 6c 73 6f 20 63 72 65 61 74  ction also creat
167d0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
167e0 75 72 6e 61 6c 2e 20 41 0a 2a 2a 20 77 72 69 74  urnal. A.** writ
167f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e transaction mu
16800 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
16810 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
16820 20 63 61 6e 20 62 65 20 6d 61 64 65 20 74 6f 20   can be made to 
16830 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  the.** database.
16840 20 20 49 66 20 50 32 20 69 73 20 32 20 6f 72 20    If P2 is 2 or 
16850 67 72 65 61 74 65 72 20 74 68 65 6e 20 61 6e 20  greater then an 
16860 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
16870 73 20 61 6c 73 6f 20 6f 62 74 61 69 6e 65 64 0a  s also obtained.
16880 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
16890 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74 65  **.** If a write
168a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
168b0 73 74 61 72 74 65 64 20 61 6e 64 20 74 68 65 20  started and the 
168c0 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a 6f 75  Vdbe.usesStmtJou
168d0 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a 2a 20  rnal flag is.** 
168e0 74 72 75 65 20 28 74 68 69 73 20 66 6c 61 67 20  true (this flag 
168f0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 56 64  is set if the Vd
16900 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20 6d 6f  be may modify mo
16910 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77 20  re than one row 
16920 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77  and may.** throw
16930 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74   an ABORT except
16940 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d 65 6e  ion), a statemen
16950 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  t transaction ma
16960 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e 65 64  y also be opened
16970 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  ..** More specif
16980 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74 65 6d  ically, a statem
16990 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
169a0 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20 74 68  is opened iff th
169b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
169c0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nnection is curr
169d0 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61 75 74  ently not in aut
169e0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 6f 72  ocommit mode, or
169f0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   if there are ot
16a00 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20 73 74  her.** active st
16a10 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74 61 74  atements. A stat
16a20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
16a30 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 61 66 66  n allows the aff
16a40 65 63 74 73 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ects of this.** 
16a50 56 44 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65  VDBE to be rolle
16a60 64 20 62 61 63 6b 20 61 66 74 65 72 20 61 6e 20  d back after an 
16a70 65 72 72 6f 72 20 77 69 74 68 6f 75 74 20 68 61  error without ha
16a80 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63  ving to roll bac
16a90 6b 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  k the.** entire 
16aa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
16ab0 6e 6f 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  no error is enco
16ac0 75 6e 74 65 72 65 64 2c 20 74 68 65 20 73 74 61  untered, the sta
16ad0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
16ae0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d  on.** will autom
16af0 61 74 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20  atically commit 
16b00 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 68 61  when the VDBE ha
16b10 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32  lts..**.** If P2
16b20 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
16b30 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
16b40 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  tained on the da
16b50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
16b60 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
16b70 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20 2a  ion: {.  Btree *
16b80 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
16b90 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
16ba0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
16bb0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
16bc0 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
16bd0 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70  bMask)1)<<pOp->p
16be0 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20  1))!=0 );.  pBt 
16bf0 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
16c00 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  1].pBt;..  if( p
16c10 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  Bt ){.    rc = s
16c20 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
16c30 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e  Trans(pBt, pOp->
16c40 70 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  p2);.    if( rc=
16c50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
16c60 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70 63        p->pc = pc
16c70 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
16c80 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16c90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
16ca0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  e_return;.    }.
16cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
16cd0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
16ce0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20  _error;.    }.. 
16cf0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26     if( pOp->p2 &
16d00 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
16d10 72 6e 61 6c 20 0a 20 20 20 20 20 26 26 20 28 64  rnal .     && (d
16d20 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
16d30 20 7c 7c 20 64 62 2d 3e 61 63 74 69 76 65 56 64   || db->activeVd
16d40 62 65 43 6e 74 3e 31 29 20 0a 20 20 20 20 29 7b  beCnt>1) .    ){
16d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16d60 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
16d70 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20 20  rans(pBt) );.   
16d80 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74 65     if( p->iState
16d90 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ment==0 ){.     
16da0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16db0 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26 20  Statement>=0 && 
16dc0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 3d  db->nSavepoint>=
16dd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  0 );.        db-
16de0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20 0a  >nStatement++; .
16df0 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61 74          p->iStat
16e00 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76  ement = db->nSav
16e10 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53 74  epoint + db->nSt
16e20 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20 7d  atement;.      }
16e30 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
16e40 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
16e50 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
16e60 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74 65  BEGIN, p->iState
16e70 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20 69  ment-1);.      i
16e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16e90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
16eb0 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e 69  inStmt(pBt, p->i
16ec0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20  Statement);.    
16ed0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74    }..      /* St
16ee0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
16ef0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
16f00 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
16f10 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
16f20 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  t.      ** count
16f30 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74 65  er. If the state
16f40 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
16f50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
16f60 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20 20  led back,.      
16f70 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
16f80 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65 65  this counter nee
16f90 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
16fa0 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20 20  d too.  */.     
16fb0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
16fc0 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
16fd0 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
16fe0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
16ff0 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b 69  pcode: ReadCooki
17000 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
17010 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69 65  *.** Read cookie
17020 20 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d 20   number P3 from 
17030 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64 20  database P1 and 
17040 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72 65  write it into re
17050 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50 33  gister P2..** P3
17060 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65 6d  ==1 is the schem
17070 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d 3d  a version.  P3==
17080 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  2 is the databas
17090 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33 3d  e format..** P3=
170a0 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d  =3 is the recomm
170b0 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63 68  ended pager cach
170c0 65 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20 66  e size, and so f
170d0 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73 0a  orth.  P1==0 is.
170e0 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ** the main data
170f0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31  base file and P1
17100 3d 3d 31 20 69 73 20 74 68 65 20 64 61 74 61 62  ==1 is the datab
17110 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f  ase file used to
17120 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72   store.** tempor
17130 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
17140 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
17150 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
17160 68 65 20 64 61 74 61 62 61 73 65 20 28 65 69 74  he database (eit
17170 68 65 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  her a transactio
17180 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74 61  n.** must be sta
17190 72 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d 75  rted or there mu
171a0 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75  st be an open cu
171b0 72 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a 20  rsor) before.** 
171c0 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 69  executing this i
171d0 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  nstruction..*/.c
171e0 61 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  ase OP_ReadCooki
171f0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  e: {            
17200 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
17210 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lease */.  int i
17220 4d 65 74 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Meta;.  int iDb;
17230 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a  .  int iCookie;.
17240 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  .  iDb = pOp->p1
17250 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f  ;.  iCookie = pO
17260 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
17270 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f   pOp->p3<SQLITE_
17280 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
17290 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
172a0 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
172b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
172c0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
172d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
172e0 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
172f0 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
17300 29 29 21 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ))!=0 );..  sqli
17310 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
17320 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
17330 2c 20 69 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20  , iCookie, (u32 
17340 2a 29 26 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75  *)&iMeta);.  pOu
17350 74 2d 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a  t->u.i = iMeta;.
17360 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
17370 70 63 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65  pcode: SetCookie
17380 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
17390 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f  .** Write the co
173a0 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
173b0 72 20 50 33 20 28 69 6e 74 65 72 70 72 65 74 65  r P3 (interprete
173c0 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 29  d as an integer)
173d0 0a 2a 2a 20 69 6e 74 6f 20 63 6f 6f 6b 69 65 20  .** into cookie 
173e0 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64 61 74  number P2 of dat
173f0 61 62 61 73 65 20 50 31 2e 20 20 50 32 3d 3d 31  abase P1.  P2==1
17400 20 69 73 20 74 68 65 20 73 63 68 65 6d 61 20 76   is the schema v
17410 65 72 73 69 6f 6e 2e 20 20 0a 2a 2a 20 50 32 3d  ersion.  .** P2=
17420 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
17430 73 65 20 66 6f 72 6d 61 74 2e 20 50 32 3d 3d 33  se format. P2==3
17440 20 69 73 20 74 68 65 20 72 65 63 6f 6d 6d 65 6e   is the recommen
17450 64 65 64 20 70 61 67 65 72 20 63 61 63 68 65 20  ded pager cache 
17460 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f  .** size, and so
17470 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69   forth.  P1==0 i
17480 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
17490 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50 31 3d  ase file and P1=
174a0 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a 20 64 61  =1 is the .** da
174b0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
174c0 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72   to store tempor
174d0 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  ary tables..**.*
174e0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
174f0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
17500 62 65 66 6f 72 65 20 65 78 65 63 75 74 69 6e 67  before executing
17510 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2f   this opcode..*/
17520 0a 63 61 73 65 20 4f 50 5f 53 65 74 43 6f 6f 6b  .case OP_SetCook
17530 69 65 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  ie: {       /* i
17540 6e 33 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  n3 */.  Db *pDb;
17550 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
17560 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45  p2<SQLITE_N_BTRE
17570 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65  E_META );.  asse
17580 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
17590 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44  & pOp->p1<db->nD
175a0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  b );.  assert( (
175b0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28  p->btreeMask & (
175c0 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f  ((yDbMask)1)<<pO
175d0 70 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20  p->p1))!=0 );.  
175e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70  pDb = &db->aDb[p
175f0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
17600 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29  t( pDb->pBt!=0 )
17610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17620 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
17630 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
17640 30 29 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26  0) );.  pIn3 = &
17650 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
17660 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
17670 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b  ntegerify(pIn3);
17680 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20 61  .  /* See note a
17690 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66 74  bout index shift
176a0 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43 6f  ing on OP_ReadCo
176b0 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73  okie */.  rc = s
176c0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
176d0 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c 20  eMeta(pDb->pBt, 
176e0 70 4f 70 2d 3e 70 32 2c 20 28 69 6e 74 29 70 49  pOp->p2, (int)pI
176f0 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 69 66 28 20  n3->u.i);.  if( 
17700 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53  pOp->p2==BTREE_S
17710 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b  CHEMA_VERSION ){
17720 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
17730 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63   schema cookie c
17740 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74  hanges, record t
17750 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e  he new cookie in
17760 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  ternally */.    
17770 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  pDb->pSchema->sc
17780 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28 69  hema_cookie = (i
17790 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn3->u.i;.  
177a0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
177b0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
177c0 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ges;.  }else if(
177d0 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f   pOp->p2==BTREE_
177e0 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a 20  FILE_FORMAT ){. 
177f0 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 61     /* Record cha
17800 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  nges in the file
17810 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70   format */.    p
17820 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
17830 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29 70  e_format = (u8)p
17840 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  In3->u.i;.  }.  
17850 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29  if( pOp->p1==1 )
17860 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64  {.    /* Invalid
17870 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65 64  ate all prepared
17880 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e   statements when
17890 65 76 65 72 20 74 68 65 20 54 45 4d 50 20 64 61  ever the TEMP da
178a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73 63  tabase.    ** sc
178b0 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64 2e  hema is changed.
178c0 20 20 54 69 63 6b 65 74 20 23 31 36 34 34 20 2a    Ticket #1644 *
178d0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
178e0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
178f0 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 70  ments(db);.    p
17900 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20  ->expired = 0;. 
17910 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
17920 2a 20 4f 70 63 6f 64 65 3a 20 56 65 72 69 66 79  * Opcode: Verify
17930 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20  Cookie P1 P2 P3 
17940 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20  * *.**.** Check 
17950 74 68 65 20 76 61 6c 75 65 20 6f 66 20 67 6c 6f  the value of glo
17960 62 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 72  bal database par
17970 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 30 20  ameter number 0 
17980 28 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 76  (the.** schema v
17990 65 72 73 69 6f 6e 29 20 61 6e 64 20 6d 61 6b 65  ersion) and make
179a0 20 73 75 72 65 20 69 74 20 69 73 20 65 71 75 61   sure it is equa
179b0 6c 20 74 6f 20 50 32 20 61 6e 64 20 74 68 61 74  l to P2 and that
179c0 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 74 69   the.** generati
179d0 6f 6e 20 63 6f 75 6e 74 65 72 20 6f 6e 20 74 68  on counter on th
179e0 65 20 6c 6f 63 61 6c 20 73 63 68 65 6d 61 20 70  e local schema p
179f0 61 72 73 65 20 65 71 75 61 6c 73 20 50 33 2e 0a  arse equals P3..
17a00 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
17a10 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
17a20 77 68 69 63 68 20 69 73 20 30 20 66 6f 72 20 74  which is 0 for t
17a30 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17a40 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31 20 66   file.** and 1 f
17a50 6f 72 20 74 68 65 20 66 69 6c 65 20 68 6f 6c 64  or the file hold
17a60 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
17a70 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20 68 69  bles and some hi
17a80 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 66  gher number.** f
17a90 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  or auxiliary dat
17aa0 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
17ab0 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
17ac0 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
17ad0 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
17ae0 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
17af0 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
17b00 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
17b10 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
17b20 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
17b30 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
17b40 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
17b50 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
17b60 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
17b70 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61  ..**.** Either a
17b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
17b90 64 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  ds to have been 
17ba0 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f 50  started or an OP
17bb0 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74  _Open needs.** t
17bc0 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 28 74  o be executed (t
17bd0 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
17be0 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20  ad lock) before 
17bf0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a  this opcode is.*
17c00 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61  * invoked..*/.ca
17c10 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  se OP_VerifyCook
17c20 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69 4d 65 74  ie: {.  int iMet
17c30 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a 20  a;.  int iGen;. 
17c40 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20   Btree *pBt;..  
17c50 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
17c60 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
17c70 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
17c80 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
17c90 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
17ca0 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30 20 29  <<pOp->p1))!=0 )
17cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17cc0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
17cd0 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
17ce0 30 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62  0) );.  pBt = db
17cf0 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70  ->aDb[pOp->p1].p
17d00 42 74 3b 0a 20 20 69 66 28 20 70 42 74 20 29 7b  Bt;.  if( pBt ){
17d10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17d20 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42 54  eGetMeta(pBt, BT
17d30 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
17d40 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74  ON, (u32 *)&iMet
17d50 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20 64  a);.    iGen = d
17d60 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
17d70 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
17d80 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
17d90 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61 20     iGen = iMeta 
17da0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 0;.  }.  if( i
17db0 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20 7c 7c  Meta!=pOp->p2 ||
17dc0 20 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 33 20 29   iGen!=pOp->p3 )
17dd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
17de0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
17df0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
17e00 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
17e10 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61 62  trDup(db, "datab
17e20 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
17e30 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a  hanged");.    /*
17e40 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d 63   If the schema-c
17e50 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20 64  ookie from the d
17e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 74  atabase file mat
17e70 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  ches the cookie 
17e80 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 77  .    ** stored w
17e90 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ith the in-memor
17ea0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
17eb0 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c 20   of the schema, 
17ec0 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65  do.    ** not re
17ed0 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61 20  load the schema 
17ee0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
17ef0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
17f00 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61 6c     ** If virtual
17f10 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20 75  -tables are in u
17f20 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74 20  se, this is not 
17f30 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61  just an optimiza
17f40 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74  tion..    ** Oft
17f50 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74 6f  en, v-tables sto
17f60 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69 6e  re their data in
17f70 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74 61   other SQLite ta
17f80 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20 20  bles, which.    
17f90 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20 66  ** are queried f
17fa0 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78 74  rom within xNext
17fb0 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d 74  () and other v-t
17fc0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73 69  able methods usi
17fd0 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61 72  ng.    ** prepar
17fe0 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20 73  ed queries. If s
17ff0 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20 6f  uch a query is o
18000 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20 64  ut-of-date, we d
18010 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20  o not want to.  
18020 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
18030 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18040 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63 6f  , as the user co
18050 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  de implementing 
18060 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62  the.    ** v-tab
18070 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  le would have to
18080 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74 68   be ready for th
18090 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  e sqlite3_vtab s
180a0 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 0a  tructure itself.
180b0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
180c0 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76 65  alidated wheneve
180d0 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  r sqlite3_step()
180e0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
180f0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61  within .    ** a
18100 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e   v-table method.
18110 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18120 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
18130 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
18140 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29  _cookie!=iMeta )
18150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
18160 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
18170 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ma(db, pOp->p1);
18180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 65  .    }..    p->e
18190 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  xpired = 1;.    
181a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 53 43 48 45  rc = SQLITE_SCHE
181b0 4d 41 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  MA;.  }.  break;
181c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
181d0 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50 33  penRead P1 P2 P3
181e0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65   P4 P5.**.** Ope
181f0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
18200 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
18210 61 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73  abase table whos
18220 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a  e root page is.*
18230 2a 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61  * P2 in a databa
18240 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61  se file.  The da
18250 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64  tabase file is d
18260 65 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e  etermined by P3.
18270 20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73   .** P3==0 means
18280 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
18290 73 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20  se, P3==1 means 
182a0 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
182b0 64 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72  d for .** tempor
182c0 61 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20  ary tables, and 
182d0 50 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20  P3>1 means used 
182e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
182f0 67 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61  g attached.** da
18300 74 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68  tabase.  Give th
18310 65 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20  e new cursor an 
18320 69 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31  identifier of P1
18330 2e 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c  .  The P1.** val
18340 75 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ues need not be 
18350 63 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61  contiguous but a
18360 6c 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f  ll P1 values sho
18370 75 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74  uld be small int
18380 65 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20  egers..** It is 
18390 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20  an error for P1 
183a0 74 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a  to be negative..
183b0 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74  **.** If P5!=0 t
183c0 68 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74  hen use the cont
183d0 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
183e0 50 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70  P2 as the root p
183f0 61 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  age, not.** the 
18400 76 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65  value of P2 itse
18410 6c 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  lf..**.** There 
18420 77 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c  will be a read l
18430 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
18440 61 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65  ase whenever the
18450 72 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e  re is an.** open
18460 20 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65   cursor.  If the
18470 20 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e   database was un
18480 6c 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  locked prior to 
18490 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
184a0 0a 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20  .** then a read 
184b0 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64  lock is acquired
184c0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
184d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41   instruction.  A
184e0 20 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c   read.** lock al
184f0 6c 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65  lows other proce
18500 73 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65  sses to read the
18510 20 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72   database but pr
18520 6f 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f  ohibits.** any o
18530 74 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f  ther process fro
18540 6d 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  m modifying the 
18550 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72  database.  The r
18560 65 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72  ead lock is.** r
18570 65 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c  eleased when all
18580 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f   cursors are clo
18590 73 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e  sed.  If this in
185a0 73 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70  struction attemp
185b0 74 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72  ts.** to get a r
185c0 65 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69  ead lock but fai
185d0 6c 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74  ls, the script t
185e0 65 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61  erminates with a
185f0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  n.** SQLITE_BUSY
18600 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18610 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20  ** The P4 value 
18620 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e  may be either an
18630 20 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54   integer (P4_INT
18640 33 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72  32) or a pointer
18650 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f   to.** a KeyInfo
18660 20 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b   structure (P4_K
18670 45 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69  EYINFO). If it i
18680 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
18690 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
186a0 75 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69  ucture, then sai
186b0 64 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69  d structure defi
186c0 6e 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nes the content 
186d0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a  and collating .*
186e0 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68  * sequence of th
186f0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70  e index being op
18700 65 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ened. Otherwise,
18710 20 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74   if P4 is an int
18720 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20  eger .** value, 
18730 69 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  it is set to the
18740 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
18750 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ns in the table.
18760 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
18770 4f 70 65 6e 57 72 69 74 65 2e 0a 2a 2f 0a 2f 2a  OpenWrite..*/./*
18780 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
18790 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
187a0 35 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72  5.**.** Open a r
187b0 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72  ead/write cursor
187c0 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68 65   named P1 on the
187d0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
187e0 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  whose root.** pa
187f0 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69 66  ge is P2.  Or if
18800 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20 63   P5!=0 use the c
18810 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
18820 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74 68  er P2 to find th
18830 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a  e.** root page..
18840 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c  **.** The P4 val
18850 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  ue may be either
18860 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34 5f   an integer (P4_
18870 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69 6e  INT32) or a poin
18880 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79 49  ter to.** a KeyI
18890 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28 50  nfo structure (P
188a0 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20 69  4_KEYINFO). If i
188b0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
188c0 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  o a KeyInfo .** 
188d0 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 20  structure, then 
188e0 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20 64  said structure d
188f0 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74 65  efines the conte
18900 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67  nt and collating
18910 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66   .** sequence of
18920 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
18930 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77 69   opened. Otherwi
18940 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e 20  se, if P4 is an 
18950 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c 75  integer .** valu
18960 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f 20  e, it is set to 
18970 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
18980 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
18990 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a 2a  le, or to the.**
189a0 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20 6f   largest index o
189b0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  f any column of 
189c0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
189d0 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e  s actually used.
189e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
189f0 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a 75  ruction works ju
18a00 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61 64  st like OpenRead
18a10 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20   except that it 
18a20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
18a30 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69 74  .** in read/writ
18a40 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20 67  e mode.  For a g
18a50 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65 72  iven table, ther
18a60 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20  e can be one or 
18a70 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  more read-only.*
18a80 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20 73  * cursors or a s
18a90 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74 65  ingle read/write
18aa0 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74 20   cursor but not 
18ab0 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  both..**.** See 
18ac0 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a 2a  also OpenRead..*
18ad0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65  /.case OP_OpenRe
18ae0 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  ad:.case OP_Open
18af0 57 72 69 74 65 3a 20 7b 0a 20 20 69 6e 74 20 6e  Write: {.  int n
18b00 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f  Field;.  KeyInfo
18b10 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
18b20 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b  t p2;.  int iDb;
18b30 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20  .  int wrFlag;. 
18b40 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64   Btree *pX;.  Vd
18b50 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
18b60 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 69 66    Db *pDb;..  if
18b70 28 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  ( p->expired ){.
18b80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18b90 41 42 4f 52 54 3b 0a 20 20 20 20 62 72 65 61 6b  ABORT;.    break
18ba0 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20  ;.  }..  nField 
18bb0 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20  = 0;.  pKeyInfo 
18bc0 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d  = 0;.  p2 = pOp-
18bd0 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70  >p2;.  iDb = pOp
18be0 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
18bf0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
18c00 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
18c10 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  t( (p->btreeMask
18c20 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29 31 29   & (((yDbMask)1)
18c30 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20  <<iDb))!=0 );.  
18c40 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
18c50 44 62 5d 3b 0a 20 20 70 58 20 3d 20 70 44 62 2d  Db];.  pX = pDb-
18c60 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
18c70 70 58 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  pX!=0 );.  if( p
18c80 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  Op->opcode==OP_O
18c90 70 65 6e 57 72 69 74 65 20 29 7b 0a 20 20 20 20  penWrite ){.    
18ca0 77 72 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  wrFlag = 1;.    
18cb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
18cc0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
18cd0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
18ce0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
18cf0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
18d00 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c  < p->minWriteFil
18d10 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20  eFormat ){.     
18d20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
18d30 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53  Format = pDb->pS
18d40 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
18d50 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  at;.    }.  }els
18d60 65 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20  e{.    wrFlag = 
18d70 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70  0;.  }.  if( pOp
18d80 2d 3e 70 35 20 29 7b 0a 20 20 20 20 61 73 73 65  ->p5 ){.    asse
18d90 72 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20  rt( p2>0 );.    
18da0 61 73 73 65 72 74 28 20 70 32 3c 3d 70 2d 3e 6e  assert( p2<=p->n
18db0 4d 65 6d 20 29 3b 0a 20 20 20 20 70 49 6e 32 20  Mem );.    pIn2 
18dc0 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20  = &aMem[p2];.   
18dd0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
18de0 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20  lid(pIn2) );.   
18df0 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
18e00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
18e10 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
18e20 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
18e30 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70  ify(pIn2);.    p
18e40 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75  2 = (int)pIn2->u
18e50 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  .i;.    /* The p
18e60 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63  2 value always c
18e70 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f  omes from a prio
18e80 72 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  r OP_CreateTable
18e90 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20   opcode and.    
18ea0 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77  ** that opcode w
18eb0 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74  ill always set t
18ec0 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32  he p2 value to 2
18ed0 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65   or more or else
18ee0 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66   fail..    ** If
18ef0 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66 61   there were a fa
18f00 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70 61  ilure, the prepa
18f10 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f  red statement wo
18f20 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a  uld have halted.
18f30 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65      ** before re
18f40 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74  aching this inst
18f50 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ruction. */.    
18f60 69 66 28 20 4e 45 56 45 52 28 70 32 3c 32 29 20  if( NEVER(p2<2) 
18f70 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ) {.      rc = S
18f80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18f90 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
18fa0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
18fb0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
18fc0 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
18fd0 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
18fe0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70    pKeyInfo = pOp
18ff0 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
19000 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
19010 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a 20   = ENC(p->db);. 
19020 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79     nField = pKey
19030 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 3b 0a  Info->nField+1;.
19040 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
19050 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
19060 32 20 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20  2 ){.    nField 
19070 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d  = pOp->p4.i;.  }
19080 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
19090 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 75 72 20  p1>=0 );.  pCur 
190a0 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
190b0 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 6e 46 69  (p, pOp->p1, nFi
190c0 65 6c 64 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  eld, iDb, 1);.  
190d0 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67 6f  if( pCur==0 ) go
190e0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 75  to no_mem;.  pCu
190f0 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  r->nullRow = 1;.
19100 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72 65    pCur->isOrdere
19110 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  d = 1;.  rc = sq
19120 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
19130 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67 2c  (pX, p2, wrFlag,
19140 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 2d   pKeyInfo, pCur-
19150 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75  >pCursor);.  pCu
19160 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
19170 65 79 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 53 69  eyInfo;..  /* Si
19180 6e 63 65 20 69 74 20 70 65 72 66 6f 72 6d 73 20  nce it performs 
19190 6e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  no memory alloca
191a0 74 69 6f 6e 20 6f 72 20 49 4f 2c 20 74 68 65 20  tion or IO, the 
191b0 6f 6e 6c 79 20 76 61 6c 75 65 73 20 74 68 61 74  only values that
191c0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  .  ** sqlite3Btr
191d0 65 65 43 75 72 73 6f 72 28 29 20 6d 61 79 20 72  eeCursor() may r
191e0 65 74 75 72 6e 20 61 72 65 20 53 51 4c 49 54 45  eturn are SQLITE
191f0 5f 45 4d 50 54 59 20 61 6e 64 20 53 51 4c 49 54  _EMPTY and SQLIT
19200 45 5f 4f 4b 2e 20 0a 20 20 2a 2a 20 53 51 4c 49  E_OK. .  ** SQLI
19210 54 45 5f 45 4d 50 54 59 20 69 73 20 6f 6e 6c 79  TE_EMPTY is only
19220 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 61   returned when a
19230 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65  ttempting to ope
19240 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  n the table.  **
19250 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
19260 31 20 6f 66 20 61 20 7a 65 72 6f 2d 62 79 74 65  1 of a zero-byte
19270 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
19280 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
19290 49 54 45 5f 45 4d 50 54 59 20 7c 7c 20 72 63 3d  ITE_EMPTY || rc=
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
192b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
192c0 4d 50 54 59 20 29 7b 0a 20 20 20 20 70 43 75 72  MPTY ){.    pCur
192d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
192e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
192f0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  K;.  }..  /* Set
19300 20 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e   the VdbeCursor.
19310 69 73 54 61 62 6c 65 20 61 6e 64 20 69 73 49 6e  isTable and isIn
19320 64 65 78 20 76 61 72 69 61 62 6c 65 73 2e 20 50  dex variables. P
19330 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
19340 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20   of.  ** SQLite 
19350 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  used to check if
19360 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 66   the root-page f
19370 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65 20 61  lags were sane a
19380 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 2a  t this point.  *
19390 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64 61 74  * and report dat
193a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
193b0 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6e 6f   if they were no
193c0 74 2c 20 62 75 74 20 74 68 69 73 20 63 68 65 63  t, but this chec
193d0 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e 63 65  k has.  ** since
193e0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
193f0 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 2a 2f  btree layer.  */
19400 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54 61 62    .  pCur->isTab
19410 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65  le = pOp->p4type
19420 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  !=P4_KEYINFO;.  
19430 70 43 75 72 2d 3e 69 73 49 6e 64 65 78 20 3d 20  pCur->isIndex = 
19440 21 70 43 75 72 2d 3e 69 73 54 61 62 6c 65 3b 0a  !pCur->isTable;.
19450 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
19460 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d  pcode: OpenEphem
19470 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20  eral P1 P2 * P4 
19480 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  *.**.** Open a n
19490 65 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20  ew cursor P1 to 
194a0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
194b0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
194c0 20 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65   is always opene
194d0 64 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65  d read/write eve
194e0 6e 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69  n if .** the mai
194f0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  n database is re
19500 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70  ad-only.  The ep
19510 68 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65  hemeral.** table
19520 20 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f   is deleted auto
19530 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
19540 68 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  he cursor is clo
19550 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73  sed..**.** P2 is
19560 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19570 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70  olumns in the ep
19580 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a  hemeral table..*
19590 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69  * The cursor poi
195a0 6e 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74  nts to a BTree t
195b0 61 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e  able if P4==0 an
195c0 64 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64  d to a BTree ind
195d0 65 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e  ex.** if P4 is n
195e0 6f 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20  ot 0.  If P4 is 
195f0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
19600 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
19610 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
19620 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  at defines the f
19630 6f 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e  ormat of keys in
19640 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
19650 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 61  * This opcode wa
19660 73 20 6f 6e 63 65 20 63 61 6c 6c 65 64 20 4f 70  s once called Op
19670 65 6e 54 65 6d 70 2e 20 20 42 75 74 20 74 68 61  enTemp.  But tha
19680 74 20 63 72 65 61 74 65 64 0a 2a 2a 20 63 6f 6e  t created.** con
19690 66 75 73 69 6f 6e 20 62 65 63 61 75 73 65 20 74  fusion because t
196a0 68 65 20 74 65 72 6d 20 22 74 65 6d 70 20 74 61  he term "temp ta
196b0 62 6c 65 22 2c 20 6d 69 67 68 74 20 72 65 66 65  ble", might refe
196c0 72 20 65 69 74 68 65 72 0a 2a 2a 20 74 6f 20 61  r either.** to a
196d0 20 54 45 4d 50 20 74 61 62 6c 65 20 61 74 20 74   TEMP table at t
196e0 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 6f 72  he SQL level, or
196f0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 70 65 6e   to a table open
19700 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 6f 70  ed by.** this op
19710 63 6f 64 65 2e 20 20 54 68 65 6e 20 74 68 69 73  code.  Then this
19720 20 6f 70 63 6f 64 65 20 77 61 73 20 63 61 6c 6c   opcode was call
19730 20 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 42   OpenVirtual.  B
19740 75 74 0a 2a 2a 20 74 68 61 74 20 63 72 65 61 74  ut.** that creat
19750 65 64 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ed confusion wit
19760 68 20 74 68 65 20 77 68 6f 6c 65 20 76 69 72 74  h the whole virt
19770 75 61 6c 2d 74 61 62 6c 65 20 69 64 65 61 2e 0a  ual-table idea..
19780 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  */./* Opcode: Op
19790 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20 50  enAutoindex P1 P
197a0 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 * P4 *.**.** T
197b0 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73  his opcode works
197c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f   the same as OP_
197d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20  OpenEphemeral.  
197e0 49 74 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66  It has a.** diff
197f0 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69  erent name to di
19800 73 74 69 6e 67 75 69 73 68 20 69 74 73 20 75 73  stinguish its us
19810 65 2e 20 20 54 61 62 6c 65 73 20 63 72 65 61 74  e.  Tables creat
19820 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74  ed using.** by t
19830 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
19840 62 65 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f  be used for auto
19850 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
19860 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69  d transient.** i
19870 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e  ndices in joins.
19880 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e  .*/.case OP_Open
19890 53 6f 72 74 65 72 3a 20 0a 63 61 73 65 20 4f 50  Sorter: .case OP
198a0 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20  _OpenAutoindex: 
198b0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68  .case OP_OpenEph
198c0 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65  emeral: {.  Vdbe
198d0 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 73  Cursor *pCx;.  s
198e0 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
198f0 76 66 73 46 6c 61 67 73 20 3d 20 0a 20 20 20 20  vfsFlags = .    
19900 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19910 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
19920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19930 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  TE |.      SQLIT
19940 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
19950 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f   |.      SQLITE_
19960 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
19970 53 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  SE |.      SQLIT
19980 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
19990 5f 44 42 3b 0a 0a 20 20 69 6e 74 20 62 74 66 6c  _DB;..  int btfl
199a0 61 67 73 20 3d 20 42 54 52 45 45 5f 4f 4d 49 54  ags = BTREE_OMIT
199b0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 70 4f 70 2d 3e  _JOURNAL | pOp->
199c0 70 35 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  p5;.  if( pOp->o
199d0 70 63 6f 64 65 21 3d 4f 50 5f 4f 70 65 6e 53 6f  pcode!=OP_OpenSo
199e0 72 74 65 72 20 29 20 62 74 66 6c 61 67 73 20 7c  rter ) btflags |
199f0 3d 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 3b 0a  = BTREE_SINGLE;.
19a00 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
19a10 70 31 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p1>=0 );.  pCx =
19a20 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
19a30 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
19a40 3e 70 32 2c 20 2d 31 2c 20 31 29 3b 0a 20 20 69  >p2, -1, 1);.  i
19a50 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
19a60 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
19a70 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
19a80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19a90 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
19aa0 2c 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 2c  , db, &pCx->pBt,
19ab0 20 62 74 66 6c 61 67 73 2c 20 76 66 73 46 6c 61   btflags, vfsFla
19ac0 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  gs);.  if( rc==S
19ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19af0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43 78 2d  eBeginTrans(pCx-
19b00 3e 70 42 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  >pBt, 1);.  }.  
19b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19b20 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
19b30 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
19b40 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 63 72   is required, cr
19b50 65 61 74 65 20 69 74 20 62 79 20 63 61 6c 6c 69  eate it by calli
19b60 6e 67 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ng.    ** sqlite
19b70 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
19b80 65 28 29 20 77 69 74 68 20 74 68 65 20 42 54 52  e() with the BTR
19b90 45 45 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20  EE_BLOBKEY flag 
19ba0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70  before.    ** op
19bb0 65 6e 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74  ening it. If a t
19bc0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69  ransient table i
19bd0 73 20 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74  s required, just
19be0 20 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20   use the.    ** 
19bf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
19c00 65 61 74 65 64 20 74 61 62 6c 65 20 77 69 74 68  eated table with
19c10 20 72 6f 6f 74 2d 70 61 67 65 20 31 20 28 61 6e   root-page 1 (an
19c20 20 42 4c 4f 42 5f 49 4e 54 4b 45 59 20 74 61 62   BLOB_INTKEY tab
19c30 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  le)..    */.    
19c40 69 66 28 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  if( pOp->p4.pKey
19c50 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e  Info ){.      in
19c60 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73  t pgno;.      as
19c70 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
19c80 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
19c90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19ca0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19cb0 62 6c 65 28 70 43 78 2d 3e 70 42 74 2c 20 26 70  ble(pCx->pBt, &p
19cc0 67 6e 6f 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b  gno, BTREE_BLOBK
19cd0 45 59 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a  EY | pOp->p5); .
19ce0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19d00 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
19d10 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29  =MASTER_ROOT+1 )
19d20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
19d30 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
19d40 72 28 70 43 78 2d 3e 70 42 74 2c 20 70 67 6e 6f  r(pCx->pBt, pgno
19d50 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 20 20 20 20 28 4b 65 79 49 6e 66 6f 2a 29        (KeyInfo*)
19d80 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 43 78 2d 3e  pOp->p4.z, pCx->
19d90 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
19da0 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20    pCx->pKeyInfo 
19db0 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
19dc0 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 43 78 2d  fo;.        pCx-
19dd0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d  >pKeyInfo->enc =
19de0 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20   ENC(db);.      
19df0 7d 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54  }.      pCx->isT
19e00 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  able = 0;.    }e
19e10 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
19e20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
19e30 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20 4d 41 53  or(pCx->pBt, MAS
19e40 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 30 2c 20  TER_ROOT, 1, 0, 
19e50 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
19e60 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c       pCx->isTabl
19e70 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
19e80 0a 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65  .  pCx->isOrdere
19e90 64 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54  d = (pOp->p5!=BT
19ea0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
19eb0 20 20 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d    pCx->isIndex =
19ec0 20 21 70 43 78 2d 3e 69 73 54 61 62 6c 65 3b 0a   !pCx->isTable;.
19ed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19ee0 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  _OK && pOp->opco
19ef0 64 65 3d 3d 4f 50 5f 4f 70 65 6e 53 6f 72 74 65  de==OP_OpenSorte
19f00 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
19f10 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 49  lite3VdbeSorterI
19f20 6e 69 74 28 64 62 2c 20 70 43 78 29 3b 0a 20 20  nit(db, pCx);.  
19f30 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
19f40 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65   Opcode: OpenPse
19f50 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20 2a  udo P1 P2 P3 * *
19f60 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
19f70 77 20 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f  w cursor that po
19f80 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74  ints to a fake t
19f90 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
19fa0 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  ns a single.** r
19fb0 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ow of data.  The
19fc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74   content of that
19fd0 20 6f 6e 65 20 72 6f 77 20 69 6e 20 74 68 65 20   one row in the 
19fe0 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72  content of memor
19ff0 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32  y.** register P2
1a000 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1a010 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62 65 63  s, cursor P1 bec
1a020 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f  omes an alias fo
1a030 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c  r the .** MEM_Bl
1a040 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61  ob content conta
1a050 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ined in register
1a060 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65   P2..**.** A pse
1a070 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65  udo-table create
1a080 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
1a090 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   is used to hold
1a0a0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77   a single.** row
1a0b0 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65   output from the
1a0c0 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20   sorter so that 
1a0d0 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64  the row can be d
1a0e0 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a  ecomposed into.*
1a0f0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c  * individual col
1a100 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f  umns using the O
1a110 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e  P_Column opcode.
1a120 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20    The OP_Column 
1a130 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65  opcode.** is the
1a140 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63   only cursor opc
1a150 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77  ode that works w
1a160 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62  ith a pseudo-tab
1a170 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20  le..**.** P3 is 
1a180 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1a190 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f  elds in the reco
1a1a0 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  rds that will be
1a1b0 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68   stored by.** th
1a1c0 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  e pseudo-table..
1a1d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50  */.case OP_OpenP
1a1e0 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43  seudo: {.  VdbeC
1a1f0 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61  ursor *pCx;..  a
1a200 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1a210 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
1a220 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1a230 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p1, pOp->p3,
1a240 20 2d 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 70   -1, 0);.  if( p
1a250 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1a260 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1a270 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1a280 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20 3d  pseudoTableReg =
1a290 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d   pOp->p2;.  pCx-
1a2a0 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  >isTable = 1;.  
1a2b0 70 43 78 2d 3e 69 73 49 6e 64 65 78 20 3d 20 30  pCx->isIndex = 0
1a2c0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1a2d0 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20 50   Opcode: Close P
1a2e0 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
1a2f0 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 70  Close a cursor p
1a300 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
1a310 20 61 73 20 50 31 2e 20 20 49 66 20 50 31 20 69   as P1.  If P1 i
1a320 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e 74  s not.** current
1a330 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 69 6e  ly open, this in
1a340 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 20 6e  struction is a n
1a350 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  o-op..*/.case OP
1a360 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73 65  _Close: {.  asse
1a370 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1a380 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1a390 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74 65  rsor );.  sqlite
1a3a0 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
1a3b0 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  p, p->apCsr[pOp-
1a3c0 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43 73  >p1]);.  p->apCs
1a3d0 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b 0a  r[pOp->p1] = 0;.
1a3e0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1a3f0 70 63 6f 64 65 3a 20 53 65 65 6b 47 65 20 50 31  pcode: SeekGe P1
1a400 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1a410 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1a420 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1a430 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1a440 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1a450 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1a460 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1a470 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20 6b  ster P3 as the k
1a480 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20 50  ey.  If cursor P
1a490 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1a4a0 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1a4b0 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1a4c0 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1a4d0 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1a4e0 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1a4f0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1a500 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1a510 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1a520 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1a530 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1a540 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1a550 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1a560 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1a570 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
1a580 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1a590 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20   no records .** 
1a5a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1a5b0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1a5c0 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1a5d0 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1a5e0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  o P2..**.** See 
1a5f0 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1a600 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63 74 2c  Found, Distinct,
1a610 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74 2c   SeekLt, SeekGt,
1a620 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70   SeekLe.*/./* Op
1a630 63 6f 64 65 3a 20 53 65 65 6b 47 74 20 50 31 20  code: SeekGt P1 
1a640 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
1a650 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1a660 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
1a670 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
1a680 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
1a690 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
1a6a0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
1a6b0 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e  ter P3 as a key.
1a6c0 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1a6d0 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
1a6e0 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
1a6f0 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
1a700 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
1a710 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
1a720 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
1a730 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1a740 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
1a750 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
1a760 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
1a770 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
1a780 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  llest entry that
1a790 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20   .** is greater 
1a7a0 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
1a7b0 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1a7c0 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65 61   no records grea
1a7d0 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65  ter than .** the
1a7e0 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1a7f0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1a800 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1a810 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1a820 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69   NotFound, Disti
1a830 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  nct, SeekLt, See
1a840 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGe, SeekLe.*/./
1a850 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 74  * Opcode: SeekLt
1a860 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a   P1 P2 P3 P4 * .
1a870 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
1a880 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
1a890 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
1a8a0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
1a8b0 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
1a8c0 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
1a8d0 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61  register P3 as a
1a8e0 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20   key. If cursor 
1a8f0 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f  P1 refers .** to
1a900 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74   an SQL index, t
1a910 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69  hen P3 is the fi
1a920 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20  rst in an array 
1a930 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20  of P4 registers 
1a940 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65  .** that are use
1a950 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64  d as an unpacked
1a960 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a   index key. .**.
1a970 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75  ** Reposition cu
1a980 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20  rsor P1 so that 
1a990 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1a9a0 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
1a9b0 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73  that .** is less
1a9c0 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
1a9d0 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72  lue. If there ar
1a9e0 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65 73  e no records les
1a9f0 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20 6b  s than .** the k
1aa00 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1aa10 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1aa20 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65   to P2..**.** Se
1aa30 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
1aa40 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69 6e 63  otFound, Distinc
1aa50 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47  t, SeekGt, SeekG
1aa60 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20  e, SeekLe.*/./* 
1aa70 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 65 20 50  Opcode: SeekLe P
1aa80 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1aa90 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  ** If cursor P1 
1aaa0 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c  refers to an SQL
1aab0 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74   table (B-Tree t
1aac0 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72  hat uses integer
1aad0 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20   keys), .** use 
1aae0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
1aaf0 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b 65  ister P3 as a ke
1ab00 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31 20  y. If cursor P1 
1ab10 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e  refers .** to an
1ab20 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e   SQL index, then
1ab30 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73 74   P3 is the first
1ab40 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
1ab50 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a  P4 registers .**
1ab60 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
1ab70 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  s an unpacked in
1ab80 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20  dex key. .**.** 
1ab90 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f  Reposition curso
1aba0 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20  r P1 so that it 
1abb0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
1abc0 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  rgest entry that
1abd0 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61   .** is less tha
1abe0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1abf0 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  e key value. If 
1ac00 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
1ac10 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74 68  ords .** less th
1ac20 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1ac30 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
1ac40 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
1ac50 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
1ac60 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1ac70 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73  d, NotFound, Dis
1ac80 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53  tinct, SeekGt, S
1ac90 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a 2f  eekGe, SeekLt.*/
1aca0 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 74 3a  .case OP_SeekLt:
1acb0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1acc0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1acd0 5f 53 65 65 6b 4c 65 3a 20 20 20 20 20 20 20 20  _SeekLe:        
1ace0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1acf0 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 65 3a  .case OP_SeekGe:
1ad00 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1ad10 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1ad20 5f 53 65 65 6b 47 74 3a 20 7b 20 20 20 20 20 20  _SeekGt: {      
1ad30 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1ad40 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
1ad50 74 20 6f 63 3b 0a 20 20 56 64 62 65 43 75 72 73  t oc;.  VdbeCurs
1ad60 6f 72 20 2a 70 43 3b 0a 20 20 55 6e 70 61 63 6b  or *pC;.  Unpack
1ad70 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 69 6e  edRecord r;.  in
1ad80 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 36 34 20  t nField;.  i64 
1ad90 69 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54 68  iKey;      /* Th
1ada0 65 20 72 6f 77 69 64 20 77 65 20 61 72 65 20 74  e rowid we are t
1adb0 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20 20  o seek to */..  
1adc0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1add0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
1ade0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
1adf0 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d 30  sert( pOp->p2!=0
1ae00 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
1ae10 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1ae20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
1ae30 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70  .  assert( pC->p
1ae40 73 65 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30  seudoTableReg==0
1ae50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1ae60 5f 53 65 65 6b 4c 65 20 3d 3d 20 4f 50 5f 53 65  _SeekLe == OP_Se
1ae70 65 6b 4c 74 2b 31 20 29 3b 0a 20 20 61 73 73 65  ekLt+1 );.  asse
1ae80 72 74 28 20 4f 50 5f 53 65 65 6b 47 65 20 3d 3d  rt( OP_SeekGe ==
1ae90 20 4f 50 5f 53 65 65 6b 4c 74 2b 32 20 29 3b 0a   OP_SeekLt+2 );.
1aea0 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
1aeb0 6b 47 74 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 74  kGt == OP_SeekLt
1aec0 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +3 );.  assert( 
1aed0 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b  pC->isOrdered );
1aee0 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75 72 73  .  if( pC->pCurs
1aef0 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 6f 63 20  or!=0 ){.    oc 
1af00 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
1af10 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d     pC->nullRow =
1af20 20 30 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e   0;.    if( pC->
1af30 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  isTable ){.     
1af40 20 2f 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61   /* The input va
1af50 6c 75 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20  lue in P3 might 
1af60 62 65 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20  be of any type: 
1af70 69 6e 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73  integer, real, s
1af80 74 72 69 6e 67 2c 0a 20 20 20 20 20 20 2a 2a 20  tring,.      ** 
1af90 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20  blob, or NULL.  
1afa0 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f 20  But it needs to 
1afb0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  be an integer be
1afc0 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a 20  fore we can do. 
1afd0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b       ** the seek
1afe0 2c 20 73 6f 20 63 6f 76 65 72 74 20 69 74 2e 20  , so covert it. 
1aff0 2a 2f 0a 20 20 20 20 20 20 70 49 6e 33 20 3d 20  */.      pIn3 = 
1b000 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
1b010 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72        applyNumer
1b020 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 29  icAffinity(pIn3)
1b030 3b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 73  ;.      iKey = s
1b040 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
1b050 75 65 28 70 49 6e 33 29 3b 0a 20 20 20 20 20 20  ue(pIn3);.      
1b060 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
1b070 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
1b080 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
1b090 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f 6e  could not be con
1b0a0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
1b0b0 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a 20  nteger without. 
1b0c0 20 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20       ** loss of 
1b0d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65  information, the
1b0e0 6e 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73  n special proces
1b0f0 73 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  sing is required
1b100 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ... */.      if(
1b110 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
1b120 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
1b130 20 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33         if( (pIn3
1b140 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1b150 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
1b160 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33      /* If the P3
1b170 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
1b180 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
1b190 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75  any kind of a nu
1b1a0 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  mber,.          
1b1b0 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b  ** then the seek
1b1c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1b1d0 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20  , so jump to P2 
1b1e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  */.          pc 
1b1f0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1b200 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b220 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
1b230 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1b240 6e 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d  n the P3 value m
1b250 75 73 74 20 62 65 20 61 20 66 6c 6f 61 74 69 6e  ust be a floatin
1b260 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  g.        ** poi
1b270 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  nt number. */.  
1b280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1b290 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
1b2a0 5f 52 65 61 6c 29 21 3d 30 20 29 3b 0a 0a 20 20  _Real)!=0 );..  
1b2b0 20 20 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d        if( iKey==
1b2c0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26  SMALLEST_INT64 &
1b2d0 26 20 28 70 49 6e 33 2d 3e 72 3c 28 64 6f 75 62  & (pIn3->r<(doub
1b2e0 6c 65 29 69 4b 65 79 20 7c 7c 20 70 49 6e 33 2d  le)iKey || pIn3-
1b2f0 3e 72 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20  >r>0) ){.       
1b300 20 20 20 2f 2a 20 54 68 65 20 50 33 20 76 61 6c     /* The P3 val
1b310 75 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ue is too large 
1b320 69 6e 20 6d 61 67 6e 69 74 75 64 65 20 74 6f 20  in magnitude to 
1b330 62 65 20 65 78 70 72 65 73 73 65 64 20 61 73 20  be expressed as 
1b340 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
1b350 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1b360 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20        res = 1;. 
1b370 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e           if( pIn
1b380 33 2d 3e 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  3->r<0 ){.      
1b390 20 20 20 20 20 20 69 66 28 20 6f 63 3e 3d 4f 50        if( oc>=OP
1b3a0 5f 53 65 65 6b 47 65 20 29 7b 20 20 61 73 73 65  _SeekGe ){  asse
1b3b0 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47  rt( oc==OP_SeekG
1b3c0 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  e || oc==OP_Seek
1b3d0 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Gt );.          
1b3e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b3f0 42 74 72 65 65 46 69 72 73 74 28 70 43 2d 3e 70  BtreeFirst(pC->p
1b400 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1b420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b430 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1b440 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1b450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b470 20 20 20 20 20 69 66 28 20 6f 63 3c 3d 4f 50 5f       if( oc<=OP_
1b480 53 65 65 6b 4c 65 20 29 7b 20 20 61 73 73 65 72  SeekLe ){  asser
1b490 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74  t( oc==OP_SeekLt
1b4a0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   || oc==OP_SeekL
1b4b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
1b4c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b4d0 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70 43 75  treeLast(pC->pCu
1b4e0 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
1b4f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1b500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1b510 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1b520 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1b530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1b540 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1b550 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
1b560 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1b570 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  - 1;.          }
1b580 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b590 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b5a0 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  if( oc==OP_SeekL
1b5b0 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  t || oc==OP_Seek
1b5c0 47 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ge ){.          
1b5d0 2f 2a 20 55 73 65 20 74 68 65 20 63 65 69 6c 69  /* Use the ceili
1b5e0 6e 67 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ng() function to
1b5f0 20 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69   convert real->i
1b600 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nt */.          
1b610 69 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20 28 64  if( pIn3->r > (d
1b620 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65  ouble)iKey ) iKe
1b630 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  y++;.        }el
1b640 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1b650 20 55 73 65 20 74 68 65 20 66 6c 6f 6f 72 28 29   Use the floor()
1b660 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 6f 6e   function to con
1b670 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74 20 2a  vert real->int *
1b680 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
1b690 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c  rt( oc==OP_SeekL
1b6a0 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  e || oc==OP_Seek
1b6b0 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Gt );.          
1b6c0 69 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20 28 64  if( pIn3->r < (d
1b6d0 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69 4b 65  ouble)iKey ) iKe
1b6e0 79 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  y--;.        }. 
1b6f0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 72 63       } .      rc
1b700 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1b710 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1b720 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  ->pCursor, 0, (u
1b730 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73  64)iKey, 0, &res
1b740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b760 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1b770 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1b780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b790 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1b7a0 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61     pC->rowidIsVa
1b7b0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  lid = 1;.       
1b7c0 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   pC->lastRowid =
1b7d0 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20   iKey;.      }. 
1b7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b7f0 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34  nField = pOp->p4
1b800 2e 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  .i;.      assert
1b810 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1b820 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 20  4_INT32 );.     
1b830 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e   assert( nField>
1b840 30 20 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b 65  0 );.      r.pKe
1b850 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79  yInfo = pC->pKey
1b860 49 6e 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46  Info;.      r.nF
1b870 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46 69 65  ield = (u16)nFie
1b880 6c 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ld;..      /* Th
1b890 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63  e next line of c
1b8a0 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20  ode computes as 
1b8b0 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61  follows, only fa
1b8c0 73 74 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20  ster:.      **  
1b8d0 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
1b8e0 47 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Gt || oc==OP_See
1b8f0 6b 4c 65 20 29 7b 0a 20 20 20 20 20 20 2a 2a 20  kLe ){.      ** 
1b900 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e      r.flags = UN
1b910 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 3b 0a  PACKED_INCRKEY;.
1b920 20 20 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73 65        **   }else
1b930 7b 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 72  {.      **     r
1b940 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  .flags = 0;.    
1b950 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20 20 20 2a    **   }.      *
1b960 2f 0a 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20  /.      r.flags 
1b970 3d 20 28 75 31 36 29 28 55 4e 50 41 43 4b 45 44  = (u16)(UNPACKED
1b980 5f 49 4e 43 52 4b 45 59 20 2a 20 28 31 20 26 20  _INCRKEY * (1 & 
1b990 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 74 29  (oc - OP_SeekLt)
1b9a0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1b9b0 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 74 20  ( oc!=OP_SeekGt 
1b9c0 7c 7c 20 72 2e 66 6c 61 67 73 3d 3d 55 4e 50 41  || r.flags==UNPA
1b9d0 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 3b 0a  CKED_INCRKEY );.
1b9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
1b9f0 21 3d 4f 50 5f 53 65 65 6b 4c 65 20 7c 7c 20 72  !=OP_SeekLe || r
1ba00 2e 66 6c 61 67 73 3d 3d 55 4e 50 41 43 4b 45 44  .flags==UNPACKED
1ba10 5f 49 4e 43 52 4b 45 59 20 29 3b 0a 20 20 20 20  _INCRKEY );.    
1ba20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
1ba30 5f 53 65 65 6b 47 65 20 7c 7c 20 72 2e 66 6c 61  _SeekGe || r.fla
1ba40 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  gs==0 );.      a
1ba50 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
1ba60 65 6b 4c 74 20 7c 7c 20 72 2e 66 6c 61 67 73 3d  ekLt || r.flags=
1ba70 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 72 2e 61  =0 );..      r.a
1ba80 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
1ba90 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  >p3];.#ifdef SQL
1baa0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1bab0 7b 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30  { int i; for(i=0
1bac0 3b 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b  ; i<r.nField; i+
1bad0 2b 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  +) assert( memIs
1bae0 56 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d  Valid(&r.aMem[i]
1baf0 29 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ) ); }.#endif.  
1bb00 20 20 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 72      ExpandBlob(r
1bb10 2e 61 4d 65 6d 29 3b 0a 20 20 20 20 20 20 72 63  .aMem);.      rc
1bb20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
1bb30 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
1bb40 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20 30  ->pCursor, &r, 0
1bb50 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
1bb60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bb70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1bb80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1bb90 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
1bba0 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49        pC->rowidI
1bbb0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
1bbc0 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72  }.    pC->deferr
1bbd0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
1bbe0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1bbf0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1bc00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1bc10 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
1bc20 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
1bc30 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6f  #endif.    if( o
1bc40 63 3e 3d 4f 50 5f 53 65 65 6b 47 65 20 29 7b 20  c>=OP_SeekGe ){ 
1bc50 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
1bc60 53 65 65 6b 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGe || oc==OP
1bc70 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 20  _SeekGt );.     
1bc80 20 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72   if( res<0 || (r
1bc90 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f  es==0 && oc==OP_
1bca0 53 65 65 6b 47 74 29 20 29 7b 0a 20 20 20 20 20  SeekGt) ){.     
1bcb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1bcc0 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 70 43 75  treeNext(pC->pCu
1bcd0 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20  rsor, &res);.   
1bce0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bcf0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
1bd00 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1bd10 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 72 6f  ;.        pC->ro
1bd20 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a  widIsValid = 0;.
1bd30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bd40 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
1bd50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1bd60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1bd70 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20 7c 7c 20  c==OP_SeekLt || 
1bd80 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b  oc==OP_SeekLe );
1bd90 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 30  .      if( res>0
1bda0 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f   || (res==0 && o
1bdb0 63 3d 3d 4f 50 5f 53 65 65 6b 4c 74 29 20 29 7b  c==OP_SeekLt) ){
1bdc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1bdd0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1bde0 75 73 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  us(pC->pCursor, 
1bdf0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
1be00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1be10 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1be20 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1be30 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1be40 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
1be50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1be60 2a 20 72 65 73 20 6d 69 67 68 74 20 62 65 20 6e  * res might be n
1be70 65 67 61 74 69 76 65 20 62 65 63 61 75 73 65 20  egative because 
1be80 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1be90 74 79 2e 20 20 43 68 65 63 6b 20 74 6f 0a 20 20  ty.  Check to.  
1bea0 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
1beb0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1bec0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1bed0 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1bee0 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 70  e3BtreeEof(pC->p
1bef0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
1bf00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1bf10 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
1bf20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
1bf30 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
1bf40 32 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 - 1;.    }.  }
1bf50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1bf60 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
1bf70 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f 70 65  ttempting to ope
1bf80 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61  n the sqlite3_ma
1bf90 73 74 65 72 20 74 61 62 6c 65 0a 20 20 20 20 2a  ster table.    *
1bfa0 2a 20 66 6f 72 20 72 65 61 64 20 61 63 63 65 73  * for read acces
1bfb0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1bfc0 5f 45 4d 50 54 59 2e 20 49 6e 20 74 68 69 73 20  _EMPTY. In this 
1bfd0 63 61 73 65 20 61 6c 77 61 79 73 0a 20 20 20 20  case always.    
1bfe0 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
1bff0 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 61 72   (since there ar
1c000 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 69 6e 20  e no records in 
1c010 74 68 65 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  the table)..    
1c020 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  */.    pc = pOp-
1c030 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62  >p2 - 1;.  }.  b
1c040 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1c050 64 65 3a 20 53 65 65 6b 20 50 31 20 50 32 20 2a  de: Seek P1 P2 *
1c060 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73   * *.**.** P1 is
1c070 20 61 6e 20 6f 70 65 6e 20 74 61 62 6c 65 20 63   an open table c
1c080 75 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20  ursor and P2 is 
1c090 61 20 72 6f 77 69 64 20 69 6e 74 65 67 65 72 2e  a rowid integer.
1c0a0 20 20 41 72 72 61 6e 67 65 0a 2a 2a 20 66 6f 72    Arrange.** for
1c0b0 20 50 31 20 74 6f 20 6d 6f 76 65 20 73 6f 20 74   P1 to move so t
1c0c0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1c0d0 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e   the rowid given
1c0e0 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   by P2..**.** Th
1c0f0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1c100 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20   deferred seek. 
1c110 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c   Nothing actuall
1c120 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a  y happens until.
1c130 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
1c140 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
1c150 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61  record.  That wa
1c160 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a  y, if no reads.*
1c170 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65  * occur, no unne
1c180 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70  cessary I/O happ
1c190 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ens..*/.case OP_
1c1a0 53 65 65 6b 3a 20 7b 20 20 20 20 2f 2a 20 69 6e  Seek: {    /* in
1c1b0 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  2 */.  VdbeCurso
1c1c0 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74  r *pC;..  assert
1c1d0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1c1e0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1c1f0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1c200 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1c210 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1c220 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
1c230 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
1c240 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c250 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
1c260 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1c270 30 3b 0a 20 20 20 20 70 49 6e 32 20 3d 20 26 61  0;.    pIn2 = &a
1c280 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
1c290 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
1c2a0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
1c2b0 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  IntValue(pIn2);.
1c2c0 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56      pC->rowidIsV
1c2d0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 43  alid = 0;.    pC
1c2e0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
1c2f0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61   = 1;.  }.  brea
1c300 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63 6f  k;.}.  ../* Opco
1c310 64 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32 20  de: Found P1 P2 
1c320 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 49 66  P3 P4 *.**.** If
1c330 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69   P4==0 then regi
1c340 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20  ster P3 holds a 
1c350 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64  blob constructed
1c360 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20   by MakeRecord. 
1c370 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e   If.** P4>0 then
1c380 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
1c390 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20  the first of P4 
1c3a0 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66  registers that f
1c3b0 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a  orm an unpacked.
1c3c0 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  ** record..**.**
1c3d0 20 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e   Cursor P1 is on
1c3e0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e   an index btree.
1c3f0 20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20    If the record 
1c400 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33  identified by P3
1c410 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20   and P4.** is a 
1c420 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e  prefix of any en
1c430 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61  try in P1 then a
1c440 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
1c450 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73   P2 and.** P1 is
1c460 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1c470 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  t the matching e
1c480 6e 74 72 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  ntry..*/./* Opco
1c490 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31 20  de: NotFound P1 
1c4a0 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
1c4b0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
1c4c0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
1c4d0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
1c4e0 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
1c4f0 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
1c500 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
1c510 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
1c520 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
1c530 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
1c540 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
1c550 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
1c560 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
1c570 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
1c580 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
1c590 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
1c5a0 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78  s not the prefix
1c5b0 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e   of any entry in
1c5c0 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20   P1 then a jump 
1c5d0 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20  is made to P2.  
1c5e0 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63  If P1 .** does c
1c5f0 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20  ontain an entry 
1c600 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74  whose prefix mat
1c610 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72  ches the P3/P4 r
1c620 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72  ecord then contr
1c630 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f  ol.** falls thro
1c640 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
1c650 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
1c660 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
1c670 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61  ing at the.** ma
1c680 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a  tching entry..**
1c690 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1c6a0 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20  und, NotExists, 
1c6b0 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65  IsUnique.*/.case
1c6c0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20   OP_NotFound:   
1c6d0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1c6e0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e   */.case OP_Foun
1c6f0 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  d: {        /* j
1c700 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  ump, in3 */.  in
1c710 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b  t alreadyExists;
1c720 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1c730 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  C;.  int res;.  
1c740 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1c750 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e 70 61 63  pIdxKey;.  Unpac
1c760 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 20 20 63  kedRecord r;.  c
1c770 68 61 72 20 61 54 65 6d 70 52 65 63 5b 52 4f 55  har aTempRec[ROU
1c780 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1c790 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1c7a0 7a 65 6f 66 28 4d 65 6d 29 2a 33 20 2b 20 37 5d  zeof(Mem)*3 + 7]
1c7b0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1c7c0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
1c7d0 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  found_count++;.#
1c7e0 65 6e 64 69 66 0a 0a 20 20 61 6c 72 65 61 64 79  endif..  already
1c7f0 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 61 73  Exists = 0;.  as
1c800 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1c810 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1c820 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
1c830 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
1c840 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70  =P4_INT32 );.  p
1c850 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
1c860 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
1c870 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 49 6e 33   pC!=0 );.  pIn3
1c880 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
1c890 5d 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ];.  if( ALWAYS(
1c8a0 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20  pC->pCursor!=0) 
1c8b0 29 7b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){..    assert( 
1c8c0 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
1c8d0 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
1c8e0 34 2e 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  4.i>0 ){.      r
1c8f0 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
1c900 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
1c910 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
1c920 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 20  pOp->p4.i;.     
1c930 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a   r.aMem = pIn3;.
1c940 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c950 42 55 47 0a 20 20 20 20 20 20 7b 20 69 6e 74 20  BUG.      { int 
1c960 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e  i; for(i=0; i<r.
1c970 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73  nField; i++) ass
1c980 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
1c990 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d  &r.aMem[i]) ); }
1c9a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 2e  .#endif.      r.
1c9b0 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
1c9c0 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 3b 0a 20  _PREFIX_MATCH;. 
1c9d0 20 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 26       pIdxKey = &
1c9e0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1c9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33      assert( pIn3
1ca00 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1ca10 6f 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ob );.      asse
1ca20 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  rt( (pIn3->flags
1ca30 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1ca40 29 3b 20 20 2f 2a 20 7a 65 72 6f 62 6c 6f 62 73  );  /* zeroblobs
1ca50 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64 65   already expande
1ca60 64 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 4b  d */.      pIdxK
1ca70 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1ca80 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d  RecordUnpack(pC-
1ca90 3e 70 4b 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d  >pKeyInfo, pIn3-
1caa0 3e 6e 2c 20 70 49 6e 33 2d 3e 7a 2c 0a 20 20 20  >n, pIn3->z,.   
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 61 54 65 6d 70 52 65 63 2c 20 73       aTempRec, s
1cae0 69 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29 29  izeof(aTempRec))
1caf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
1cb00 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1cb10 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
1cb20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 64       }.      pId
1cb30 78 4b 65 79 2d 3e 66 6c 61 67 73 20 7c 3d 20 55  xKey->flags |= U
1cb40 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
1cb50 41 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATCH;.    }.    
1cb60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1cb70 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1cb80 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70 49 64  pC->pCursor, pId
1cb90 78 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73  xKey, 0, 0, &res
1cba0 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  );.    if( pOp->
1cbb0 70 34 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  p4.i==0 ){.     
1cbc0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1cbd0 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1cbe0 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 7d  (pIdxKey);.    }
1cbf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1cc00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cc10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cc20 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d   alreadyExists =
1cc30 20 28 72 65 73 3d 3d 30 29 3b 0a 20 20 20 20 70   (res==0);.    p
1cc40 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
1cc50 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63  o = 0;.    pC->c
1cc60 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
1cc70 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20  HE_STALE;.  }.  
1cc80 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
1cc90 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20  =OP_Found ){.   
1cca0 20 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73   if( alreadyExis
1ccb0 74 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70  ts ) pc = pOp->p
1ccc0 32 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2 - 1;.  }else{.
1ccd0 20 20 20 20 69 66 28 20 21 61 6c 72 65 61 64 79      if( !already
1cce0 45 78 69 73 74 73 20 29 20 70 63 20 3d 20 70 4f  Exists ) pc = pO
1ccf0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20  p->p2 - 1;.  }. 
1cd00 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1cd10 63 6f 64 65 3a 20 49 73 55 6e 69 71 75 65 20 50  code: IsUnique P
1cd20 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
1cd30 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
1cd40 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 64 65 78  open on an index
1cd50 20 62 2d 74 72 65 65 20 2d 20 74 68 61 74 20 69   b-tree - that i
1cd60 73 20 74 6f 20 73 61 79 2c 20 61 20 62 74 72 65  s to say, a btre
1cd70 65 20 77 68 69 63 68 0a 2a 2a 20 6e 6f 20 64 61  e which.** no da
1cd80 74 61 20 61 6e 64 20 77 68 65 72 65 20 74 68 65  ta and where the
1cd90 20 6b 65 79 20 61 72 65 20 72 65 63 6f 72 64 73   key are records
1cda0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 4f 50   generated by OP
1cdb0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 77 69 74 68  _MakeRecord with
1cdc0 0a 2a 2a 20 74 68 65 20 6c 69 73 74 20 66 69 65  .** the list fie
1cdd0 6c 64 20 62 65 69 6e 67 20 74 68 65 20 69 6e 74  ld being the int
1cde0 65 67 65 72 20 52 4f 57 49 44 20 6f 66 20 74 68  eger ROWID of th
1cdf0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1ce00 20 69 6e 64 65 78 0a 2a 2a 20 65 6e 74 72 79 20   index.** entry 
1ce10 72 65 66 65 72 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  refers to..**.**
1ce20 20 54 68 65 20 50 33 20 72 65 67 69 73 74 65 72   The P3 register
1ce30 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 74   contains an int
1ce40 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62  eger record numb
1ce50 65 72 2e 20 43 61 6c 6c 20 74 68 69 73 20 72 65  er. Call this re
1ce60 63 6f 72 64 20 0a 2a 2a 20 6e 75 6d 62 65 72 20  cord .** number 
1ce70 52 2e 20 52 65 67 69 73 74 65 72 20 50 34 20 69  R. Register P4 i
1ce80 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1ce90 20 73 65 74 20 6f 66 20 4e 20 63 6f 6e 74 69 67   set of N contig
1cea0 75 6f 75 73 20 72 65 67 69 73 74 65 72 73 0a 2a  uous registers.*
1ceb0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 61  * that make up a
1cec0 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  n unpacked index
1ced0 20 6b 65 79 20 74 68 61 74 20 63 61 6e 20 62 65   key that can be
1cee0 20 75 73 65 64 20 77 69 74 68 20 63 75 72 73 6f   used with curso
1cef0 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  r P1..** The val
1cf00 75 65 20 6f 66 20 4e 20 63 61 6e 20 62 65 20 69  ue of N can be i
1cf10 6e 66 65 72 72 65 64 20 66 72 6f 6d 20 74 68 65  nferred from the
1cf20 20 63 75 72 73 6f 72 2e 20 4e 20 69 6e 63 6c 75   cursor. N inclu
1cf30 64 65 73 20 74 68 65 20 72 6f 77 69 64 0a 2a 2a  des the rowid.**
1cf40 20 76 61 6c 75 65 20 61 70 70 65 6e 64 65 64 20   value appended 
1cf50 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1cf60 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 20  e index record. 
1cf70 54 68 69 73 20 72 6f 77 69 64 20 76 61 6c 75 65  This rowid value
1cf80 20 6d 61 79 0a 2a 2a 20 6f 72 20 6d 61 79 20 6e   may.** or may n
1cf90 6f 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ot be the same a
1cfa0 73 20 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  s R..**.** If an
1cfb0 79 20 6f 66 20 74 68 65 20 4e 20 72 65 67 69 73  y of the N regis
1cfc0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
1cfd0 69 74 68 20 72 65 67 69 73 74 65 72 20 50 34 20  ith register P4 
1cfe0 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 0a  contains a NULL.
1cff0 2a 2a 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69  ** value, jump i
1d000 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
1d010 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1d020 65 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  e, this instruct
1d030 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 63 75  ion checks if cu
1d040 72 73 6f 72 20 50 31 20 63 6f 6e 74 61 69 6e 73  rsor P1 contains
1d050 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65   an entry.** whe
1d060 72 65 20 74 68 65 20 66 69 72 73 74 20 28 4e 2d  re the first (N-
1d070 31 29 20 66 69 65 6c 64 73 20 6d 61 74 63 68 20  1) fields match 
1d080 62 75 74 20 74 68 65 20 72 6f 77 69 64 20 76 61  but the rowid va
1d090 6c 75 65 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  lue at the end.*
1d0a0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  * of the index e
1d0b0 6e 74 72 79 20 69 73 20 6e 6f 74 20 52 2e 20 49  ntry is not R. I
1d0c0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
1d0d0 63 68 20 65 6e 74 72 79 2c 20 63 6f 6e 74 72 6f  ch entry, contro
1d0e0 6c 20 6a 75 6d 70 73 0a 2a 2a 20 74 6f 20 69 6e  l jumps.** to in
1d0f0 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74  struction P2. Ot
1d100 68 65 72 77 69 73 65 2c 20 74 68 65 20 72 6f 77  herwise, the row
1d110 69 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 6c 69  id of the confli
1d120 63 74 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 65  cting index.** e
1d130 6e 74 72 79 20 69 73 20 63 6f 70 69 65 64 20 74  ntry is copied t
1d140 6f 20 72 65 67 69 73 74 65 72 20 50 33 20 61 6e  o register P3 an
1d150 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20  d control falls 
1d160 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
1d170 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69  ext.** instructi
1d180 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
1d190 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  so: NotFound, No
1d1a0 74 45 78 69 73 74 73 2c 20 46 6f 75 6e 64 0a 2a  tExists, Found.*
1d1b0 2f 0a 63 61 73 65 20 4f 50 5f 49 73 55 6e 69 71  /.case OP_IsUniq
1d1c0 75 65 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ue: {        /* 
1d1d0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 75  jump, in3 */.  u
1d1e0 31 36 20 69 69 3b 0a 20 20 56 64 62 65 43 75 72  16 ii;.  VdbeCur
1d1f0 73 6f 72 20 2a 70 43 78 3b 0a 20 20 42 74 43 75  sor *pCx;.  BtCu
1d200 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75  rsor *pCrsr;.  u
1d210 31 36 20 6e 46 69 65 6c 64 3b 0a 20 20 4d 65 6d  16 nField;.  Mem
1d220 20 2a 61 4d 78 3b 0a 20 20 55 6e 70 61 63 6b 65   *aMx;.  Unpacke
1d230 64 52 65 63 6f 72 64 20 72 3b 20 20 20 20 20 20  dRecord r;      
1d240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1d250 2d 54 72 65 65 20 69 6e 64 65 78 20 73 65 61 72  -Tree index sear
1d260 63 68 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ch key */.  i64 
1d270 52 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R;              
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d290 2a 20 52 6f 77 69 64 20 73 74 6f 72 65 64 20 69  * Rowid stored i
1d2a0 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f  n register P3 */
1d2b0 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ..  pIn3 = &aMem
1d2c0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 4d 78  [pOp->p3];.  aMx
1d2d0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 34   = &aMem[pOp->p4
1d2e0 2e 69 5d 3b 0a 20 20 2f 2a 20 41 73 73 65 72 74  .i];.  /* Assert
1d2f0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
1d300 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 50   of parameters P
1d310 31 20 61 6e 64 20 50 34 20 61 72 65 20 69 6e 20  1 and P4 are in 
1d320 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65  range. */.  asse
1d330 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
1d340 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61  =P4_INT32 );.  a
1d350 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 69  ssert( pOp->p4.i
1d360 3e 30 20 26 26 20 70 4f 70 2d 3e 70 34 2e 69 3c  >0 && pOp->p4.i<
1d370 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 61 73  =p->nMem );.  as
1d380 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
1d390 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
1d3a0 43 75 72 73 6f 72 20 29 3b 0a 0a 20 20 2f 2a 20  Cursor );..  /* 
1d3b0 46 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 63  Find the index c
1d3c0 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 70 43 78 20  ursor. */.  pCx 
1d3d0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
1d3e0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1d3f0 43 78 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  Cx->deferredMove
1d400 74 6f 3d 3d 30 20 29 3b 0a 20 20 70 43 78 2d 3e  to==0 );.  pCx->
1d410 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a  seekResult = 0;.
1d420 20 20 70 43 78 2d 3e 63 61 63 68 65 53 74 61 74    pCx->cacheStat
1d430 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
1d440 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 78 2d  ;.  pCrsr = pCx-
1d450 3e 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20  >pCursor;..  /* 
1d460 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 76 61  If any of the va
1d470 6c 75 65 73 20 61 72 65 20 4e 55 4c 4c 2c 20 74  lues are NULL, t
1d480 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 2a 2f  ake the jump. */
1d490 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 43 78 2d  .  nField = pCx-
1d4a0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1d4b0 64 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  d;.  for(ii=0; i
1d4c0 69 3c 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b  i<nField; ii++){
1d4d0 0a 20 20 20 20 69 66 28 20 61 4d 78 5b 69 69 5d  .    if( aMx[ii]
1d4e0 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  .flags & MEM_Nul
1d4f0 6c 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20  l ){.      pc = 
1d500 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1d510 20 20 20 70 43 72 73 72 20 3d 20 30 3b 0a 20 20     pCrsr = 0;.  
1d520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d530 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
1d540 61 4d 78 5b 6e 46 69 65 6c 64 5d 2e 66 6c 61 67  aMx[nField].flag
1d550 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
1d560 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 72 73 72   );..  if( pCrsr
1d570 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 50 6f  !=0 ){.    /* Po
1d580 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1d590 20 73 65 61 72 63 68 20 6b 65 79 2e 20 2a 2f 0a   search key. */.
1d5a0 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
1d5b0 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a   pCx->pKeyInfo;.
1d5c0 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 6e      r.nField = n
1d5d0 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 20 20 72  Field + 1;.    r
1d5e0 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  .flags = UNPACKE
1d5f0 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b  D_PREFIX_SEARCH;
1d600 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 61 4d  .    r.aMem = aM
1d610 78 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  x;.#ifdef SQLITE
1d620 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74  _DEBUG.    { int
1d630 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72   i; for(i=0; i<r
1d640 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73  .nField; i++) as
1d650 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
1d660 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20  (&r.aMem[i]) ); 
1d670 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1d680 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1d690 75 65 20 6f 66 20 52 20 66 72 6f 6d 20 72 65 67  ue of R from reg
1d6a0 69 73 74 65 72 20 50 33 2e 20 2a 2f 0a 20 20 20  ister P3. */.   
1d6b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1d6c0 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33 29 3b  ntegerify(pIn3);
1d6d0 0a 20 20 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75  .    R = pIn3->u
1d6e0 2e 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72  .i;..    /* Sear
1d6f0 63 68 20 74 68 65 20 42 2d 54 72 65 65 20 69 6e  ch the B-Tree in
1d700 64 65 78 2e 20 49 66 20 6e 6f 20 63 6f 6e 66 6c  dex. If no confl
1d710 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20 69 73  icting record is
1d720 20 66 6f 75 6e 64 2c 20 6a 75 6d 70 0a 20 20 20   found, jump.   
1d730 20 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68 65 72   ** to P2. Other
1d740 77 69 73 65 2c 20 63 6f 70 79 20 74 68 65 20 72  wise, copy the r
1d750 6f 77 69 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  owid of the conf
1d760 6c 69 63 74 69 6e 67 20 72 65 63 6f 72 64 20 74  licting record t
1d770 6f 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65  o.    ** registe
1d780 72 20 50 33 20 61 6e 64 20 66 61 6c 6c 20 74 68  r P3 and fall th
1d790 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
1d7a0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  t instruction.  
1d7b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1d7c0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1d7d0 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
1d7e0 2c 20 30 2c 20 30 2c 20 26 70 43 78 2d 3e 73 65  , 0, 0, &pCx->se
1d7f0 65 6b 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  ekResult);.    i
1d800 66 28 20 28 72 2e 66 6c 61 67 73 20 26 20 55 4e  f( (r.flags & UN
1d810 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
1d820 41 52 43 48 29 20 7c 7c 20 72 2e 72 6f 77 69 64  ARCH) || r.rowid
1d830 3d 3d 52 20 29 7b 0a 20 20 20 20 20 20 70 63 20  ==R ){.      pc 
1d840 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
1d850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d860 70 49 6e 33 2d 3e 75 2e 69 20 3d 20 72 2e 72 6f  pIn3->u.i = r.ro
1d870 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  wid;.    }.  }. 
1d880 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1d890 63 6f 64 65 3a 20 4e 6f 74 45 78 69 73 74 73 20  code: NotExists 
1d8a0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
1d8b0 2a 2a 20 55 73 65 20 74 68 65 20 63 6f 6e 74 65  ** Use the conte
1d8c0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1d8d0 33 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20  3 as an integer 
1d8e0 6b 65 79 2e 20 20 49 66 20 61 20 72 65 63 6f 72  key.  If a recor
1d8f0 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 61 74 20  d .** with that 
1d900 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  key does not exi
1d910 73 74 20 69 6e 20 74 61 62 6c 65 20 6f 66 20 50  st in table of P
1d920 31 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  1, then jump to 
1d930 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 72  P2. .** If the r
1d940 65 63 6f 72 64 20 64 6f 65 73 20 65 78 69 73 74  ecord does exist
1d950 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
1d960 75 67 68 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ugh.  The cursor
1d970 20 69 73 20 6c 65 66 74 20 0a 2a 2a 20 70 6f 69   is left .** poi
1d980 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72 65 63  nting to the rec
1d990 6f 72 64 20 69 66 20 69 74 20 65 78 69 73 74 73  ord if it exists
1d9a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1d9b0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1d9c0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  his operation an
1d9d0 64 20 4e 6f 74 46 6f 75 6e 64 20 69 73 20 74 68  d NotFound is th
1d9e0 61 74 20 74 68 69 73 0a 2a 2a 20 6f 70 65 72 61  at this.** opera
1d9f0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65  tion assumes the
1da00 20 6b 65 79 20 69 73 20 61 6e 20 69 6e 74 65 67   key is an integ
1da10 65 72 20 61 6e 64 20 74 68 61 74 20 50 31 20 69  er and that P1 i
1da20 73 20 61 20 74 61 62 6c 65 20 77 68 65 72 65 61  s a table wherea
1da30 73 0a 2a 2a 20 4e 6f 74 46 6f 75 6e 64 20 61 73  s.** NotFound as
1da40 73 75 6d 65 73 20 6b 65 79 20 69 73 20 61 20 62  sumes key is a b
1da50 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
1da60 66 72 6f 6d 20 4d 61 6b 65 52 65 63 6f 72 64 20  from MakeRecord 
1da70 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20  and.** P1 is an 
1da80 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  index..**.** See
1da90 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f   also: Found, No
1daa0 74 46 6f 75 6e 64 2c 20 49 73 55 6e 69 71 75 65  tFound, IsUnique
1dab0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 45  .*/.case OP_NotE
1dac0 78 69 73 74 73 3a 20 7b 20 20 20 20 20 20 20 20  xists: {        
1dad0 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a  /* jump, in3 */.
1dae0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1daf0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
1db00 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
1db10 20 20 75 36 34 20 69 4b 65 79 3b 0a 0a 20 20 70    u64 iKey;..  p
1db20 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
1db30 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
1db40 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1db50 4d 5f 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  M_Int );.  asser
1db60 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1db70 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
1db80 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1db90 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
1dba0 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
1dbb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1dbc0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
1dbd0 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65 75 64  ssert( pC->pseud
1dbe0 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29 3b 0a  oTableReg==0 );.
1dbf0 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 70 43    pCrsr = pC->pC
1dc00 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72  ursor;.  if( pCr
1dc10 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 73  sr!=0 ){.    res
1dc20 20 3d 20 30 3b 0a 20 20 20 20 69 4b 65 79 20 3d   = 0;.    iKey =
1dc30 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20   pIn3->u.i;.    
1dc40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1dc50 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1dc60 70 43 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20  pCrsr, 0, iKey, 
1dc70 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43  0, &res);.    pC
1dc80 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 49  ->lastRowid = pI
1dc90 6e 33 2d 3e 75 2e 69 3b 0a 20 20 20 20 70 43 2d  n3->u.i;.    pC-
1dca0 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1dcb0 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  res==0 ?1:0;.   
1dcc0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30   pC->nullRow = 0
1dcd0 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
1dce0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
1dcf0 41 4c 45 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66  ALE;.    pC->def
1dd00 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
1dd10 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20  .    if( res!=0 
1dd20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1dd30 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1dd40 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1dd50 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  idIsValid==0 );.
1dd60 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 73 65      }.    pC->se
1dd70 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
1dd80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1dd90 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1dda0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  n an attempt to 
1ddb0 6f 70 65 6e 20 61 20 72 65 61 64 20 63 75 72 73  open a read curs
1ddc0 6f 72 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a  or on the .    *
1ddd0 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  * sqlite_master 
1dde0 74 61 62 6c 65 20 72 65 74 75 72 6e 73 20 53 51  table returns SQ
1ddf0 4c 49 54 45 5f 45 4d 50 54 59 2e 0a 20 20 20 20  LITE_EMPTY..    
1de00 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d  */.    pc = pOp-
1de10 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 61 73 73  >p2 - 1;.    ass
1de20 65 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73  ert( pC->rowidIs
1de30 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
1de40 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
1de50 20 30 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   0;.  }.  break;
1de60 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1de70 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20  equence P1 P2 * 
1de80 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74  * *.**.** Find t
1de90 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  he next availabl
1dea0 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
1deb0 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e  r for cursor P1.
1dec0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
1ded0 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e  quence number in
1dee0 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
1def0 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20  ** The sequence 
1df00 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75  number on the cu
1df10 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  rsor is incremen
1df20 74 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a  ted after this.*
1df30 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  * instruction.  
1df40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75  .*/.case OP_Sequ
1df50 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20  ence: {         
1df60 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
1df70 65 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ease */.  assert
1df80 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1df90 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1dfa0 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
1dfb0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1dfc0 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  ]!=0 );.  pOut->
1dfd0 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  u.i = p->apCsr[p
1dfe0 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75 6e  Op->p1]->seqCoun
1dff0 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  t++;.  break;.}.
1e000 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77  ../* Opcode: New
1e010 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a  Rowid P1 P2 P3 *
1e020 20 2a 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 20 6e   *.**.** Get a n
1e030 65 77 20 69 6e 74 65 67 65 72 20 72 65 63 6f 72  ew integer recor
1e040 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b 2e 61 20  d number (a.k.a 
1e050 22 72 6f 77 69 64 22 29 20 75 73 65 64 20 61 73  "rowid") used as
1e060 20 74 68 65 20 6b 65 79 20 74 6f 20 61 20 74 61   the key to a ta
1e070 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 65 63 6f  ble..** The reco
1e080 72 64 20 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  rd number is not
1e090 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65 64   previously used
1e0a0 20 61 73 20 61 20 6b 65 79 20 69 6e 20 74 68 65   as a key in the
1e0b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
1e0c0 6c 65 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  le that cursor P
1e0d0 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 54 68  1 points to.  Th
1e0e0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d  e new record num
1e0f0 62 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ber is written.*
1e100 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 72 65 67  * written to reg
1e110 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
1e120 49 66 20 50 33 3e 30 20 74 68 65 6e 20 50 33 20  If P3>0 then P3 
1e130 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69 6e  is a register in
1e140 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20   the root frame 
1e150 6f 66 20 74 68 69 73 20 56 44 42 45 20 74 68 61  of this VDBE tha
1e160 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74 68 65 20  t holds .** the 
1e170 6c 61 72 67 65 73 74 20 70 72 65 76 69 6f 75 73  largest previous
1e180 6c 79 20 67 65 6e 65 72 61 74 65 64 20 72 65 63  ly generated rec
1e190 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e 6f 20 6e  ord number. No n
1e1a0 65 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ew record number
1e1b0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64  s are.** allowed
1e1c0 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
1e1d0 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
1e1e0 6e 20 74 68 69 73 20 76 61 6c 75 65 20 72 65 61  n this value rea
1e1f0 63 68 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d  ches its maximum
1e200 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49 54 45 5f  , .** an SQLITE_
1e210 46 55 4c 4c 20 65 72 72 6f 72 20 69 73 20 67 65  FULL error is ge
1e220 6e 65 72 61 74 65 64 2e 20 54 68 65 20 50 33 20  nerated. The P3 
1e230 72 65 67 69 73 74 65 72 20 69 73 20 75 70 64 61  register is upda
1e240 74 65 64 20 77 69 74 68 20 74 68 65 20 27 0a 2a  ted with the '.*
1e250 2a 20 67 65 6e 65 72 61 74 65 64 20 72 65 63 6f  * generated reco
1e260 72 64 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  rd number. This 
1e270 50 33 20 6d 65 63 68 61 6e 69 73 6d 20 69 73 20  P3 mechanism is 
1e280 75 73 65 64 20 74 6f 20 68 65 6c 70 20 69 6d 70  used to help imp
1e290 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 41 55  lement the.** AU
1e2a0 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66 65 61 74  TOINCREMENT feat
1e2b0 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ure..*/.case OP_
1e2c0 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  NewRowid: {     
1e2d0 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72        /* out2-pr
1e2e0 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 36  erelease */.  i6
1e2f0 34 20 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  4 v;            
1e300 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1e310 72 6f 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43  rowid */.  VdbeC
1e320 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20  ursor *pC;      
1e330 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74    /* Cursor of t
1e340 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
1e350 6e 65 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  new rowid */.  i
1e360 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
1e370 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1e380 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72  of an sqlite3Btr
1e390 65 65 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e  eeLast() */.  in
1e3a0 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
1e3b0 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1e3c0 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d  to limit the num
1e3d0 62 65 72 20 6f 66 20 73 65 61 72 63 68 65 73 20  ber of searches 
1e3e0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20  */.  Mem *pMem; 
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e400 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1e410 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
1e420 72 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  r AUTOINCREMENT 
1e430 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a  */.  VdbeFrame *
1e440 70 46 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52  pFrame;     /* R
1e450 6f 6f 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42  oot frame of VDB
1e460 45 20 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20  E */..  v = 0;. 
1e470 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73 73 65   res = 0;.  asse
1e480 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
1e490 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
1e4a0 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
1e4b0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1e4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1e4d0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1e4e0 28 70 43 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 29  (pC->pCursor==0)
1e4f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 7a   ){.    /* The z
1e500 65 72 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ero initializati
1e510 6f 6e 20 61 62 6f 76 65 20 69 73 20 61 6c 6c 20  on above is all 
1e520 74 68 61 74 20 69 73 20 6e 65 65 64 65 64 20 2a  that is needed *
1e530 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  /.  }else{.    /
1e540 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64  * The next rowid
1e550 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65   or record numbe
1e560 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72  r (different ter
1e570 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a  ms for the same.
1e580 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73      ** thing) is
1e590 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74   obtained in a t
1e5a0 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68  wo-step algorith
1e5b0 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m..    **.    **
1e5c0 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70   First we attemp
1e5d0 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  t to find the la
1e5e0 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
1e5f0 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65  owid and add one
1e600 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e  .    ** to that.
1e610 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72    But if the lar
1e620 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
1e630 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74  wid is already t
1e640 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a  he maximum.    *
1e650 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  * positive integ
1e660 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  er, we have to f
1e670 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
1e680 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
1e690 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61   probabilistic a
1e6a0 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a  lgorithm.    **.
1e6b0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
1e6c0 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74  d algorithm is t
1e6d0 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64  o select a rowid
1e6e0 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73   at random and s
1e6f0 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  ee if.    ** it 
1e700 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
1e710 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  n the table.  If
1e720 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1e730 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  st, we have.    
1e740 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49  ** succeeded.  I
1e750 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77  f the random row
1e760 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77  id does exist, w
1e770 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f  e select a new o
1e780 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  ne.    ** and tr
1e790 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31  y again, up to 1
1e7a0 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f  00 times..    */
1e7b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
1e7c0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  >isTable );..#if
1e7d0 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54  def SQLITE_32BIT
1e7e0 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e  _ROWID.#   defin
1e7f0 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66  e MAX_ROWID 0x7f
1e800 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20  ffffff.#else.   
1e810 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65   /* Some compile
1e820 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75  rs complain abou
1e830 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74  t constants of t
1e840 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66  he form 0x7fffff
1e850 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20  ffffffffff..    
1e860 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61  ** Others compla
1e870 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66  in about 0x7ffff
1e880 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20  ffffffffffffLL. 
1e890 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
1e8a0 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a  acro seems.    *
1e8b0 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  * to provide the
1e8c0 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20   constant while 
1e8d0 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69  making all compi
1e8e0 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20  lers happy..    
1e8f0 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
1e900 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20  X_ROWID  (i64)( 
1e910 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66  (((u64)0x7ffffff
1e920 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30  f)<<32) | (u64)0
1e930 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64  xffffffff ).#end
1e940 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d  if..    if( !pC-
1e950 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
1e960 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c  ){.      v = sql
1e970 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1e980 65 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72  edRowid(pC->pCur
1e990 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
1e9a0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
1e9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1e9c0 65 4c 61 73 74 28 70 43 2d 3e 70 43 75 72 73 6f  eLast(pC->pCurso
1e9d0 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
1e9e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ea00 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1ea10 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
1ea20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ea30 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
1ea40 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d 50   v = 1;   /* IMP
1ea50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34 20  : R-61914-48074 
1ea60 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1ea70 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1ea80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1ea90 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
1eaa0 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->pCursor) );.  
1eab0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1eac0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1ead0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76  (pC->pCursor, &v
1eae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1eaf0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1eb00 4f 4b 20 29 3b 20 20 20 2f 2a 20 43 61 6e 6e 6f  OK );   /* Canno
1eb10 74 20 66 61 69 6c 20 66 6f 6c 6c 6f 77 69 6e 67  t fail following
1eb20 20 42 74 72 65 65 4c 61 73 74 28 29 20 2a 2f 0a   BtreeLast() */.
1eb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3d            if( v=
1eb40 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  =MAX_ROWID ){.  
1eb50 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73            pC->us
1eb60 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31  eRandomRowid = 1
1eb70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1eb80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  e{.            v
1eb90 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  ++;   /* IMP: R-
1eba0 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20  29538-34987 */. 
1ebb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ebc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69     }.      }..#i
1ebd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ebe0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
1ebf0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1ec00 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
1ec10 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
1ec20 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
1ec30 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
1ec40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1ec50 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  3>0 );.        i
1ec60 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
1ec70 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 46            for(pF
1ec80 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
1ec90 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
1eca0 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
1ecb0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
1ecc0 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
1ecd0 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
1ece0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
1ecf0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1ed00 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72 61  t( pOp->p3<=pFra
1ed10 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20  me->nMem );.    
1ed20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46        pMem = &pF
1ed30 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
1ed40 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p3];.        }el
1ed50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1ed60 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
1ed70 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
1ed80 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
1ed90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
1eda0 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b  ->p3<=p->nMem );
1edb0 0a 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 20  .          pMem 
1edc0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1edd0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 41  ;.          memA
1ede0 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
1edf0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
1ee00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ee10 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d   memIsValid(pMem
1ee20 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 52 45  ) );..        RE
1ee30 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
1ee40 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  ->p3, pMem);.   
1ee50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee60 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d  MemIntegerify(pM
1ee70 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  em);.        ass
1ee80 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
1ee90 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  s & MEM_Int)!=0 
1eea0 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20 68  );  /* mem(P3) h
1eeb0 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72 20  olds an integer 
1eec0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1eed0 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f  Mem->u.i==MAX_RO
1eee0 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61  WID || pC->useRa
1eef0 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20  ndomRowid ){.   
1ef00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ef10 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d  TE_FULL;   /* IM
1ef20 50 3a 20 52 2d 31 32 32 37 35 2d 36 31 33 33 38  P: R-12275-61338
1ef30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
1ef40 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1ef50 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d  error;.        }
1ef60 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 70  .        if( v<p
1ef70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20  Mem->u.i+1 ){.  
1ef80 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d          v = pMem
1ef90 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20  ->u.i + 1;.     
1efa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d 65     }.        pMe
1efb0 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20 20  m->u.i = v;.    
1efc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1efd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
1efe0 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d  tCachedRowid(pC-
1eff0 3e 70 43 75 72 73 6f 72 2c 20 76 3c 4d 41 58 5f  >pCursor, v<MAX_
1f000 52 4f 57 49 44 20 3f 20 76 2b 31 20 3a 20 30 29  ROWID ? v+1 : 0)
1f010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f020 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77  pC->useRandomRow
1f030 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  id ){.      /* I
1f040 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
1f050 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38 31 20  : R-07677-41881 
1f060 49 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 52  If the largest R
1f070 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20 74 6f  OWID is equal to
1f080 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   the.      ** la
1f090 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 69  rgest possible i
1f0a0 6e 74 65 67 65 72 20 28 39 32 32 33 33 37 32 30  nteger (92233720
1f0b0 33 36 38 35 34 37 37 35 38 30 37 29 20 74 68 65  36854775807) the
1f0c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
1f0d0 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73       ** engine s
1f0e0 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20 70 6f  tarts picking po
1f0f0 73 69 74 69 76 65 20 63 61 6e 64 69 64 61 74 65  sitive candidate
1f100 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e 64 6f   ROWIDs at rando
1f110 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a  m until.      **
1f120 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20 74 68   it finds one th
1f130 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f  at is not previo
1f140 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20  usly used. */.  
1f150 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
1f160 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65  >p3==0 );  /* We
1f170 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61   cannot be in ra
1f180 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20  ndom rowid mode 
1f190 69 66 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  if this is.     
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 41 55          ** an AU
1f1c0 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c  TOINCREMENT tabl
1f1d0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 6f  e. */.      /* o
1f1e0 6e 20 74 68 65 20 66 69 72 73 74 20 61 74 74 65  n the first atte
1f1f0 6d 70 74 2c 20 73 69 6d 70 6c 79 20 64 6f 20 6f  mpt, simply do o
1f200 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 72 65  ne more than pre
1f210 76 69 6f 75 73 20 2a 2f 0a 20 20 20 20 20 20 76  vious */.      v
1f220 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20   = lastRowid;.  
1f230 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f      v &= (MAX_RO
1f240 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65 6e 73 75  WID>>1); /* ensu
1f250 72 65 20 64 6f 65 73 6e 27 74 20 67 6f 20 6e 65  re doesn't go ne
1f260 67 61 74 69 76 65 20 2a 2f 0a 20 20 20 20 20 20  gative */.      
1f270 76 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e  v++; /* ensure n
1f280 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20  on-zero */.     
1f290 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
1f2a0 77 68 69 6c 65 28 20 20 20 28 28 72 63 20 3d 20  while(   ((rc = 
1f2b0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1f2c0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 70  toUnpacked(pC->p
1f2d0 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29  Cursor, 0, (u64)
1f2e0 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v,.             
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d 53      0, &res))==S
1f320 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20 20  QLITE_OK).      
1f330 20 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d 30        && (res==0
1f340 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
1f350 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 7b 0a 20   (++cnt<100)){. 
1f360 20 20 20 20 20 20 20 2f 2a 20 63 6f 6c 6c 69 73         /* collis
1f370 69 6f 6e 20 2d 20 74 72 79 20 61 6e 6f 74 68 65  ion - try anothe
1f380 72 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 2a  r random rowid *
1f390 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1f3a0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
1f3b0 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20  eof(v), &v);.   
1f3c0 20 20 20 20 20 69 66 28 20 63 6e 74 3c 35 20 29       if( cnt<5 )
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
1f3e0 72 79 20 22 73 6d 61 6c 6c 22 20 72 61 6e 64 6f  ry "small" rando
1f3f0 6d 20 72 6f 77 69 64 73 20 66 6f 72 20 74 68 65  m rowids for the
1f400 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
1f410 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76  s */.          v
1f420 20 26 3d 20 30 78 66 66 66 66 66 66 3b 0a 20 20   &= 0xffffff;.  
1f430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f440 20 20 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58         v &= (MAX
1f450 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 2f 2a 20 65  _ROWID>>1); /* e
1f460 6e 73 75 72 65 20 64 6f 65 73 6e 27 74 20 67 6f  nsure doesn't go
1f470 20 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 20   negative */.   
1f480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 76       }.        v
1f490 2b 2b 3b 20 2f 2a 20 65 6e 73 75 72 65 20 6e 6f  ++; /* ensure no
1f4a0 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20  n-zero */.      
1f4b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1f4c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
1f4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f4e0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1f4f0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32     /* IMP: R-382
1f500 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20 20  19-53002 */.    
1f510 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
1f520 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
1f530 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1f540 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56  t( v>0 );  /* EV
1f550 3a 20 52 2d 34 30 38 31 32 2d 30 33 35 37 30 20  : R-40812-03570 
1f560 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d  */.    }.    pC-
1f570 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
1f580 30 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72  0;.    pC->defer
1f590 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
1f5a0 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
1f5b0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
1f5c0 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e  ;.  }.  pOut->u.
1f5d0 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a  i = v;.  break;.
1f5e0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e  }../* Opcode: In
1f5f0 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50 34  sert P1 P2 P3 P4
1f600 20 50 35 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20   P5.**.** Write 
1f610 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
1f620 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f  e table of curso
1f630 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74  r P1.  A new ent
1f640 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64  ry is.** created
1f650 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61   if it doesn't a
1f660 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20  lready exist or 
1f670 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20  the data for an 
1f680 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72  existing.** entr
1f690 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  y is overwritten
1f6a0 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74  .  The data is t
1f6b0 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f  he value MEM_Blo
1f6c0 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  b stored in regi
1f6d0 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  ster.** number P
1f6e0 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74  2. The key is st
1f6f0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
1f700 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73   P3. The key mus
1f710 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e  t.** be a MEM_In
1f720 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1f730 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66  OPFLAG_NCHANGE f
1f740 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
1f750 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63  , then the row c
1f760 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a  hange count is.*
1f770 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f  * incremented (o
1f780 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20  therwise not).  
1f790 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41  If the OPFLAG_LA
1f7a0 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20  STROWID flag of 
1f7b0 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  P5 is set,.** th
1f7c0 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72  en rowid is stor
1f7d0 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e  ed for subsequen
1f7e0 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a  t return by the.
1f7f0 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  ** sqlite3_last_
1f800 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66  insert_rowid() f
1f810 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69  unction (otherwi
1f820 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66  se it is unmodif
1f830 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ied)..**.** If t
1f840 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
1f850 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20  KRESULT flag of 
1f860 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 69 66  P5 is set and if
1f870 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1f880 2a 20 74 68 65 20 6c 61 73 74 20 73 65 65 6b 20  * the last seek 
1f890 6f 70 65 72 61 74 69 6f 6e 20 28 4f 50 5f 4e 6f  operation (OP_No
1f8a0 74 45 78 69 73 74 73 29 20 77 61 73 20 61 20 73  tExists) was a s
1f8b0 75 63 63 65 73 73 2c 20 74 68 65 6e 20 74 68 69  uccess, then thi
1f8c0 73 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 77  s.** operation w
1f8d0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
1f8e0 74 6f 20 66 69 6e 64 20 74 68 65 20 61 70 70 72  to find the appr
1f8f0 6f 70 72 69 61 74 65 20 72 6f 77 20 62 65 66 6f  opriate row befo
1f900 72 65 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20  re doing.** the 
1f910 69 6e 73 65 72 74 20 62 75 74 20 77 69 6c 6c 20  insert but will 
1f920 69 6e 73 74 65 61 64 20 6f 76 65 72 77 72 69 74  instead overwrit
1f930 65 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  e the row that t
1f940 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  he cursor is.** 
1f950 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1f960 6e 67 20 74 6f 2e 20 20 50 72 65 73 75 6d 61 62  ng to.  Presumab
1f970 6c 79 2c 20 74 68 65 20 70 72 69 6f 72 20 4f 50  ly, the prior OP
1f980 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f 64  _NotExists opcod
1f990 65 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  e.** has already
1f9a0 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20   positioned the 
1f9b0 63 75 72 73 6f 72 20 63 6f 72 72 65 63 74 6c 79  cursor correctly
1f9c0 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
1f9d0 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 74 68  timization.** th
1f9e0 61 74 20 62 6f 6f 73 74 73 20 70 65 72 66 6f 72  at boosts perfor
1f9f0 6d 61 6e 63 65 20 62 79 20 61 76 6f 69 64 69 6e  mance by avoidin
1fa00 67 20 72 65 64 75 6e 64 61 6e 74 20 73 65 65 6b  g redundant seek
1fa10 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1fa20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20  OPFLAG_ISUPDATE 
1fa30 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
1fa40 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  n this opcode is
1fa50 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55   part of an.** U
1fa60 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e  PDATE operation.
1fa70 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20    Otherwise (if 
1fa80 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61  the flag is clea
1fa90 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  r) then this opc
1faa0 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f  ode.** is part o
1fab0 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  f an INSERT oper
1fac0 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66  ation.  The diff
1fad0 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69  erence is only i
1fae0 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74  mportant to.** t
1faf0 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a  he update hook..
1fb00 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1fb10 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  P4 may point to 
1fb20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
1fb30 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2d 6e 61  ing the table-na
1fb40 6d 65 2c 20 6f 72 0a 2a 2a 20 6d 61 79 20 62 65  me, or.** may be
1fb50 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73 20   NULL. If it is 
1fb60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
1fb70 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 0a  he update-hook .
1fb80 2a 2a 20 28 73 71 6c 69 74 65 33 2e 78 55 70 64  ** (sqlite3.xUpd
1fb90 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73 20  ateCallback) is 
1fba0 69 6e 76 6f 6b 65 64 20 66 6f 6c 6c 6f 77 69 6e  invoked followin
1fbb0 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69  g a successful i
1fbc0 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41  nsert..**.** (WA
1fbd0 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50  RNING/TODO: If P
1fbe0 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75  1 is a pseudo-cu
1fbf0 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64  rsor and P2 is d
1fc00 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
1fc10 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77  located, then ow
1fc20 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73  nership of P2 is
1fc30 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20   transferred to 
1fc40 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  the pseudo-curso
1fc50 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65  r.** and registe
1fc60 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68  r P2 becomes eph
1fc70 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20  emeral.  If the 
1fc80 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65  cursor is change
1fc90 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  d, the.** value 
1fca0 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77  of register P2 w
1fcb0 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e  ill then change.
1fcc0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
1fcd0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75   does not.** cau
1fce0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
1fcf0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ).**.** This ins
1fd00 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  truction only wo
1fd10 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20  rks on tables.  
1fd20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69  The equivalent i
1fd30 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f  nstruction.** fo
1fd40 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f  r indices is OP_
1fd50 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a  IdxInsert..*/./*
1fd60 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49   Opcode: InsertI
1fd70 6e 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  nt P1 P2 P3 P4 P
1fd80 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  5.**.** This wor
1fd90 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20  ks exactly like 
1fda0 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70 74  OP_Insert except
1fdb0 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69 73   that the key is
1fdc0 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
1fdd0 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74 68  value P3, not th
1fde0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
1fdf0 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e  nteger stored in
1fe00 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f   register P3..*/
1fe10 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74 3a  .case OP_Insert:
1fe20 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74   .case OP_Insert
1fe30 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44  Int: {.  Mem *pD
1fe40 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d 45  ata;       /* ME
1fe50 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 64  M cell holding d
1fe60 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ata for the reco
1fe70 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  rd to be inserte
1fe80 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65 79  d */.  Mem *pKey
1fe90 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20  ;        /* MEM 
1fea0 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65 79  cell holding key
1feb0 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64    for the record
1fec0 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20   */.  i64 iKey; 
1fed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1fee0 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20  nteger ROWID or 
1fef0 6b 65 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f  key for the reco
1ff00 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  rd to be inserte
1ff10 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  d */.  VdbeCurso
1ff20 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73  r *pC;   /* Curs
1ff30 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f  or to table into
1ff40 20 77 68 69 63 68 20 69 6e 73 65 72 74 20 69 73   which insert is
1ff50 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
1ff60 74 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20  t nZero;        
1ff70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72  /* Number of zer
1ff80 6f 2d 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o-bytes to appen
1ff90 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
1ffa0 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75  esult;   /* Resu
1ffb0 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65 65 6b  lt of prior seek
1ffc0 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53 45 53   or 0 if no USES
1ffd0 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 2a  EEKRESULT flag *
1ffe0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1fff0 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62 61 73  zDb;  /* databas
20000 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79  e name - used by
20010 20 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b   the update hook
20020 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20030 20 2a 7a 54 62 6c 3b 20 2f 2a 20 54 61 62 6c 65   *zTbl; /* Table
20040 20 6e 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20   name - used by 
20050 74 68 65 20 6f 70 64 61 74 65 20 68 6f 6f 6b 20  the opdate hook 
20060 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
20070 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
20080 20 66 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b   for update hook
20090 3a 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  : SQLITE_UPDATE 
200a0 6f 72 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  or SQLITE_INSERT
200b0 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20 3d 20 26   */..  pData = &
200c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
200d0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
200e0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
200f0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
20100 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
20110 64 28 70 44 61 74 61 29 20 29 3b 0a 20 20 70 43  d(pData) );.  pC
20120 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
20130 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
20140 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
20150 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  t( pC->pCursor!=
20160 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20170 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  C->pseudoTableRe
20180 67 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g==0 );.  assert
20190 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
201a0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
201b0 45 28 70 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61  E(pOp->p2, pData
201c0 29 3b 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  );..  if( pOp->o
201d0 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74  pcode==OP_Insert
201e0 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 26   ){.    pKey = &
201f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
20200 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 2d     assert( pKey-
20210 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
20220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20230 6d 65 6d 49 73 56 61 6c 69 64 28 70 4b 65 79 29  memIsValid(pKey)
20240 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52   );.    REGISTER
20250 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20  _TRACE(pOp->p3, 
20260 70 4b 65 79 29 3b 0a 20 20 20 20 69 4b 65 79 20  pKey);.    iKey 
20270 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d  = pKey->u.i;.  }
20280 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
20290 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
202a0 50 5f 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20  P_InsertInt );. 
202b0 20 20 20 69 4b 65 79 20 3d 20 70 4f 70 2d 3e 70     iKey = pOp->p
202c0 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f  3;.  }..  if( pO
202d0 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e  p->p5 & OPFLAG_N
202e0 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61  CHANGE ) p->nCha
202f0 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70  nge++;.  if( pOp
20300 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41  ->p5 & OPFLAG_LA
20310 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61  STROWID ) db->la
20320 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
20330 77 69 64 20 3d 20 69 4b 65 79 3b 0a 20 20 69 66  wid = iKey;.  if
20340 28 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26  ( pData->flags &
20350 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
20360 20 70 44 61 74 61 2d 3e 7a 20 3d 20 30 3b 0a 20   pData->z = 0;. 
20370 20 20 20 70 44 61 74 61 2d 3e 6e 20 3d 20 30 3b     pData->n = 0;
20380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
20390 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c 61  sert( pData->fla
203a0 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d  gs & (MEM_Blob|M
203b0 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 7d 0a 20  EM_Str) );.  }. 
203c0 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28   seekResult = ((
203d0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
203e0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20  _USESEEKRESULT) 
203f0 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  ? pC->seekResult
20400 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61   : 0);.  if( pDa
20410 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ta->flags & MEM_
20420 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 5a 65 72  Zero ){.    nZer
20430 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65  o = pData->u.nZe
20440 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ro;.  }else{.   
20450 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
20460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
20470 74 43 61 63 68 65 64 52 6f 77 69 64 28 70 43 2d  tCachedRowid(pC-
20480 3e 70 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  >pCursor, 0);.  
20490 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
204a0 65 49 6e 73 65 72 74 28 70 43 2d 3e 70 43 75 72  eInsert(pC->pCur
204b0 73 6f 72 2c 20 30 2c 20 69 4b 65 79 2c 0a 20 20  sor, 0, iKey,.  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 7a          pData->z
204e0 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 6e 5a 65 72  , pData->n, nZer
204f0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
20510 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50  ->p5 & OPFLAG_AP
20520 50 45 4e 44 2c 20 73 65 65 6b 52 65 73 75 6c 74  PEND, seekResult
20530 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 72 6f 77 69  .  );.  pC->rowi
20540 64 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  dIsValid = 0;.  
20550 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
20560 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61  to = 0;.  pC->ca
20570 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
20580 45 5f 53 54 41 4c 45 3b 0a 0a 20 20 2f 2a 20 49  E_STALE;..  /* I
20590 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61 74 65  nvoke the update
205a0 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69 72 65  -hook if require
205b0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  d. */.  if( rc==
205c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d  SQLITE_OK && db-
205d0 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
205e0 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b   && pOp->p4.z ){
205f0 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  .    zDb = db->a
20600 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Db[pC->iDb].zNam
20610 65 3b 0a 20 20 20 20 7a 54 62 6c 20 3d 20 70 4f  e;.    zTbl = pO
20620 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 6f 70 20  p->p4.z;.    op 
20630 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  = ((pOp->p5 & OP
20640 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f  FLAG_ISUPDATE) ?
20650 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a   SQLITE_UPDATE :
20660 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b   SQLITE_INSERT);
20670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
20680 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
20690 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
206a0 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
206b0 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62  rg, op, zDb, zTb
206c0 6c 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73  l, iKey);.    as
206d0 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30  sert( pC->iDb>=0
206e0 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   );.  }.  break;
206f0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
20700 65 6c 65 74 65 20 50 31 20 50 32 20 2a 20 50 34  elete P1 P2 * P4
20710 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20   *.**.** Delete 
20720 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68  the record at wh
20730 69 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f  ich the P1 curso
20740 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  r is currently p
20750 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
20760 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62  he cursor will b
20770 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
20780 61 74 20 65 69 74 68 65 72 20 74 68 65 20 6e 65  at either the ne
20790 78 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f  xt or the previo
207a0 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20  us.** record in 
207b0 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74  the table. If it
207c0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
207d0 67 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65  g at the next re
207e0 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  cord, then.** th
207f0 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74  e next Next inst
20800 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
20810 61 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20  a no-op.  Hence 
20820 69 74 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65  it is OK to dele
20830 74 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66  te.** a record f
20840 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65  rom within an Ne
20850 78 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  xt loop..**.** I
20860 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48  f the OPFLAG_NCH
20870 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20  ANGE flag of P2 
20880 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
20890 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
208a0 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  t is.** incremen
208b0 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e  ted (otherwise n
208c0 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75  ot)..**.** P1 mu
208d0 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f  st not be pseudo
208e0 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20  -table.  It has 
208f0 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 62  to be a real tab
20900 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69  le with.** multi
20910 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20  ple rows..**.** 
20920 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c  If P4 is not NUL
20930 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
20940 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
20950 62 6c 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a  ble that P1 is.*
20960 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
20970 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20  The update hook 
20980 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c  will be invoked,
20990 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a   if it exists..*
209a0 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  * If P4 is not N
209b0 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20  ULL then the P1 
209c0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
209d0 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64   been positioned
209e0 0a 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74  .** using OP_Not
209f0 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69  Found prior to i
20a00 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63  nvoking this opc
20a10 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
20a20 44 65 6c 65 74 65 3a 20 7b 0a 20 20 69 36 34 20  Delete: {.  i64 
20a30 69 4b 65 79 3b 0a 20 20 56 64 62 65 43 75 72 73  iKey;.  VdbeCurs
20a40 6f 72 20 2a 70 43 3b 0a 0a 20 20 69 4b 65 79 20  or *pC;..  iKey 
20a50 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
20a60 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
20a70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
20a80 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
20a90 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
20aa0 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
20ab0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43    assert( pC->pC
20ac0 75 72 73 6f 72 21 3d 30 20 29 3b 20 20 2f 2a 20  ursor!=0 );  /* 
20ad0 4f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 72  Only valid for r
20ae0 65 61 6c 20 74 61 62 6c 65 73 2c 20 6e 6f 20 70  eal tables, no p
20af0 73 65 75 64 6f 74 61 62 6c 65 73 20 2a 2f 0a 0a  seudotables */..
20b00 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61    /* If the upda
20b10 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65 20  te-hook will be 
20b20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 69 4b 65  invoked, set iKe
20b30 79 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20 6f  y to the rowid o
20b40 66 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 62  f the.  ** row b
20b50 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 20 20  eing deleted..  
20b60 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 55 70  */.  if( db->xUp
20b70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20  dateCallback && 
20b80 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
20b90 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
20ba0 61 62 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65  able );.    asse
20bb0 72 74 28 20 70 43 2d 3e 72 6f 77 69 64 49 73 56  rt( pC->rowidIsV
20bc0 61 6c 69 64 20 29 3b 20 20 2f 2a 20 6c 61 73 74  alid );  /* last
20bd0 52 6f 77 69 64 20 73 65 74 20 62 79 20 70 72 65  Rowid set by pre
20be0 76 69 6f 75 73 20 4f 50 5f 4e 6f 74 46 6f 75 6e  vious OP_NotFoun
20bf0 64 20 2a 2f 0a 20 20 20 20 69 4b 65 79 20 3d 20  d */.    iKey = 
20c00 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  pC->lastRowid;. 
20c10 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f   }..  /* The OP_
20c20 44 65 6c 65 74 65 20 6f 70 63 6f 64 65 20 61 6c  Delete opcode al
20c30 77 61 79 73 20 66 6f 6c 6c 6f 77 73 20 61 6e 20  ways follows an 
20c40 4f 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 20  OP_NotExists or 
20c50 4f 50 5f 4c 61 73 74 20 6f 72 0a 20 20 2a 2a 20  OP_Last or.  ** 
20c60 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  OP_Column on the
20c70 20 73 61 6d 65 20 74 61 62 6c 65 20 77 69 74 68   same table with
20c80 6f 75 74 20 61 6e 79 20 69 6e 74 65 72 76 65 6e  out any interven
20c90 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 74  ing operations t
20ca0 68 61 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 6d  hat.  ** might m
20cb0 6f 76 65 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ove or invalidat
20cc0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 48  e the cursor.  H
20cd0 65 6e 63 65 20 63 75 72 73 6f 72 20 70 43 20 69  ence cursor pC i
20ce0 73 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 69 6e  s always pointin
20cf0 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 6f  g.  ** to the ro
20d00 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  w to be deleted 
20d10 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 56  and the sqlite3V
20d20 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
20d30 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 2a 2a  ) operation.  **
20d40 20 62 65 6c 6f 77 20 69 73 20 61 6c 77 61 79 73   below is always
20d50 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 63 61 6e   a no-op and can
20d60 6e 6f 74 20 66 61 69 6c 2e 20 20 57 65 20 77 69  not fail.  We wi
20d70 6c 6c 20 72 75 6e 20 69 74 20 61 6e 79 68 6f 77  ll run it anyhow
20d80 2c 20 74 68 6f 75 67 68 2c 0a 20 20 2a 2a 20 74  , though,.  ** t
20d90 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
20da0 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 20 74  future changes t
20db0 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
20dc0 61 74 6f 72 2e 0a 20 20 2a 2a 2f 0a 20 20 61 73  ator..  **/.  as
20dd0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
20de0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
20df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
20e00 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43  eCursorMoveto(pC
20e10 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 72  );.  if( NEVER(r
20e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 20  c!=SQLITE_OK) ) 
20e30 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
20e40 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 73 71 6c 69  o_error;..  sqli
20e50 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
20e60 64 52 6f 77 69 64 28 70 43 2d 3e 70 43 75 72 73  dRowid(pC->pCurs
20e70 6f 72 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  or, 0);.  rc = s
20e80 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
20e90 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  e(pC->pCursor);.
20ea0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
20eb0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
20ec0 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
20ed0 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
20ee0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
20ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20f00 4b 20 26 26 20 64 62 2d 3e 78 55 70 64 61 74 65  K && db->xUpdate
20f10 43 61 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d  Callback && pOp-
20f20 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 63 6f 6e  >p4.z ){.    con
20f30 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
20f40 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e  b->aDb[pC->iDb].
20f50 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
20f60 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 4f   char *zTbl = pO
20f70 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 64 62 2d  p->p4.z;.    db-
20f80 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
20f90 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c  (db->pUpdateArg,
20fa0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
20fb0 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 29  zDb, zTbl, iKey)
20fc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
20fd0 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 7d 0a  ->iDb>=0 );.  }.
20fe0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 20    if( pOp->p2 & 
20ff0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
21000 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
21010 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63   break;.}./* Opc
21020 6f 64 65 3a 20 52 65 73 65 74 43 6f 75 6e 74 20  ode: ResetCount 
21030 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  * * * * *.**.** 
21040 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
21050 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
21060 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
21070 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
21080 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  .** change count
21090 65 72 20 28 72 65 74 75 72 6e 65 64 20 62 79 20  er (returned by 
210a0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
210b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61 6e   to sqlite3_chan
210c0 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20  ges())..** Then 
210d0 74 68 65 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c  the VMs internal
210e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
210f0 72 65 73 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20  resets to 0..** 
21100 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
21110 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
21120 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73  ..*/.case OP_Res
21130 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c  etCount: {.  sql
21140 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
21150 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
21160 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  e);.  p->nChange
21170 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
21180 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
21190 44 61 74 61 20 50 31 20 50 32 20 2a 20 2a 20 2a  Data P1 P2 * * *
211a0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
211b0 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
211c0 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20 64  e complete row d
211d0 61 74 61 20 66 6f 72 20 63 75 72 73 6f 72 20 50  ata for cursor P
211e0 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e  1..** There is n
211f0 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  o interpretation
21200 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a   of the data.  .
21210 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20 63 6f  ** It is just co
21220 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 32  pied onto the P2
21230 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74 6c   register exactl
21240 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66  y as .** it is f
21250 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
21260 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
21270 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f   If the P1 curso
21280 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69  r must be pointi
21290 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
212a0 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f  w (not a NULL ro
212b0 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20  w).** of a real 
212c0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
212d0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 2f 2a  udo-table..*/./*
212e0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 4b 65 79 20   Opcode: RowKey 
212f0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
21300 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67  * Write into reg
21310 69 73 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d  ister P2 the com
21320 70 6c 65 74 65 20 72 6f 77 20 6b 65 79 20 66 6f  plete row key fo
21330 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20  r cursor P1..** 
21340 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65  There is no inte
21350 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68  rpretation of th
21360 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 54 68 65  e data.  .** The
21370 20 6b 65 79 20 69 73 20 63 6f 70 69 65 64 20 6f   key is copied o
21380 6e 74 6f 20 74 68 65 20 50 33 20 72 65 67 69 73  nto the P3 regis
21390 74 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a  ter exactly as .
213a0 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69  ** it is found i
213b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
213c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
213d0 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74  e P1 cursor must
213e0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
213f0 61 20 76 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74  a valid row (not
21400 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20   a NULL row).** 
21410 6f 66 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  of a real table,
21420 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
21430 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
21440 52 6f 77 4b 65 79 3a 0a 63 61 73 65 20 4f 50 5f  RowKey:.case OP_
21450 52 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56 64 62  RowData: {.  Vdb
21460 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
21470 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
21480 20 20 75 33 32 20 6e 3b 0a 20 20 69 36 34 20 6e    u32 n;.  i64 n
21490 36 34 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61  64;..  pOut = &a
214a0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
214b0 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
214c0 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a  (p, pOut);..  /*
214d0 20 4e 6f 74 65 20 74 68 61 74 20 52 6f 77 4b 65   Note that RowKe
214e0 79 20 61 6e 64 20 52 6f 77 44 61 74 61 20 61 72  y and RowData ar
214f0 65 20 72 65 61 6c 6c 79 20 65 78 61 63 74 6c 79  e really exactly
21500 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 72 75   the same instru
21510 63 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73 65 72  ction */.  asser
21520 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
21530 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
21540 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
21550 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
21560 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
21570 73 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d 3e 6f  sTable || pOp->o
21580 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 4b 65 79  pcode==OP_RowKey
21590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
215a0 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70 4f 70  ->isIndex || pOp
215b0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
215c0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
215d0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
215e0 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  ert( pC->nullRow
215f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21600 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65   pC->pseudoTable
21610 52 65 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Reg==0 );..  if(
21620 20 70 43 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a   pC->pSorter ){.
21630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21640 56 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65 79  VdbeSorterRowkey
21650 28 64 62 2c 20 70 43 2c 20 70 4f 75 74 29 3b 0a  (db, pC, pOut);.
21660 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
21670 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 43    assert( pC->pC
21680 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43  ursor!=0 );.  pC
21690 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
216a0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  r;.  assert( sql
216b0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
216c0 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b  sValid(pCrsr) );
216d0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f  ..  /* The OP_Ro
216e0 77 4b 65 79 20 61 6e 64 20 4f 50 5f 52 6f 77 44  wKey and OP_RowD
216f0 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c 77 61  ata opcodes alwa
21700 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74  ys follow OP_Not
21710 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a 20 4f  Exists or.  ** O
21720 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65 78 74  P_Rewind/Op_Next
21730 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72 76 65   with no interve
21740 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  ning instruction
21750 73 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76  s that might inv
21760 61 6c 69 64 61 74 65 0a 20 20 2a 2a 20 74 68 65  alidate.  ** the
21770 20 63 75 72 73 6f 72 2e 20 20 48 65 6e 63 65 20   cursor.  Hence 
21780 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
21790 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
217a0 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 69 73 20  oveto() call is 
217b0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 61 20 6e 6f  always.  ** a no
217c0 2d 6f 70 20 61 6e 64 20 63 61 6e 20 6e 65 76 65  -op and can neve
217d0 72 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20  r fail.  But we 
217e0 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61 63  leave it in plac
217f0 65 20 61 73 20 61 20 73 61 66 65 74 79 2e 0a 20  e as a safety.. 
21800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
21810 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
21820 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
21830 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
21840 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 28  oveto(pC);.  if(
21850 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54   NEVER(rc!=SQLIT
21860 45 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f  E_OK) ) goto abo
21870 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
21880 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e  ..  if( pC->isIn
21890 64 65 78 20 29 7b 0a 20 20 20 20 61 73 73 65 72  dex ){.    asser
218a0 74 28 20 21 70 43 2d 3e 69 73 54 61 62 6c 65 20  t( !pC->isTable 
218b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
218c0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
218d0 70 43 72 73 72 2c 20 26 6e 36 34 29 3b 0a 20 20  pCrsr, &n64);.  
218e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
218f0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
21900 20 54 72 75 65 20 62 65 63 61 75 73 65 20 6f 66   True because of
21910 20 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 20   CursorMoveto() 
21920 63 61 6c 6c 20 61 62 6f 76 65 20 2a 2f 0a 20 20  call above */.  
21930 20 20 69 66 28 20 6e 36 34 3e 64 62 2d 3e 61 4c    if( n64>db->aL
21940 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
21950 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
21960 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
21970 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 28  .    }.    n = (
21980 75 33 32 29 6e 36 34 3b 0a 20 20 7d 65 6c 73 65  u32)n64;.  }else
21990 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
219a0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
219b0 70 43 72 73 72 2c 20 26 6e 29 3b 0a 20 20 20 20  pCrsr, &n);.    
219c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
219d0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 44  TE_OK );    /* D
219e0 61 74 61 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  ataSize() cannot
219f0 20 66 61 69 6c 20 2a 2f 0a 20 20 20 20 69 66 28   fail */.    if(
21a00 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   n>(u32)db->aLim
21a10 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
21a20 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
21a30 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
21a40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
21a50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
21a60 77 28 70 4f 75 74 2c 20 6e 2c 20 30 29 20 29 7b  w(pOut, n, 0) ){
21a70 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
21a80 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20  ;.  }.  pOut->n 
21a90 3d 20 6e 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70  = n;.  MemSetTyp
21aa0 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
21ab0 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 70 43 2d  Blob);.  if( pC-
21ac0 3e 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  >isIndex ){.    
21ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21ae0 65 4b 65 79 28 70 43 72 73 72 2c 20 30 2c 20 6e  eKey(pCrsr, 0, n
21af0 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 7d 65  , pOut->z);.  }e
21b00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
21b10 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 70  lite3BtreeData(p
21b20 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74  Crsr, 0, n, pOut
21b30 2d 3e 7a 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  ->z);.  }.  pOut
21b40 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
21b50 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65  TF8;  /* In case
21b60 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65   the blob is eve
21b70 72 20 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a  r cast to text *
21b80 2f 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  /.  UPDATE_MAX_B
21b90 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
21ba0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
21bb0 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50  code: Rowid P1 P
21bc0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74  2 * * *.**.** St
21bd0 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  ore in register 
21be0 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  P2 an integer wh
21bf0 69 63 68 20 69 73 20 74 68 65 20 6b 65 79 20 6f  ich is the key o
21c00 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  f the table entr
21c10 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69 73 20  y that.** P1 is 
21c20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20  currently point 
21c30 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63 61 6e  to..**.** P1 can
21c40 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 6f 72   be either an or
21c50 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
21c60 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
21c70 20 20 54 68 65 72 65 20 75 73 65 64 20 74 6f 0a    There used to.
21c80 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61 74 65  ** be a separate
21c90 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63 6f 64   OP_VRowid opcod
21ca0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 76  e for use with v
21cb0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 62  irtual tables, b
21cc0 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 6f  ut this.** one o
21cd0 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b 73 20  pcode now works 
21ce0 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65 20 74  for both table t
21cf0 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ypes..*/.case OP
21d00 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  _Rowid: {       
21d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
21d20 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
21d30 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
21d40 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c  ;.  i64 v;.  sql
21d50 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
21d60 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
21d70 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
21d80 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  e;..  assert( pO
21d90 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
21da0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
21db0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
21dc0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
21dd0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
21de0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 70 73 65   assert( pC->pse
21df0 75 64 6f 54 61 62 6c 65 52 65 67 3d 3d 30 20 29  udoTableReg==0 )
21e00 3b 0a 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c  ;.  if( pC->null
21e10 52 6f 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  Row ){.    pOut-
21e20 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
21e30 6c 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  l;.    break;.  
21e40 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65  }else if( pC->de
21e50 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
21e60 20 20 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65      v = pC->move
21e70 74 6f 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65  toTarget;.#ifnde
21e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
21e90 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c  RTUALTABLE.  }el
21ea0 73 65 20 69 66 28 20 70 43 2d 3e 70 56 74 61 62  se if( pC->pVtab
21eb0 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 70 56  Cursor ){.    pV
21ec0 74 61 62 20 3d 20 70 43 2d 3e 70 56 74 61 62 43  tab = pC->pVtabC
21ed0 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
21ee0 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
21ef0 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
21f00 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d  assert( pModule-
21f10 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 72  >xRowid );.    r
21f20 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f  c = pModule->xRo
21f30 77 69 64 28 70 43 2d 3e 70 56 74 61 62 43 75 72  wid(pC->pVtabCur
21f40 73 6f 72 2c 20 26 76 29 3b 0a 20 20 20 20 69 6d  sor, &v);.    im
21f50 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67 28 70  portVtabErrMsg(p
21f60 2c 20 70 56 74 61 62 29 3b 0a 23 65 6e 64 69 66  , pVtab);.#endif
21f70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21f80 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
21f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
21fa0 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72  ert( pC->pCursor
21fb0 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  !=0 );.    rc = 
21fc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
21fd0 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20  rMoveto(pC);.   
21fe0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
21ff0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
22000 72 3b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 72  r;.    if( pC->r
22010 6f 77 69 64 49 73 56 61 6c 69 64 20 29 7b 0a 20  owidIsValid ){. 
22020 20 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61 73       v = pC->las
22030 74 52 6f 77 69 64 3b 0a 20 20 20 20 7d 65 6c 73  tRowid;.    }els
22040 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
22050 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
22060 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26  e(pC->pCursor, &
22070 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
22080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22090 29 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 6f  );  /* Always so
220a0 20 62 65 63 61 75 73 65 20 6f 66 20 43 75 72 73   because of Curs
220b0 6f 72 4d 6f 76 65 74 6f 28 29 20 61 62 6f 76 65  orMoveto() above
220c0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
220d0 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20  pOut->u.i = v;. 
220e0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
220f0 63 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31  code: NullRow P1
22100 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d   * * * *.**.** M
22110 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50  ove the cursor P
22120 31 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e  1 to a null row.
22130 20 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20    Any OP_Column 
22140 6f 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68  operations.** th
22150 61 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74  at occur while t
22160 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20  he cursor is on 
22170 74 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c  the null row wil
22180 6c 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74  l always.** writ
22190 65 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  e a NULL..*/.cas
221a0 65 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a  e OP_NullRow: {.
221b0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
221c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
221d0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
221e0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
221f0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
22200 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
22210 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
22220 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  pC->nullRow = 1;
22230 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61  .  pC->rowidIsVa
22240 6c 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  lid = 0;.  if( p
22250 43 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  C->pCursor ){.  
22260 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
22270 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 70 43  earCursor(pC->pC
22280 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72  ursor);.  }.  br
22290 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
222a0 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20  e: Last P1 P2 * 
222b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  * *.**.** The ne
222c0 78 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f  xt use of the Ro
222d0 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72  wid or Column or
222e0 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
222f0 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c  n for P1 .** wil
22300 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c  l refer to the l
22310 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
22320 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
22330 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20  or index..** If 
22340 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
22350 65 78 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20  ex is empty and 
22360 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20  P2>0, then jump 
22370 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
22380 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30  2..** If P2 is 0
22390 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
223a0 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74   or index is not
223b0 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72   empty, fall thr
223c0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
223d0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
223e0 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
223f0 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20  _Last: {        
22400 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
22410 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
22420 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
22430 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
22440 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
22450 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
22460 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
22470 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22480 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
22490 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  !=0 );.  pCrsr =
224a0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
224b0 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29 7b 0a  if( pCrsr==0 ){.
224c0 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d      res = 1;.  }
224d0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
224e0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
224f0 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
22500 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  }.  pC->nullRow 
22510 3d 20 28 75 38 29 72 65 73 3b 0a 20 20 70 43 2d  = (u8)res;.  pC-
22520 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
22530 3d 20 30 3b 0a 20 20 70 43 2d 3e 72 6f 77 69 64  = 0;.  pC->rowid
22540 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 70  IsValid = 0;.  p
22550 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
22560 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
22570 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26  if( pOp->p2>0 &&
22580 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20 3d   res ){.    pc =
22590 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
225a0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f  }.  break;.}.../
225b0 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50  * Opcode: Sort P
225c0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
225d0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   This opcode doe
225e0 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  s exactly the sa
225f0 6d 65 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52  me thing as OP_R
22600 65 77 69 6e 64 20 65 78 63 65 70 74 20 74 68 61  ewind except tha
22610 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e  t.** it incremen
22620 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ts an undocument
22630 65 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ed global variab
22640 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  le used for test
22650 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69  ing..**.** Sorti
22660 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
22670 65 64 20 62 79 20 77 72 69 74 69 6e 67 20 72 65  ed by writing re
22680 63 6f 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72  cords into a sor
22690 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  ting index,.** t
226a0 68 65 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68  hen rewinding th
226b0 61 74 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61  at index and pla
226c0 79 69 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f  ying it back fro
226d0 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a  m beginning to.*
226e0 2a 20 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74  * end.  We use t
226f0 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64  he OP_Sort opcod
22700 65 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f  e instead of OP_
22710 52 65 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65  Rewind to do the
22720 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f  .** rewinding so
22730 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
22740 20 76 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62   variable will b
22750 65 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e  e incremented an
22760 64 0a 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20  d.** regression 
22770 74 65 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d  tests can determ
22780 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
22790 6f 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  ot the optimizer
227a0 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79   is.** correctly
227b0 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20   optimizing out 
227c0 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  sorts..*/.case O
227d0 50 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20  P_Sort: {       
227e0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64   /* jump */.#ifd
227f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
22800 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
22810 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
22820 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b  _search_count--;
22830 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f  .#endif.  p->aCo
22840 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
22850 54 53 54 41 54 55 53 5f 53 4f 52 54 2d 31 5d 2b  TSTATUS_SORT-1]+
22860 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  +;.  /* Fall thr
22870 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77  ough into OP_Rew
22880 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f  ind */.}./* Opco
22890 64 65 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32  de: Rewind P1 P2
228a0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65   * * *.**.** The
228b0 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65   next use of the
228c0 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e   Rowid or Column
228d0 20 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63   or Next instruc
228e0 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20  tion for P1 .** 
228f0 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68  will refer to th
22900 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
22910 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
22920 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
22930 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
22940 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
22950 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a  and P2>0, then j
22960 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
22970 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20  to P2..** If P2 
22980 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74  is 0 or if the t
22990 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
229a0 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
229b0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
229c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
229d0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  truction..*/.cas
229e0 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20  e OP_Rewind: {  
229f0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
22a00 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
22a10 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
22a20 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Crsr;.  int res;
22a30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
22a40 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
22a50 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
22a60 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
22a70 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
22a80 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 72  rt( pC!=0 );.  r
22a90 65 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 43  es = 1;.  if( pC
22aa0 2d 3e 70 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  ->pSorter ){.   
22ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
22ac0 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 64 62  eSorterRewind(db
22ad0 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d  , pC, &res);.  }
22ae0 65 6c 73 65 20 69 66 28 20 28 70 43 72 73 72 20  else if( (pCrsr 
22af0 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 29 21 3d  = pC->pCursor)!=
22b00 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
22b10 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
22b20 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
22b30 20 20 70 43 2d 3e 61 74 46 69 72 73 74 20 3d 20    pC->atFirst = 
22b40 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 20  res==0 ?1:0;.   
22b50 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
22b60 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  eto = 0;.    pC-
22b70 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
22b80 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
22b90 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
22ba0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 2d 3e   = 0;.  }.  pC->
22bb0 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65  nullRow = (u8)re
22bc0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  s;.  assert( pOp
22bd0 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
22be0 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  2<p->nOp );.  if
22bf0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63 20  ( res ){.    pc 
22c00 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
22c10 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
22c20 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50  * Opcode: Next P
22c30 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a  1 P2 * * P5.**.*
22c40 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73 6f 72  * Advance cursor
22c50 20 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70   P1 so that it p
22c60 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 65 78  oints to the nex
22c70 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  t key/data pair 
22c80 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
22c90 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
22ca0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
22cb0 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20  key/value pairs 
22cc0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
22cd0 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
22ce0 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
22cf0 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63  n.  But if the c
22d00 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20 77 61  ursor advance wa
22d10 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  s successful,.**
22d20 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
22d30 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54  y to P2..**.** T
22d40 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
22d50 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20  t be for a real 
22d60 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
22d70 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
22d80 20 49 66 20 50 35 20 69 73 20 70 6f 73 69 74 69   If P5 is positi
22d90 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20  ve and the jump 
22da0 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65  is taken, then e
22db0 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  vent counter.** 
22dc0 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74  number P5-1 in t
22dd0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
22de0 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  ement is increme
22df0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  nted..**.** See 
22e00 61 6c 73 6f 3a 20 50 72 65 76 0a 2a 2f 0a 2f 2a  also: Prev.*/./*
22e10 20 4f 70 63 6f 64 65 3a 20 50 72 65 76 20 50 31   Opcode: Prev P1
22e20 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a   P2 * * P5.**.**
22e30 20 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20   Back up cursor 
22e40 50 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  P1 so that it po
22e50 69 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65 76  ints to the prev
22e60 69 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61  ious key/data pa
22e70 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62  ir in its.** tab
22e80 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66  le or index.  If
22e90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65   there is no pre
22ea0 76 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20  vious key/value 
22eb0 70 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20  pairs then fall 
22ec0 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
22ed0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
22ee0 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  ruction.  But if
22ef0 20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b   the cursor back
22f00 75 70 20 77 61 73 20 73 75 63 63 65 73 73 66 75  up was successfu
22f10 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64  l,.** jump immed
22f20 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
22f30 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
22f40 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
22f50 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
22f60 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
22f70 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70  **.** If P5 is p
22f80 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20  ositive and the 
22f90 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74  jump is taken, t
22fa0 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65  hen event counte
22fb0 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31  r.** number P5-1
22fc0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
22fd0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e   statement is in
22fe0 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 63 61  cremented..*/.ca
22ff0 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20  se OP_Prev:     
23000 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
23010 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b 20  case OP_Next: { 
23020 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
23030 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
23040 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
23050 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
23060 3b 0a 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49  ;..  CHECK_FOR_I
23070 4e 54 45 52 52 55 50 54 3b 0a 20 20 61 73 73 65  NTERRUPT;.  asse
23080 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
23090 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
230a0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
230b0 28 20 70 4f 70 2d 3e 70 35 3c 3d 41 72 72 61 79  ( pOp->p5<=Array
230c0 53 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72  Size(p->aCounter
230d0 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  ) );.  pC = p->a
230e0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
230f0 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 0a 20 20   if( pC==0 ){.  
23100 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 53 65 65    break;  /* See
23110 20 74 69 63 6b 65 74 20 23 32 32 37 33 20 2a 2f   ticket #2273 */
23120 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 2d 3e 70  .  }.  if( pC->p
23130 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 61 73  Sorter ){.    as
23140 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
23150 65 3d 3d 4f 50 5f 4e 65 78 74 20 29 3b 0a 20 20  e==OP_Next );.  
23160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
23170 62 65 53 6f 72 74 65 72 4e 65 78 74 28 64 62 2c  beSorterNext(db,
23180 20 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65   pC, &res);.  }e
23190 6c 73 65 7b 0a 20 20 20 20 70 43 72 73 72 20 3d  lse{.    pCrsr =
231a0 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
231b0 20 20 69 66 28 20 70 43 72 73 72 3d 3d 30 20 29    if( pCrsr==0 )
231c0 7b 0a 20 20 20 20 20 20 70 43 2d 3e 6e 75 6c 6c  {.      pC->null
231d0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  Row = 1;.      b
231e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
231f0 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  res = 1;.    ass
23200 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
23210 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
23220 20 20 72 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f    rc = pOp->opco
23230 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 3f 20 73 71  de==OP_Next ? sq
23240 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
23250 43 72 73 72 2c 20 26 72 65 73 29 20 3a 0a 20 20  Crsr, &res) :.  
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23280 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
23290 75 73 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b  us(pCrsr, &res);
232a0 0a 20 20 7d 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  .  }.  pC->nullR
232b0 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20 20  ow = (u8)res;.  
232c0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
232d0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a  = CACHE_STALE;..
232e0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
232f0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
23300 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 4f   - 1;.    if( pO
23310 70 2d 3e 70 35 20 29 20 70 2d 3e 61 43 6f 75 6e  p->p5 ) p->aCoun
23320 74 65 72 5b 70 4f 70 2d 3e 70 35 2d 31 5d 2b 2b  ter[pOp->p5-1]++
23330 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
23340 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
23350 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
23360 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 43  .#endif.  }.  pC
23370 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d  ->rowidIsValid =
23380 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
23390 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e  /* Opcode: IdxIn
233a0 73 65 72 74 20 50 31 20 50 32 20 50 33 20 2a 20  sert P1 P2 P3 * 
233b0 50 35 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P5.**.** Registe
233c0 72 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51  r P2 holds an SQ
233d0 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65  L index key made
233e0 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61   using the.** Ma
233f0 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
23400 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63  tions.  This opc
23410 6f 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20  ode writes that 
23420 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  key.** into the 
23430 69 6e 64 65 78 20 50 31 2e 20 20 44 61 74 61 20  index P1.  Data 
23440 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73  for the entry is
23450 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69   nil..**.** P3 i
23460 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 70 72  s a flag that pr
23470 6f 76 69 64 65 73 20 61 20 68 69 6e 74 20 74 6f  ovides a hint to
23480 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
23490 72 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 69  r that this.** i
234a0 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20  nsert is likely 
234b0 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e  to be an append.
234c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
234d0 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
234e0 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  ks for indices. 
234f0 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
23500 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
23510 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f  or tables is OP_
23520 49 6e 73 65 72 74 2e 0a 2a 2f 0a 63 61 73 65 20  Insert..*/.case 
23530 4f 50 5f 49 64 78 49 6e 73 65 72 74 3a 20 7b 20  OP_IdxInsert: { 
23540 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f         /* in2 */
23550 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23560 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  C;.  BtCursor *p
23570 43 72 73 72 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  Crsr;.  int nKey
23580 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
23590 7a 4b 65 79 3b 0a 0a 20 20 61 73 73 65 72 74 28  zKey;..  assert(
235a0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
235b0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
235c0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
235d0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
235e0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
235f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
23600 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
23610 64 62 2c 20 70 43 29 3b 0a 20 20 69 66 28 20 72  db, pC);.  if( r
23620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
23630 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
23640 5f 65 72 72 6f 72 3b 0a 20 20 70 49 6e 32 20 3d  _error;.  pIn2 =
23650 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
23660 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32 2d  .  assert( pIn2-
23670 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
23680 62 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  b );.  pCrsr = p
23690 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  C->pCursor;.  if
236a0 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d  ( ALWAYS(pCrsr!=
236b0 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
236c0 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30  ( pC->isTable==0
236d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 45 78 70   );.    rc = Exp
236e0 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20  andBlob(pIn2);. 
236f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 4b  E_OK ){.      nK
23710 65 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20  ey = pIn2->n;.  
23720 20 20 20 20 7a 4b 65 79 20 3d 20 70 49 6e 32 2d      zKey = pIn2-
23730 3e 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  >z;.      rc = s
23740 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
23750 74 28 70 43 72 73 72 2c 20 7a 4b 65 79 2c 20 6e  t(pCrsr, zKey, n
23760 4b 65 79 2c 20 22 22 2c 20 30 2c 20 30 2c 20 70  Key, "", 0, 0, p
23770 4f 70 2d 3e 70 33 2c 20 0a 20 20 20 20 20 20 20  Op->p3, .       
23780 20 20 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f     ((pOp->p5 & O
23790 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
237a0 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52  ULT) ? pC->seekR
237b0 65 73 75 6c 74 20 3a 20 30 29 0a 20 20 20 20 20  esult : 0).     
237c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
237d0 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
237e0 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 20  veto==0 );.     
237f0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
23800 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
23810 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
23820 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
23830 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50 32   IdxDelete P1 P2
23840 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   P3 * *.**.** Th
23850 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33 20  e content of P3 
23860 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
23870 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20 50  ng at register P
23880 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70  2 form.** an unp
23890 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e  acked index key.
238a0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 6d   This opcode rem
238b0 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79 20  oves that entry 
238c0 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e 64  from the .** ind
238d0 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72  ex opened by cur
238e0 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20  sor P1..*/.case 
238f0 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b 0a  OP_IdxDelete: {.
23900 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23910 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
23920 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
23930 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
23940 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   r;..  assert( p
23950 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 61 73  Op->p3>0 );.  as
23960 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
23970 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
23980 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 2b 31 20 29 3b  p3<=p->nMem+1 );
23990 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
239a0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
239b0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
239c0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
239d0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
239e0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
239f0 72 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  rsr = pC->pCurso
23a00 72 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  r;.  if( ALWAYS(
23a10 70 43 72 73 72 21 3d 30 29 20 29 7b 0a 20 20 20  pCrsr!=0) ){.   
23a20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
23a30 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  ->pKeyInfo;.    
23a40 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
23a50 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 72 2e 66  pOp->p3;.    r.f
23a60 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72 2e  lags = 0;.    r.
23a70 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
23a80 2d 3e 70 32 5d 3b 0a 23 69 66 64 65 66 20 53 51  ->p2];.#ifdef SQ
23a90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
23aa0 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b   int i; for(i=0;
23ab0 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b   i<r.nField; i++
23ac0 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56  ) assert( memIsV
23ad0 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29  alid(&r.aMem[i])
23ae0 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20   ); }.#endif.   
23af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23b00 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
23b10 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30  (pCrsr, &r, 0, 0
23b20 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
23b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23b40 26 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  & res==0 ){.    
23b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
23b60 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72 29  reeDelete(pCrsr)
23b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23b80 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
23b90 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20  Moveto==0 );.   
23ba0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
23bb0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
23bc0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
23bd0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f  /* Opcode: IdxRo
23be0 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  wid P1 P2 * * *.
23bf0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f  **.** Write into
23c00 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20   register P2 an 
23c10 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
23c20 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
23c30 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 61 74  in the record at
23c40 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
23c50 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69  he index key poi
23c60 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f  nted to by curso
23c70 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65  r P1.  This inte
23c80 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  ger should be.**
23c90 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
23ca0 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f  e table entry to
23cb0 20 77 68 69 63 68 20 74 68 69 73 20 69 6e 64 65   which this inde
23cc0 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a  x entry points..
23cd0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
23ce0 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72  Rowid, MakeRecor
23cf0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  d..*/.case OP_Id
23d00 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  xRowid: {       
23d10 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
23d20 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 42  rerelease */.  B
23d30 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
23d40 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
23d50 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 3b 0a 0a  ;.  i64 rowid;..
23d60 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
23d70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
23d80 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
23d90 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
23da0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
23db0 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72  ( pC!=0 );.  pCr
23dc0 73 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  sr = pC->pCursor
23dd0 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
23de0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66  = MEM_Null;.  if
23df0 28 20 41 4c 57 41 59 53 28 70 43 72 73 72 21 3d  ( ALWAYS(pCrsr!=
23e00 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0) ){.    rc = s
23e10 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
23e20 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20  Moveto(pC);.    
23e30 69 66 28 20 4e 45 56 45 52 28 72 63 29 20 29 20  if( NEVER(rc) ) 
23e40 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
23e50 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  o_error;.    ass
23e60 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
23e70 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
23e80 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
23e90 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
23ea0 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77  if( !pC->nullRow
23eb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23ec0 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
23ed0 69 64 28 64 62 2c 20 70 43 72 73 72 2c 20 26 72  id(db, pCrsr, &r
23ee0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
23ef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23f00 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  {.        goto a
23f10 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
23f20 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
23f30 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 6f 77   pOut->u.i = row
23f40 69 64 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  id;.      pOut->
23f50 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
23f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
23f70 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
23f80 3a 20 49 64 78 47 45 20 50 31 20 50 32 20 50 33  : IdxGE P1 P2 P3
23f90 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65   P4 P5.**.** The
23fa0 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
23fb0 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
23fc0 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
23fd0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
23fe0 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
23ff0 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70  the ROWID.  Comp
24000 61 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c  are this key val
24010 75 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  ue against the i
24020 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31  ndex .** that P1
24030 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
24040 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72  inting to, ignor
24050 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20 6f 6e  ing the ROWID on
24060 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a   the P1 index..*
24070 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
24080 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72  ndex entry is gr
24090 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
240a0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
240b0 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d  alue.** then jum
240c0 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
240d0 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
240e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
240f0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
24100 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72  If P5 is non-zer
24110 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 76  o then the key v
24120 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
24130 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f 6e 20  d by an epsilon 
24140 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65  .** prior to the
24150 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
24160 69 73 20 6d 61 6b 65 20 74 68 65 20 6f 70 63 6f  is make the opco
24170 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78  de work like Idx
24180 47 54 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  GT except.** tha
24190 74 20 69 66 20 74 68 65 20 6b 65 79 20 66 72 6f  t if the key fro
241a0 6d 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  m register P3 is
241b0 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
241c0 20 6b 65 79 20 69 6e 20 74 68 65 20 63 75 72 73   key in the curs
241d0 6f 72 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  or,.** the resul
241e0 74 20 69 73 20 66 61 6c 73 65 20 77 68 65 72 65  t is false where
241f0 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20 74  as it would be t
24200 72 75 65 20 77 69 74 68 20 49 64 78 47 54 2e 0a  rue with IdxGT..
24210 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  */./* Opcode: Id
24220 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34 20  xLT P1 P2 P3 P4 
24230 50 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  P5.**.** The P4 
24240 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73 20  register values 
24250 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50  beginning with P
24260 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  3 form an unpack
24270 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79  ed index .** key
24280 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
24290 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72 65 20  ROWID.  Compare 
242a0 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61  this key value a
242b0 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78  gainst the index
242c0 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20   .** that P1 is 
242d0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
242e0 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20  ng to, ignoring 
242f0 74 68 65 20 52 4f 57 49 44 20 6f 6e 20 74 68 65  the ROWID on the
24300 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a   P1 index..**.**
24310 20 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78   If the P1 index
24320 20 65 6e 74 72 79 20 69 73 20 6c 65 73 73 20 74   entry is less t
24330 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
24340 65 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50  e then jump to P
24350 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  2..** Otherwise 
24360 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
24370 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
24380 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
24390 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  5 is non-zero th
243a0 65 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  en the key value
243b0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 62 79   is increased by
243c0 20 61 6e 20 65 70 73 69 6c 6f 6e 20 70 72 69 6f   an epsilon prio
243d0 72 20 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 6d  r .** to the com
243e0 70 61 72 69 73 6f 6e 2e 20 20 54 68 69 73 20 6d  parison.  This m
243f0 61 6b 65 73 20 74 68 65 20 6f 70 63 6f 64 65 20  akes the opcode 
24400 77 6f 72 6b 20 6c 69 6b 65 20 49 64 78 4c 45 2e  work like IdxLE.
24410 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c  .*/.case OP_IdxL
24420 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  T:          /* j
24430 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ump */.case OP_I
24440 64 78 47 45 3a 20 7b 20 20 20 20 20 20 20 20 2f  dxGE: {        /
24450 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65  * jump */.  Vdbe
24460 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
24470 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b 65  t res;.  Unpacke
24480 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61 73  dRecord r;..  as
24490 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
244a0 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
244b0 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
244c0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
244d0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
244e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
244f0 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64 20 29   pC->isOrdered )
24500 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
24510 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 29 20 29  C->pCursor!=0) )
24520 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
24530 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
24540 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
24550 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c  t( pOp->p5==0 ||
24560 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20   pOp->p5==1 );. 
24570 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
24580 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
24590 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e   );.    r.pKeyIn
245a0 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
245b0 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20  o;.    r.nField 
245c0 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69  = (u16)pOp->p4.i
245d0 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
245e0 35 20 29 7b 0a 20 20 20 20 20 20 72 2e 66 6c 61  5 ){.      r.fla
245f0 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs = UNPACKED_IN
24600 43 52 4b 45 59 20 7c 20 55 4e 50 41 43 4b 45 44  CRKEY | UNPACKED
24610 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b 0a 20  _IGNORE_ROWID;. 
24620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24630 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  r.flags = UNPACK
24640 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b  ED_IGNORE_ROWID;
24650 0a 20 20 20 20 7d 0a 20 20 20 20 72 2e 61 4d 65  .    }.    r.aMe
24660 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
24670 33 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  3];.#ifdef SQLIT
24680 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e  E_DEBUG.    { in
24690 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t i; for(i=0; i<
246a0 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61  r.nField; i++) a
246b0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
246c0 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b  d(&r.aMem[i]) );
246d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
246e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
246f0 78 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 2c 20  xKeyCompare(pC, 
24700 26 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69  &r, &res);.    i
24710 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
24720 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20 20 20 20  OP_IdxLT ){.    
24730 20 20 72 65 73 20 3d 20 2d 72 65 73 3b 0a 20 20    res = -res;.  
24740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24750 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
24760 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  de==OP_IdxGE );.
24770 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 20        res++;.   
24780 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 3e 30   }.    if( res>0
24790 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
247a0 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a 20 20 20  Op->p2 - 1 ;.   
247b0 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a   }.  }.  break;.
247c0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
247d0 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a  stroy P1 P2 P3 *
247e0 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20   *.**.** Delete 
247f0 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  an entire databa
24800 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
24810 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  x whose root pag
24820 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24830 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76  e.** file is giv
24840 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  en by P1..**.** 
24850 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
24860 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20  destroyed is in 
24870 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
24880 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e  e file if P3==0.
24890 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68    If.** P3==1 th
248a0 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  en the table to 
248b0 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  be clear is in t
248c0 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
248d0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68  abase file.** th
248e0 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  at is used to st
248f0 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74  ore tables creat
24900 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54  e using CREATE T
24910 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a  EMPORARY TABLE..
24920 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
24930 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74  UUM is enabled t
24940 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62  hen it is possib
24950 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  le that another 
24960 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67  root page.** mig
24970 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f  ht be moved into
24980 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74   the newly delet
24990 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ed root page in 
249a0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c  order to keep al
249b0 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
249c0 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68  contiguous at th
249d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
249e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
249f0 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75  e former.** valu
24a00 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61  e of the root pa
24a10 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20  ge that moved - 
24a20 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  its value before
24a30 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72   the move occurr
24a40 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ed -.** is store
24a50 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
24a60 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a  .  If no page .*
24a70 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72  * movement was r
24a80 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65  equired (because
24a90 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
24aa0 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72   dropped was alr
24ab0 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73  eady .** the las
24ac0 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74  t one in the dat
24ad0 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a 65  abase) then a ze
24ae0 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ro is stored in 
24af0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20  register P2..** 
24b00 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
24b10 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61   disabled then a
24b20 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20   zero is stored 
24b30 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
24b40 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
24b50 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50  Clear.*/.case OP
24b60 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20  _Destroy: {     
24b70 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
24b80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 6f 76  se */.  int iMov
24b90 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e 74 3b 0a  ed;.  int iCnt;.
24ba0 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20    Vdbe *pVdbe;. 
24bb0 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e 64 65   int iDb;.#ifnde
24bc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
24bd0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 43 6e  RTUALTABLE.  iCn
24be0 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 56 64  t = 0;.  for(pVd
24bf0 62 65 3d 64 62 2d 3e 70 56 64 62 65 3b 20 70 56  be=db->pVdbe; pV
24c00 64 62 65 3b 20 70 56 64 62 65 20 3d 20 70 56 64  dbe; pVdbe = pVd
24c10 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
24c20 69 66 28 20 70 56 64 62 65 2d 3e 6d 61 67 69 63  if( pVdbe->magic
24c30 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
24c40 20 26 26 20 70 56 64 62 65 2d 3e 69 6e 56 74 61   && pVdbe->inVta
24c50 62 4d 65 74 68 6f 64 3c 32 20 26 26 20 70 56 64  bMethod<2 && pVd
24c60 62 65 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20  be->pc>=0 ){.   
24c70 20 20 20 69 43 6e 74 2b 2b 3b 0a 20 20 20 20 7d     iCnt++;.    }
24c80 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 43 6e  .  }.#else.  iCn
24c90 74 20 3d 20 64 62 2d 3e 61 63 74 69 76 65 56 64  t = db->activeVd
24ca0 62 65 43 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  beCnt;.#endif.  
24cb0 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
24cc0 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20 69 43  M_Null;.  if( iC
24cd0 6e 74 3e 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  nt>1 ){.    rc =
24ce0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
24cf0 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
24d00 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
24d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20   }else{.    iDb 
24d20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61  = pOp->p3;.    a
24d30 73 73 65 72 74 28 20 69 43 6e 74 3d 3d 31 20 29  ssert( iCnt==1 )
24d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
24d50 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28  ->btreeMask & ((
24d60 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
24d70 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ))!=0 );.    rc 
24d80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  = sqlite3BtreeDr
24d90 6f 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b  opTable(db->aDb[
24da0 69 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70  iDb].pBt, pOp->p
24db0 31 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20  1, &iMoved);.   
24dc0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
24dd0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74  EM_Int;.    pOut
24de0 2d 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a  ->u.i = iMoved;.
24df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24e00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24e10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24e20 45 5f 4f 4b 20 26 26 20 69 4d 6f 76 65 64 21 3d  E_OK && iMoved!=
24e30 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
24e40 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
24e50 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c  db, iDb, iMoved,
24e60 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20   pOp->p1);.     
24e70 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72   /* All OP_Destr
24e80 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  oy operations oc
24e90 63 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  cur on the same 
24ea0 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61  btree */.      a
24eb0 73 73 65 72 74 28 20 72 65 73 65 74 53 63 68 65  ssert( resetSche
24ec0 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20  maOnFault==0 || 
24ed0 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
24ee0 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20  lt==iDb+1 );.   
24ef0 20 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e     resetSchemaOn
24f00 46 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20  Fault = iDb+1;. 
24f10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
24f20 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
24f30 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20  pcode: Clear P1 
24f40 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  P2 P3.**.** Dele
24f50 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20  te all contents 
24f60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24f70 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77  table or index w
24f80 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a  hose root page.*
24f90 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
24fa0 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  e file is given 
24fb0 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c  by P1.  But, unl
24fc0 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20  ike Destroy, do 
24fd0 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  not.** remove th
24fe0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
24ff0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25000 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
25010 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
25020 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d  lear is in the m
25030 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
25040 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a  e if P2==0.  If.
25050 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68  ** P2==1 then th
25060 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c  e table to be cl
25070 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75  ear is in the au
25080 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
25090 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73   file.** that is
250a0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
250b0 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69  ables create usi
250c0 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52  ng CREATE TEMPOR
250d0 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  ARY TABLE..**.**
250e0 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
250f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
25100 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  en the table ref
25110 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65  erred to must be
25120 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61   an.** intkey ta
25130 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c  ble (an SQL tabl
25140 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29  e, not an index)
25150 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
25160 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a  he row change .*
25170 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65  * count is incre
25180 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75  mented by the nu
25190 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
251a0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
251b0 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20  cleared. .** If 
251c0 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
251d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
251e0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
251f0 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
25200 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65  .** also increme
25210 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
25220 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
25230 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
25240 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  eared..**.** See
25250 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a   also: Destroy.*
25260 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a  /.case OP_Clear:
25270 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65   {.  int nChange
25280 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65 20 3d 20  ;. .  nChange = 
25290 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  0;.  assert( (p-
252a0 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28  >btreeMask & (((
252b0 79 44 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d  yDbMask)1)<<pOp-
252c0 3e 70 32 29 29 21 3d 30 20 29 3b 0a 20 20 72 63  >p2))!=0 );.  rc
252d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
252e0 6c 65 61 72 54 61 62 6c 65 28 0a 20 20 20 20 20  learTable(.     
252f0 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32   db->aDb[pOp->p2
25300 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20  ].pBt, pOp->p1, 
25310 28 70 4f 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61  (pOp->p3 ? &nCha
25320 6e 67 65 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20  nge : 0).  );.  
25330 69 66 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20  if( pOp->p3 ){. 
25340 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d     p->nChange +=
25350 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 69 66   nChange;.    if
25360 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20  ( pOp->p3>0 ){. 
25370 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
25380 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f  IsValid(&aMem[pO
25390 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20  p->p3]) );.     
253a0 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
253b0 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
253c0 70 33 5d 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d  p3]);.      aMem
253d0 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d  [pOp->p3].u.i +=
253e0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a   nChange;.    }.
253f0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
25400 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74  /* Opcode: Creat
25410 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a  eTable P1 P2 * *
25420 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74   *.**.** Allocat
25430 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e  e a new table in
25440 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
25450 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30  se file if P1==0
25460 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75   or in the.** au
25470 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
25480 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f   file if P1==1 o
25490 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64  r in an attached
254a0 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20   database if.** 
254b0 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65  P1>1.  Write the
254c0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
254d0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
254e0 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  le into.** regis
254f0 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65  ter P2.**.** The
25500 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
25510 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20  een a table and 
25520 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68 69 73  an index is this
25530 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a  :  A table must.
25540 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79 74 65  ** have a 4-byte
25550 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64   integer key and
25560 20 63 61 6e 20 68 61 76 65 20 61 72 62 69 74 72   can have arbitr
25570 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e  ary data.  An in
25580 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72  dex.** has an ar
25590 62 69 74 72 61 72 79 20 6b 65 79 20 62 75 74 20  bitrary key but 
255a0 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53  no data..**.** S
255b0 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49  ee also: CreateI
255c0 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ndex.*/./* Opcod
255d0 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78 20 50  e: CreateIndex P
255e0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
255f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
25600 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d 61 69  index in the mai
25610 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
25620 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74  if P1==0 or in t
25630 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  he.** auxiliary 
25640 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
25650 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20   P1==1 or in an 
25660 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
25670 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57  e if.** P1>1.  W
25680 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61  rite the root pa
25690 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
256a0 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a   new table into.
256b0 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  ** register P2..
256c0 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65  **.** See docume
256d0 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72  ntation on OP_Cr
256e0 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20 61 64  eateTable for ad
256f0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
25700 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
25710 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20 20 20  _CreateIndex:   
25720 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
25730 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 63  -prerelease */.c
25740 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  ase OP_CreateTab
25750 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 2f  le: {          /
25760 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73  * out2-prereleas
25770 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b  e */.  int pgno;
25780 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20  .  int flags;.  
25790 44 62 20 2a 70 44 62 3b 0a 0a 20 20 70 67 6e 6f  Db *pDb;..  pgno
257a0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
257b0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
257c0 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
257d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62  .  assert( (p->b
257e0 74 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44  treeMask & (((yD
257f0 62 4d 61 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70  bMask)1)<<pOp->p
25800 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 44 62 20  1))!=0 );.  pDb 
25810 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
25820 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
25830 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
25840 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
25850 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20  =OP_CreateTable 
25860 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20  ){.    /* flags 
25870 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20  = BTREE_INTKEY; 
25880 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42  */.    flags = B
25890 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d  TREE_INTKEY;.  }
258a0 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20  else{.    flags 
258b0 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 3b  = BTREE_BLOBKEY;
258c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
258d0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
258e0 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70  ble(pDb->pBt, &p
258f0 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  gno, flags);.  p
25900 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b  Out->u.i = pgno;
25910 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
25920 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63 68  Opcode: ParseSch
25930 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a  ema P1 * * P4 *.
25940 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 70  **.** Read and p
25950 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  arse all entries
25960 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
25970 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
25980 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a 20   database P1.** 
25990 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 57  that match the W
259a0 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e 20  HERE clause P4. 
259b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
259c0 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 70  de invokes the p
259d0 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65 20  arser to create 
259e0 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61  a new virtual ma
259f0 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20 72  chine,.** then r
25a00 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72 74  uns the new virt
25a10 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49 74  ual machine.  It
25a20 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65 6e   is thus a re-en
25a30 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a 2f  trant opcode..*/
25a40 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53 63  .case OP_ParseSc
25a50 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69 44  hema: {.  int iD
25a60 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
25a70 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  *zMaster;.  char
25a80 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44 61   *zSql;.  InitDa
25a90 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20  ta initData;..  
25aa0 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64 20  /* Any prepared 
25ab0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
25ac0 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63 6f  nvokes this opco
25ad0 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75 74  de will hold mut
25ae0 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76 65  exes.  ** on eve
25af0 72 79 20 62 74 72 65 65 2e 20 20 54 68 69 73 20  ry btree.  This 
25b00 69 73 20 61 20 70 72 65 72 65 71 75 69 73 69 74  is a prerequisit
25b10 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 0a  e for invoking .
25b20 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69 74    ** sqlite3Init
25b30 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a 2f  Callback()..  */
25b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25b50 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d 30  EBUG.  for(iDb=0
25b60 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
25b70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
25b80 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71 6c  t( iDb==1 || sql
25b90 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
25ba0 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  tex(db->aDb[iDb]
25bb0 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  .pBt) );.  }.#en
25bc0 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f 70  dif..  iDb = pOp
25bd0 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
25be0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
25bf0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
25c00 74 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79  t( DbHasProperty
25c10 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63 68  (db, iDb, DB_Sch
25c20 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20 20  emaLoaded) );.  
25c30 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 61 20  /* Used to be a 
25c40 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20 7b  conditional */ {
25c50 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 53  .    zMaster = S
25c60 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
25c70 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e 64  ;.    initData.d
25c80 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69 74  b = db;.    init
25c90 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d 3e  Data.iDb = pOp->
25ca0 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61  p1;.    initData
25cb0 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d 3e  .pzErrMsg = &p->
25cc0 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53 71  zErrMsg;.    zSq
25cd0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  l = sqlite3MPrin
25ce0 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20 22 53  tf(db,.       "S
25cf0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f 74  ELECT name, root
25d00 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20 27  page, sql FROM '
25d10 25 71 27 2e 25 73 20 57 48 45 52 45 20 25 73 20  %q'.%s WHERE %s 
25d20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
25d30 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
25d40 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 4d 61 73  iDb].zName, zMas
25d50 74 65 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  ter, pOp->p4.z);
25d60 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
25d70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
25d80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
25d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25da0 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62  sert( db->init.b
25db0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  usy==0 );.      
25dc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20  db->init.busy = 
25dd0 31 3b 0a 20 20 20 20 20 20 69 6e 69 74 44 61 74  1;.      initDat
25de0 61 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  a.rc = SQLITE_OK
25df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25e00 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
25e10 64 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  d );.      rc = 
25e20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
25e30 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 49 6e   zSql, sqlite3In
25e40 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26 69 6e 69  itCallback, &ini
25e50 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20  tData, 0);.     
25e60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25e70 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44 61  OK ) rc = initDa
25e80 74 61 2e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c  ta.rc;.      sql
25e90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
25ea0 53 71 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Sql);.      db->
25eb0 69 6e 69 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20  init.busy = 0;. 
25ec0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
25ed0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
25ee0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
25ef0 65 6d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  em;.  }.  break;
25f00 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e    .}..#if !defin
25f10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed(SQLITE_OMIT_A
25f20 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64  NALYZE)./* Opcod
25f30 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69 73 20  e: LoadAnalysis 
25f40 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
25f50 20 52 65 61 64 20 74 68 65 20 73 71 6c 69 74 65   Read the sqlite
25f60 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66 6f 72  _stat1 table for
25f70 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64   database P1 and
25f80 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   load the conten
25f90 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61 62  t.** of that tab
25fa0 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65  le into the inte
25fb0 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73 68 20  rnal index hash 
25fc0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77 69 6c  table.  This wil
25fd0 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 61  l cause.** the a
25fe0 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20 75 73  nalysis to be us
25ff0 65 64 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e  ed when preparin
26000 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  g all subsequent
26010 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63 61 73   queries..*/.cas
26020 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79 73 69  e OP_LoadAnalysi
26030 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  s: {.  assert( p
26040 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
26050 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
26060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 6e    rc = sqlite3An
26070 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c 20 70  alysisLoad(db, p
26080 4f 70 2d 3e 70 31 29 3b 0a 20 20 62 72 65 61 6b  Op->p1);.  break
26090 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
260a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
260b0 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f  OMIT_ANALYZE) */
260c0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
260d0 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34  pTable P1 * * P4
260e0 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20   *.**.** Remove 
260f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e  the internal (in
26100 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74  -memory) data st
26110 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
26120 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61  scribe.** the ta
26130 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ble named P4 in 
26140 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
26150 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
26160 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73  er a table.** is
26170 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65   dropped in orde
26180 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e  r to keep the in
26190 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
261a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
261b0 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e  schema consisten
261c0 74 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f  t with what is o
261d0 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20  n disk..*/.case 
261e0 4f 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a  OP_DropTable: {.
261f0 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41    sqlite3UnlinkA
26200 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  ndDeleteTable(db
26210 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
26220 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  p4.z);.  break;.
26230 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72  }../* Opcode: Dr
26240 6f 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20 50  opIndex P1 * * P
26250 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  4 *.**.** Remove
26260 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69   the internal (i
26270 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73  n-memory) data s
26280 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64  tructures that d
26290 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 69  escribe.** the i
262a0 6e 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69 6e  ndex named P4 in
262b0 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
262c0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
262d0 74 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ter an index.** 
262e0 69 73 20 64 72 6f 70 70 65 64 20 69 6e 20 6f 72  is dropped in or
262f0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
26300 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
26310 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
26320 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73 74  * schema consist
26330 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69 73  ent with what is
26340 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73   on disk..*/.cas
26350 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20  e OP_DropIndex: 
26360 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e  {.  sqlite3Unlin
26370 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28  kAndDeleteIndex(
26380 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  db, pOp->p1, pOp
26390 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b  ->p4.z);.  break
263a0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
263b0 44 72 6f 70 54 72 69 67 67 65 72 20 50 31 20 2a  DropTrigger P1 *
263c0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
263d0 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e 61  move the interna
263e0 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61  l (in-memory) da
263f0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68  ta structures th
26400 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20 74  at describe.** t
26410 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65 64  he trigger named
26420 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
26430 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
26440 6c 65 64 20 61 66 74 65 72 20 61 20 74 72 69 67  led after a trig
26450 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65  ger.** is droppe
26460 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  d in order to ke
26470 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ep the internal 
26480 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
26490 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
264a0 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
264b0 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
264c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
264d0 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c  Trigger: {.  sql
264e0 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
264f0 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
26500 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
26510 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
26520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26530 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
26540 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  HECK./* Opcode: 
26550 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20 50  IntegrityCk P1 P
26560 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  2 P3 * P5.**.** 
26570 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
26580 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
26590 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 20 20  open database.  
265a0 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67 69  Store in.** regi
265b0 73 74 65 72 20 50 31 20 74 68 65 20 74 65 78 74  ster P1 the text
265c0 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   of an error mes
265d0 73 61 67 65 20 64 65 73 63 72 69 62 69 6e 67 20  sage describing 
265e0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a 2a  any problems..**
265f0 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20   If no problems 
26600 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72 65  are found, store
26610 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69 73   a NULL in regis
26620 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P1..**.** Th
26630 65 20 72 65 67 69 73 74 65 72 20 50 33 20 63 6f  e register P3 co
26640 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 78 69 6d  ntains the maxim
26650 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c  um number of all
26660 6f 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20  owed errors..** 
26670 41 74 20 6d 6f 73 74 20 72 65 67 28 50 33 29 20  At most reg(P3) 
26680 65 72 72 6f 72 73 20 77 69 6c 6c 20 62 65 20 72  errors will be r
26690 65 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f  eported..** In o
266a0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
266b0 61 6e 61 6c 79 73 69 73 20 73 74 6f 70 73 20 61  analysis stops a
266c0 73 20 73 6f 6f 6e 20 61 73 20 72 65 67 28 50 31  s soon as reg(P1
266d0 29 20 65 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a  ) errors are .**
266e0 20 73 65 65 6e 2e 20 20 52 65 67 28 50 31 29 20   seen.  Reg(P1) 
266f0 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20  is updated with 
26700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
26710 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a  rors remaining..
26720 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  **.** The root p
26730 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 61  age numbers of a
26740 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
26750 20 64 61 74 61 62 61 73 65 20 61 72 65 20 69 6e   database are in
26760 74 65 67 65 72 0a 2a 2a 20 73 74 6f 72 65 64 20  teger.** stored 
26770 69 6e 20 72 65 67 28 50 31 29 2c 20 72 65 67 28  in reg(P1), reg(
26780 50 31 2b 31 29 2c 20 72 65 67 28 50 31 2b 32 29  P1+1), reg(P1+2)
26790 2c 20 2e 2e 2e 2e 20 20 54 68 65 72 65 20 61 72  , ....  There ar
267a0 65 20 50 32 20 74 61 62 6c 65 73 0a 2a 2a 20 74  e P2 tables.** t
267b0 6f 74 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  otal..**.** If P
267c0 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  5 is not zero, t
267d0 68 65 20 63 68 65 63 6b 20 69 73 20 64 6f 6e 65  he check is done
267e0 20 6f 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   on the auxiliar
267f0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
26800 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e  le, not the main
26810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
26820 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
26830 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
26840 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e 74 65 67  lement the integ
26850 72 69 74 79 5f 63 68 65 63 6b 20 70 72 61 67 6d  rity_check pragm
26860 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  a..*/.case OP_In
26870 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69  tegrityCk: {.  i
26880 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f  nt nRoot;      /
26890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  * Number of tabl
268a0 65 73 20 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e  es to check.  (N
268b0 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74 20 70 61  umber of root pa
268c0 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a  ges.) */.  int *
268d0 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72  aRoot;     /* Ar
268e0 72 61 79 20 6f 66 20 72 6f 6f 74 70 61 67 65 20  ray of rootpage 
268f0 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 61 62 6c  numbers for tabl
26900 65 73 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  es to be checked
26910 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
26920 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
26930 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
26940 45 72 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  Err;       /* Nu
26950 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72  mber of errors r
26960 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68 61  eported */.  cha
26970 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20  r *z;        /* 
26980 54 65 78 74 20 6f 66 20 74 68 65 20 65 72 72 6f  Text of the erro
26990 72 20 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65  r report */.  Me
269a0 6d 20 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a  m *pnErr;     /*
269b0 20 52 65 67 69 73 74 65 72 20 6b 65 65 70 69 6e   Register keepin
269c0 67 20 74 72 61 63 6b 20 6f 66 20 65 72 72 6f 72  g track of error
269d0 73 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 20  s remaining */. 
269e0 20 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d   .  nRoot = pOp-
269f0 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >p2;.  assert( n
26a00 52 6f 6f 74 3e 30 20 29 3b 0a 20 20 61 52 6f 6f  Root>0 );.  aRoo
26a10 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
26a20 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
26a30 66 28 69 6e 74 29 2a 28 6e 52 6f 6f 74 2b 31 29  f(int)*(nRoot+1)
26a40 20 29 3b 0a 20 20 69 66 28 20 61 52 6f 6f 74 3d   );.  if( aRoot=
26a50 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
26a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
26a70 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
26a80 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
26a90 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  nErr = &aMem[pOp
26aa0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
26ab0 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73 20 26   (pnErr->flags &
26ac0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
26ad0 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
26ae0 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
26af0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
26b00 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
26b10 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66  em[pOp->p1];.  f
26b20 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b  or(j=0; j<nRoot;
26b30 20 6a 2b 2b 29 7b 0a 20 20 20 20 61 52 6f 6f 74   j++){.    aRoot
26b40 5b 6a 5d 20 3d 20 28 69 6e 74 29 73 71 6c 69 74  [j] = (int)sqlit
26b50 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 26  e3VdbeIntValue(&
26b60 70 49 6e 31 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20  pIn1[j]);.  }.  
26b70 61 52 6f 6f 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  aRoot[j] = 0;.  
26b80 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3c  assert( pOp->p5<
26b90 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
26ba0 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61  ert( (p->btreeMa
26bb0 73 6b 20 26 20 28 28 28 79 44 62 4d 61 73 6b 29  sk & (((yDbMask)
26bc0 31 29 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d 30  1)<<pOp->p5))!=0
26bd0 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65   );.  z = sqlite
26be0 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
26bf0 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70  heck(db->aDb[pOp
26c00 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74  ->p5].pBt, aRoot
26c10 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20  , nRoot,.       
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c30 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
26c40 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72  nErr->u.i, &nErr
26c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
26c60 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a 20  ee(db, aRoot);. 
26c70 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e   pnErr->u.i -= n
26c80 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Err;.  sqlite3Vd
26c90 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e  beMemSetNull(pIn
26ca0 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d 3d  1);.  if( nErr==
26cb0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
26cc0 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65   z==0 );.  }else
26cd0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
26ce0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
26cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
26d00 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
26d10 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pIn1, z, -1, SQL
26d20 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65  ITE_UTF8, sqlite
26d30 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55  3_free);.  }.  U
26d40 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
26d50 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  ZE(pIn1);.  sqli
26d60 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
26d70 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f  oding(pIn1, enco
26d80 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  ding);.  break;.
26d90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
26da0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
26db0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f  Y_CHECK */../* O
26dc0 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64 64  pcode: RowSetAdd
26dd0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
26de0 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e  ** Insert the in
26df0 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64  teger value held
26e00 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20   by register P2 
26e10 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69  into a boolean i
26e20 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20  ndex.** held in 
26e30 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a  register P1..**.
26e40 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  ** An assertion 
26e50 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e  fails if P2 is n
26e60 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  ot an integer..*
26e70 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74  /.case OP_RowSet
26e80 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  Add: {       /* 
26e90 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49  in1, in2 */.  pI
26ea0 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
26eb0 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
26ec0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
26ed0 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66  assert( (pIn2->f
26ee0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21  lags & MEM_Int)!
26ef0 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  =0 );.  if( (pIn
26f00 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
26f10 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
26f20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
26f30 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
26f40 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
26f50 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
26f60 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
26f70 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  mem;.  }.  sqlit
26f80 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
26f90 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
26fa0 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72  pIn2->u.i);.  br
26fb0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
26fc0 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31  e: RowSetRead P1
26fd0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
26fe0 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6d 61   Extract the sma
26ff0 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d  llest value from
27000 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50   boolean index P
27010 31 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 76  1 and put that v
27020 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  alue into.** reg
27030 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69  ister P3.  Or, i
27040 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20  f boolean index 
27050 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
27060 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a  empty, leave P3.
27070 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
27080 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
27090 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  tion P2..*/.case
270a0 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20   OP_RowSetRead: 
270b0 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
270c0 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in1, out3 */.  
270d0 69 36 34 20 76 61 6c 3b 0a 20 20 43 48 45 43 4b  i64 val;.  CHECK
270e0 5f 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a  _FOR_INTERRUPT;.
270f0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
27100 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
27110 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
27120 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 0a 20 20  M_RowSet)==0 .  
27130 20 7c 7c 20 73 71 6c 69 74 65 33 52 6f 77 53 65   || sqlite3RowSe
27140 74 4e 65 78 74 28 70 49 6e 31 2d 3e 75 2e 70 52  tNext(pIn1->u.pR
27150 6f 77 53 65 74 2c 20 26 76 61 6c 29 3d 3d 30 0a  owSet, &val)==0.
27160 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20    ){.    /* The 
27170 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 69 73  boolean index is
27180 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 73 71   empty */.    sq
27190 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
271a0 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 20 20 70  ull(pIn1);.    p
271b0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
271c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
271d0 20 41 20 76 61 6c 75 65 20 77 61 73 20 70 75 6c   A value was pul
271e0 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  led from the ind
271f0 65 78 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ex */.    sqlite
27200 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34  3VdbeMemSetInt64
27210 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2c  (&aMem[pOp->p3],
27220 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 72 65   val);.  }.  bre
27230 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
27240 3a 20 52 6f 77 53 65 74 54 65 73 74 20 50 31 20  : RowSetTest P1 
27250 50 32 20 50 33 20 50 34 0a 2a 2a 0a 2a 2a 20 52  P2 P3 P4.**.** R
27260 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61 73  egister P3 is as
27270 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61 20  sumed to hold a 
27280 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  64-bit integer v
27290 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74 65  alue. If registe
272a0 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  r P1.** contains
272b0 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
272c0 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65 74   and that RowSet
272d0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
272e0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68 65  .** the value he
272f0 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20 74  ld in P3, jump t
27300 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 4f  o register P2. O
27310 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72 74  therwise, insert
27320 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
27330 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20 52  in P3 into the R
27340 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  owSet and contin
27350 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ue on to the.** 
27360 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  next opcode..**.
27370 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f 62  ** The RowSet ob
27380 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  ject is optimize
27390 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  d for the case w
273a0 68 65 72 65 20 73 75 63 63 65 73 73 69 76 65 20  here successive 
273b0 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65 67  sets.** of integ
273c0 65 72 73 2c 20 77 68 65 72 65 20 65 61 63 68 20  ers, where each 
273d0 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  set contains no 
273e0 64 75 70 6c 69 63 61 74 65 73 2e 20 45 61 63 68  duplicates. Each
273f0 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75 65   set.** of value
27400 73 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  s is identified 
27410 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20 76  by a unique P4 v
27420 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20  alue. The first 
27430 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  set.** must have
27440 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61   P4==0, the fina
27450 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20 20 50 34  l set P4=-1.  P4
27460 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
27470 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65 67  -1 or.** non-neg
27480 61 74 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  ative.  For non-
27490 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73 20  negative values 
274a0 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68 65 20 6c  of P4 only the l
274b0 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74 73 20 61  ower 4.** bits a
274c0 72 65 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a  re significant..
274d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77  **.** This allow
274e0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 3a  s optimizations:
274f0 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30 20   (a) when P4==0 
27500 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
27510 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65 20   to test.** the 
27520 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 66 6f  rowset object fo
27530 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20 67  r P3, as it is g
27540 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74 6f  uaranteed not to
27550 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a 20   contain it,.** 
27560 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31 20  (b) when P4==-1 
27570 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
27580 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 76   to insert the v
27590 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c 6c  alue, as it will
275a0 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65 73  .** never be tes
275b0 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63 29  ted for, and (c)
275c0 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74 68   when a value th
275d0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73 65  at is part of se
275e0 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72 74  t X is.** insert
275f0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
27600 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20 74  need to search t
27610 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61 6d  o see if the sam
27620 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20 70  e value was.** p
27630 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72 74  reviously insert
27640 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73 65  ed as part of se
27650 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74 20  t X (only if it 
27660 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  was previously.*
27670 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70 61  * inserted as pa
27680 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  rt of some other
27690 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f   set)..*/.case O
276a0 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b 20  P_RowSetTest: { 
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276c0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
276d0 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69  , in3 */.  int i
276e0 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  Set;.  int exist
276f0 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  s;..  pIn1 = &aM
27700 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
27710 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In3 = &aMem[pOp-
27720 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20 70  >p3];.  iSet = p
27730 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73 65  Op->p4.i;.  asse
27740 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26  rt( pIn3->flags&
27750 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f 2a  MEM_Int );..  /*
27760 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
27770 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
27780 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74   a rowset object
27790 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
277a0 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20  P1,.  ** delete 
277b0 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74 69  it now and initi
277c0 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61 6e  alize P1 with an
277d0 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20 20   empty rowset.  
277e0 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  */.  if( (pIn1->
277f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
27800 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  et)==0 ){.    sq
27810 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52  lite3VdbeMemSetR
27820 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20  owSet(pIn1);.   
27830 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
27840 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
27850 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
27860 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
27870 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
27880 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73 65  _INT32 );.  asse
27890 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c 20  rt( iSet==-1 || 
278a0 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iSet>=0 );.  if(
278b0 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78 69   iSet ){.    exi
278c0 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f 77  sts = sqlite3Row
278d0 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75 2e  SetTest(pIn1->u.
278e0 70 52 6f 77 53 65 74 2c 20 0a 20 20 20 20 20 20  pRowSet, .      
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 20 20 20 20 20 20 28 75 38 29 28 69 53           (u8)(iS
27910 65 74 3e 3d 30 20 3f 20 69 53 65 74 20 26 20 30  et>=0 ? iSet & 0
27920 78 66 20 3a 20 30 78 66 66 29 2c 0a 20 20 20 20  xf : 0xff),.    
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 33 2d             pIn3-
27950 3e 75 2e 69 29 3b 0a 20 20 20 20 69 66 28 20 65  >u.i);.    if( e
27960 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 70  xists ){.      p
27970 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
27980 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27990 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 53    }.  }.  if( iS
279a0 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  et>=0 ){.    sql
279b0 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74  ite3RowSetInsert
279c0 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIn1->u.pRowSet
279d0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  , pIn3->u.i);.  
279e0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23  }.  break;.}...#
279f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27a00 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f  IT_TRIGGER../* O
27a10 70 63 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50  pcode: Program P
27a20 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a  1 P2 P3 P4 *.**.
27a30 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74  ** Execute the t
27a40 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70  rigger program p
27a50 61 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70  assed as P4 (typ
27a60 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29  e P4_SUBPROGRAM)
27a70 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74  . .**.** P1 cont
27a80 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
27a90 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
27aa0 65 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ell that contain
27ab0 73 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f  s the first memo
27ac0 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61  ry .** cell in a
27ad0 6e 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65  n array of value
27ae0 73 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65  s used as argume
27af0 6e 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70  nts to the sub-p
27b00 72 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63  rogram. P2 .** c
27b10 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
27b20 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  ess to jump to i
27b30 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
27b40 6d 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f  m throws an IGNO
27b50 52 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e  RE .** exception
27b60 20 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45   using the RAISE
27b70 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67  () function. Reg
27b80 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e  ister P3 contain
27b90 73 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a  s the address .*
27ba0 2a 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65  * of a memory ce
27bb0 6c 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20  ll in this (the 
27bc0 70 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20  parent) VM that 
27bd0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
27be0 61 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f  ate the .** memo
27bf0 72 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ry required by t
27c00 68 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72  he sub-vdbe at r
27c10 75 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34  untime..**.** P4
27c20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
27c30 20 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69   the VM containi
27c40 6e 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70  ng the trigger p
27c50 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 63 61 73 65 20  rogram..*/.case 
27c60 4f 50 5f 50 72 6f 67 72 61 6d 3a 20 7b 20 20 20  OP_Program: {   
27c70 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
27c80 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
27c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27ca0 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  ber of memory re
27cb0 67 69 73 74 65 72 73 20 66 6f 72 20 73 75 62 2d  gisters for sub-
27cc0 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 69 6e 74  program */.  int
27cd0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
27ce0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
27cf0 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 72   runtime space r
27d00 65 71 75 69 72 65 64 20 66 6f 72 20 73 75 62 2d  equired for sub-
27d10 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 4d 65 6d  program */.  Mem
27d20 20 2a 70 52 74 3b 20 20 20 20 20 20 20 20 20 20   *pRt;          
27d30 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
27d40 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 72 75 6e   to allocate run
27d50 74 69 6d 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  time space */.  
27d60 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20  Mem *pMem;      
27d70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
27d80 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
27d90 67 68 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  gh memory cells 
27da0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 20  */.  Mem *pEnd; 
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27dc0 4c 61 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  Last memory cell
27dd0 20 69 6e 20 6e 65 77 20 61 72 72 61 79 20 2a 2f   in new array */
27de0 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
27df0 72 61 6d 65 3b 20 20 20 20 20 20 2f 2a 20 4e 65  rame;      /* Ne
27e00 77 20 76 64 62 65 20 66 72 61 6d 65 20 74 6f 20  w vdbe frame to 
27e10 65 78 65 63 75 74 65 20 69 6e 20 2a 2f 0a 20 20  execute in */.  
27e20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 50 72 6f  SubProgram *pPro
27e30 67 72 61 6d 3b 20 20 20 2f 2a 20 53 75 62 2d 70  gram;   /* Sub-p
27e40 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
27e50 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 74 3b 20  e */.  void *t; 
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e70 2a 20 54 6f 6b 65 6e 20 69 64 65 6e 74 69 66 79  * Token identify
27e80 69 6e 67 20 74 72 69 67 67 65 72 20 2a 2f 0a 0a  ing trigger */..
27e90 20 20 70 50 72 6f 67 72 61 6d 20 3d 20 70 4f 70    pProgram = pOp
27ea0 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
27eb0 20 70 52 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70   pRt = &aMem[pOp
27ec0 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
27ed0 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 74 29   memIsValid(pRt)
27ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27ef0 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3e 30 20 29 3b  rogram->nOp>0 );
27f00 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .  .  /* If the 
27f10 70 35 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  p5 flag is clear
27f20 2c 20 74 68 65 6e 20 72 65 63 75 72 73 69 76 65  , then recursive
27f30 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
27f40 72 69 67 67 65 72 73 20 69 73 20 0a 20 20 2a 2a  riggers is .  **
27f50 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 62 61   disabled for ba
27f60 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
27f70 69 6c 69 74 79 20 28 70 35 20 69 73 20 73 65 74  ility (p5 is set
27f80 20 69 66 20 74 68 69 73 20 73 75 62 2d 70 72 6f   if this sub-pro
27f90 67 72 61 6d 0a 20 20 2a 2a 20 69 73 20 72 65 61  gram.  ** is rea
27fa0 6c 6c 79 20 61 20 74 72 69 67 67 65 72 2c 20 6e  lly a trigger, n
27fb0 6f 74 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79  ot a foreign key
27fc0 20 61 63 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65   action, and the
27fd0 20 66 6c 61 67 20 73 65 74 0a 20 20 2a 2a 20 61   flag set.  ** a
27fe0 6e 64 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  nd cleared by th
27ff0 65 20 22 50 52 41 47 4d 41 20 72 65 63 75 72 73  e "PRAGMA recurs
28000 69 76 65 5f 74 72 69 67 67 65 72 73 22 20 63 6f  ive_triggers" co
28010 6d 6d 61 6e 64 20 69 73 20 63 6c 65 61 72 29 2e  mmand is clear).
28020 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 49 74 20 69  .  ** .  ** It i
28030 73 20 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f  s recursive invo
28040 63 61 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65  cation of trigge
28050 72 73 2c 20 61 74 20 74 68 65 20 53 51 4c 20 6c  rs, at the SQL l
28060 65 76 65 6c 2c 20 74 68 61 74 20 69 73 20 0a 20  evel, that is . 
28070 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 49 6e   ** disabled. In
28080 20 73 6f 6d 65 20 63 61 73 65 73 20 61 20 73 69   some cases a si
28090 6e 67 6c 65 20 74 72 69 67 67 65 72 20 6d 61 79  ngle trigger may
280a0 20 67 65 6e 65 72 61 74 65 20 6d 6f 72 65 20 74   generate more t
280b0 68 61 6e 20 6f 6e 65 20 0a 20 20 2a 2a 20 53 75  han one .  ** Su
280c0 62 50 72 6f 67 72 61 6d 20 28 69 66 20 74 68 65  bProgram (if the
280d0 20 74 72 69 67 67 65 72 20 6d 61 79 20 62 65 20   trigger may be 
280e0 65 78 65 63 75 74 65 64 20 77 69 74 68 20 6d 6f  executed with mo
280f0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 69 66 66  re than one diff
28100 65 72 65 6e 74 20 0a 20 20 2a 2a 20 4f 4e 20 43  erent .  ** ON C
28110 4f 4e 46 4c 49 43 54 20 61 6c 67 6f 72 69 74 68  ONFLICT algorith
28120 6d 29 2e 20 53 75 62 50 72 6f 67 72 61 6d 20 73  m). SubProgram s
28130 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
28140 61 74 65 64 20 77 69 74 68 20 61 0a 20 20 2a 2a  ated with a.  **
28150 20 73 69 6e 67 6c 65 20 74 72 69 67 67 65 72 20   single trigger 
28160 61 6c 6c 20 68 61 76 65 20 74 68 65 20 73 61 6d  all have the sam
28170 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
28180 53 75 62 50 72 6f 67 72 61 6d 2e 74 6f 6b 65 6e  SubProgram.token
28190 20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e   .  ** variable.
281a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e    */.  if( pOp->
281b0 70 35 20 29 7b 0a 20 20 20 20 74 20 3d 20 70 50  p5 ){.    t = pP
281c0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 20  rogram->token;. 
281d0 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
281e0 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 20  >pFrame; pFrame 
281f0 26 26 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e  && pFrame->token
28200 21 3d 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  !=t; pFrame=pFra
28210 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
28220 20 20 69 66 28 20 70 46 72 61 6d 65 20 29 20 62    if( pFrame ) b
28230 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
28240 20 70 2d 3e 6e 46 72 61 6d 65 3e 3d 64 62 2d 3e   p->nFrame>=db->
28250 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
28260 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
28270 48 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  H] ){.    rc = S
28280 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
28290 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
282a0 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
282b0 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  b, "too many lev
282c0 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
282d0 65 63 75 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20  ecursion");.    
282e0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
282f0 20 52 65 67 69 73 74 65 72 20 70 52 74 20 69 73   Register pRt is
28300 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
28310 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
28320 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 73  ed to save the s
28330 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
28340 20 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d   current program
28350 2c 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  , and the memory
28360 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75 6e   required at run
28370 74 69 6d 65 20 74 6f 20 65 78 65 63 75 74 65 0a  time to execute.
28380 20 20 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72    ** the trigger
28390 20 70 72 6f 67 72 61 6d 2e 20 49 66 20 74 68 69   program. If thi
283a0 73 20 74 72 69 67 67 65 72 20 68 61 73 20 62 65  s trigger has be
283b0 65 6e 20 66 69 72 65 64 20 62 65 66 6f 72 65 2c  en fired before,
283c0 20 74 68 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20   then pRt .  ** 
283d0 69 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  is already alloc
283e0 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
283f0 20 69 74 20 6d 75 73 74 20 62 65 20 69 6e 69 74   it must be init
28400 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69  ialized.  */.  i
28410 66 28 20 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d  f( (pRt->flags&M
28420 45 4d 5f 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a  EM_Frame)==0 ){.
28430 20 20 20 20 2f 2a 20 53 75 62 50 72 6f 67 72 61      /* SubProgra
28440 6d 2e 6e 4d 65 6d 20 69 73 20 73 65 74 20 74 6f  m.nMem is set to
28450 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
28460 65 6d 6f 72 79 20 63 65 6c 6c 73 20 75 73 65 64  emory cells used
28470 20 62 79 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   by the .    ** 
28480 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69  program stored i
28490 6e 20 53 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70  n SubProgram.aOp
284a0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65  . As well as the
284b0 73 65 2c 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20  se, one memory. 
284c0 20 20 20 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65     ** cell is re
284d0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
284e0 63 75 72 73 6f 72 20 75 73 65 64 20 62 79 20 74  cursor used by t
284f0 68 65 20 70 72 6f 67 72 61 6d 2e 20 53 65 74 20  he program. Set 
28500 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
28510 69 61 62 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20  iable nMem (and 
28520 6c 61 74 65 72 2c 20 56 64 62 65 46 72 61 6d 65  later, VdbeFrame
28530 2e 6e 43 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74  .nChildMem) to t
28540 68 69 73 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  his value..    *
28550 2f 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72  /.    nMem = pPr
28560 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50  ogram->nMem + pP
28570 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
28580 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
28590 28 73 69 7a 65 6f 66 28 56 64 62 65 46 72 61 6d  (sizeof(VdbeFram
285a0 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)).            
285b0 20 20 2b 20 6e 4d 65 6d 20 2a 20 73 69 7a 65 6f    + nMem * sizeo
285c0 66 28 4d 65 6d 29 0a 20 20 20 20 20 20 20 20 20  f(Mem).         
285d0 20 20 20 20 20 2b 20 70 50 72 6f 67 72 61 6d 2d       + pProgram-
285e0 3e 6e 43 73 72 20 2a 20 73 69 7a 65 6f 66 28 56  >nCsr * sizeof(V
285f0 64 62 65 43 75 72 73 6f 72 20 2a 29 3b 0a 20 20  dbeCursor *);.  
28600 20 20 70 46 72 61 6d 65 20 3d 20 73 71 6c 69 74    pFrame = sqlit
28610 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
28620 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
28630 66 28 20 21 70 46 72 61 6d 65 20 29 7b 0a 20 20  f( !pFrame ){.  
28640 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
28650 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28660 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
28670 28 70 52 74 29 3b 0a 20 20 20 20 70 52 74 2d 3e  (pRt);.    pRt->
28680 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 46 72 61 6d  flags = MEM_Fram
28690 65 3b 0a 20 20 20 20 70 52 74 2d 3e 75 2e 70 46  e;.    pRt->u.pF
286a0 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 0a  rame = pFrame;..
286b0 20 20 20 20 70 46 72 61 6d 65 2d 3e 76 20 3d 20      pFrame->v = 
286c0 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  p;.    pFrame->n
286d0 43 68 69 6c 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b  ChildMem = nMem;
286e0 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68  .    pFrame->nCh
286f0 69 6c 64 43 73 72 20 3d 20 70 50 72 6f 67 72 61  ildCsr = pProgra
28700 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 70 46 72  m->nCsr;.    pFr
28710 61 6d 65 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20  ame->pc = pc;.  
28720 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 20 3d    pFrame->aMem =
28730 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 46   p->aMem;.    pF
28740 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20 70 2d 3e  rame->nMem = p->
28750 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  nMem;.    pFrame
28760 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e 61 70 43  ->apCsr = p->apC
28770 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  sr;.    pFrame->
28780 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e 6e 43 75  nCursor = p->nCu
28790 72 73 6f 72 3b 0a 20 20 20 20 70 46 72 61 6d 65  rsor;.    pFrame
287a0 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a  ->aOp = p->aOp;.
287b0 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 20      pFrame->nOp 
287c0 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 70 46  = p->nOp;.    pF
287d0 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d 20 70 50  rame->token = pP
287e0 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e 3b 0a 0a  rogram->token;..
287f0 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62 65      pEnd = &Vdbe
28800 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29  FrameMem(pFrame)
28810 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d  [pFrame->nChildM
28820 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d 65  em];.    for(pMe
28830 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  m=VdbeFrameMem(p
28840 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70 45  Frame); pMem!=pE
28850 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  nd; pMem++){.   
28860 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
28870 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
28880 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 64 62 3b 0a   pMem->db = db;.
28890 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
288a0 20 20 20 70 46 72 61 6d 65 20 3d 20 70 52 74 2d     pFrame = pRt-
288b0 3e 75 2e 70 46 72 61 6d 65 3b 0a 20 20 20 20 61  >u.pFrame;.    a
288c0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
288d0 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72 61 6d 2d 3e  >nMem+pProgram->
288e0 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43  nCsr==pFrame->nC
288f0 68 69 6c 64 4d 65 6d 20 29 3b 0a 20 20 20 20 61  hildMem );.    a
28900 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
28910 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e  >nCsr==pFrame->n
28920 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20  ChildCsr );.    
28930 61 73 73 65 72 74 28 20 70 63 3d 3d 70 46 72 61  assert( pc==pFra
28940 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20  me->pc );.  }.. 
28950 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20   p->nFrame++;.  
28960 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20  pFrame->pParent 
28970 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70  = p->pFrame;.  p
28980 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
28990 20 3d 20 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20   = lastRowid;.  
289a0 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20  pFrame->nChange 
289b0 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  = p->nChange;.  
289c0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
289d0 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46    p->pFrame = pF
289e0 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20  rame;.  p->aMem 
289f0 3d 20 61 4d 65 6d 20 3d 20 26 56 64 62 65 46 72  = aMem = &VdbeFr
28a00 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b 2d  ameMem(pFrame)[-
28a10 31 5d 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20  1];.  p->nMem = 
28a20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
28a30 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  m;.  p->nCursor 
28a40 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d 3e 6e  = (u16)pFrame->n
28a50 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d 3e 61  ChildCsr;.  p->a
28a60 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
28a70 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
28a80 4d 65 6d 2b 31 5d 3b 0a 20 20 70 2d 3e 61 4f 70  Mem+1];.  p->aOp
28a90 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61   = aOp = pProgra
28aa0 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70  m->aOp;.  p->nOp
28ab0 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70   = pProgram->nOp
28ac0 3b 0a 20 20 70 63 20 3d 20 2d 31 3b 0a 0a 20 20  ;.  pc = -1;..  
28ad0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
28ae0 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20 50 32  ode: Param P1 P2
28af0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
28b00 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  s opcode is only
28b10 20 65 76 65 72 20 70 72 65 73 65 6e 74 20 69 6e   ever present in
28b20 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 61   sub-programs ca
28b30 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a 2a 2a  lled via the .**
28b40 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74   OP_Program inst
28b50 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20  ruction. Copy a 
28b60 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
28b70 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f  stored in a memo
28b80 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74  ry .** cell of t
28b90 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61 72 65  he calling (pare
28ba0 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63 65 6c  nt) frame to cel
28bb0 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75 72 72  l P2 in the curr
28bc0 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61  ent frames .** a
28bd0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 54 68  ddress space. Th
28be0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
28bf0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 74  igger programs t
28c00 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e 65 77  o access the new
28c10 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a  .* .** and old.*
28c20 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
28c30 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
28c40 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
28c50 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 64 65  rent frame is de
28c60 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64 64 69  termined by addi
28c70 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  ng.** the value 
28c80 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
28c90 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  nt to the value 
28ca0 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
28cb0 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c  nt to the.** cal
28cc0 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20  ling OP_Program 
28cd0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
28ce0 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b  case OP_Param: {
28cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
28d00 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
28d10 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
28d20 72 61 6d 65 3b 0a 20 20 4d 65 6d 20 2a 70 49 6e  rame;.  Mem *pIn
28d30 3b 0a 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e  ;.  pFrame = p->
28d40 70 46 72 61 6d 65 3b 0a 20 20 70 49 6e 20 3d 20  pFrame;.  pIn = 
28d50 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f  &pFrame->aMem[pO
28d60 70 2d 3e 70 31 20 2b 20 70 46 72 61 6d 65 2d 3e  p->p1 + pFrame->
28d70 61 4f 70 5b 70 46 72 61 6d 65 2d 3e 70 63 5d 2e  aOp[pFrame->pc].
28d80 70 31 5d 3b 20 20 20 0a 20 20 73 71 6c 69 74 65  p1];   .  sqlite
28d90 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
28da0 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 2c 20 4d  opy(pOut, pIn, M
28db0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 62 72 65  EM_Ephem);.  bre
28dc0 61 6b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ak;.}..#endif /*
28dd0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
28de0 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a  OMIT_TRIGGER */.
28df0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28e00 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
28e10 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 43 6f  ./* Opcode: FkCo
28e20 75 6e 74 65 72 20 50 31 20 50 32 20 2a 20 2a 20  unter P1 P2 * * 
28e30 2a 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  *.**.** Incremen
28e40 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74 20  t a "constraint 
28e50 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20 28  counter" by P2 (
28e60 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  P2 may be negati
28e70 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29 2e  ve or positive).
28e80 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  .** If P1 is non
28e90 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61 62  -zero, the datab
28ea0 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ase constraint c
28eb0 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
28ec0 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65 72  ented .** (defer
28ed0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
28ee0 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f 74  constraints). Ot
28ef0 68 65 72 77 69 73 65 2c 20 69 66 20 50 31 20 69  herwise, if P1 i
28f00 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a 20  s zero, the .** 
28f10 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74 65  statement counte
28f20 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  r is incremented
28f30 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
28f40 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
28f50 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  nts)..*/.case OP
28f60 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20 20  _FkCounter: {.  
28f70 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20  if( pOp->p1 ){. 
28f80 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
28f90 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  Cons += pOp->p2;
28fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
28fb0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 2b  >nFkConstraint +
28fc0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20  = pOp->p2;.  }. 
28fd0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
28fe0 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20 50  code: FkIfZero P
28ff0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
29000 20 54 68 69 73 20 6f 70 63 6f 64 65 20 74 65 73   This opcode tes
29010 74 73 20 69 66 20 61 20 66 6f 72 65 69 67 6e 20  ts if a foreign 
29020 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63  key constraint-c
29030 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e  ounter is curren
29040 74 6c 79 20 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20  tly zero..** If 
29050 73 6f 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  so, jump to inst
29060 72 75 63 74 69 6f 6e 20 50 32 2e 20 4f 74 68 65  ruction P2. Othe
29070 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f  rwise, fall thro
29080 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
29090 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
290a0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  .**.** If P1 is 
290b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
290c0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
290d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
290e0 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e   constraint-coun
290f0 74 65 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 28  ter.** is zero (
29100 74 68 65 20 6f 6e 65 20 74 68 61 74 20 63 6f 75  the one that cou
29110 6e 74 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  nts deferred con
29120 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
29130 6e 73 29 2e 20 49 66 20 50 31 20 69 73 0a 2a 2a  ns). If P1 is.**
29140 20 7a 65 72 6f 2c 20 74 68 65 20 6a 75 6d 70 20   zero, the jump 
29150 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
29160 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 73 74 72  statement constr
29170 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20  aint-counter is 
29180 7a 65 72 6f 0a 2a 2a 20 28 69 6d 6d 65 64 69 61  zero.** (immedia
29190 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
291a0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
291b0 69 6f 6e 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ions)..*/.case O
291c0 50 5f 46 6b 49 66 5a 65 72 6f 3a 20 7b 20 20 20  P_FkIfZero: {   
291d0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
291e0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  .  if( pOp->p1 )
291f0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 44  {.    if( db->nD
29200 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 29  eferredCons==0 )
29210 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b   pc = pOp->p2-1;
29220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
29230 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  ( p->nFkConstrai
29240 6e 74 3d 3d 30 20 29 20 70 63 20 3d 20 70 4f 70  nt==0 ) pc = pOp
29250 2d 3e 70 32 2d 31 3b 0a 20 20 7d 0a 20 20 62 72  ->p2-1;.  }.  br
29260 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
29270 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
29280 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
29290 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
292a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
292b0 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65  REMENT./* Opcode
292c0 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20 2a  : MemMax P1 P2 *
292d0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73   * *.**.** P1 is
292e0 20 61 20 72 65 67 69 73 74 65 72 20 69 6e 20 74   a register in t
292f0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 6f 66  he root frame of
29300 20 74 68 69 73 20 56 4d 20 28 74 68 65 20 72 6f   this VM (the ro
29310 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a 2a 20 64  ot frame is.** d
29320 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
29330 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20  e current frame 
29340 69 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  if this instruct
29350 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 65 78 65  ion is being exe
29360 63 75 74 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  cuted.** within 
29370 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 29 2e 20  a sub-program). 
29380 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
29390 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
293a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a  the maximum of .
293b0 2a 2a 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  ** its current v
293c0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 76 61 6c  alue and the val
293d0 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
293e0 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  2..**.** This in
293f0 73 74 72 75 63 74 69 6f 6e 20 74 68 72 6f 77 73  struction throws
29400 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
29410 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 73 20   memory cell is 
29420 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 0a 2a 2a  not initially.**
29430 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a   an integer..*/.
29440 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61 78 3a 20  case OP_MemMax: 
29450 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20  {        /* in2 
29460 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 3b 0a  */.  Mem *pIn1;.
29470 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
29480 61 6d 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 46  ame;.  if( p->pF
29490 72 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  rame ){.    for(
294a0 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
294b0 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
294c0 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
294d0 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
294e0 70 49 6e 31 20 3d 20 26 70 46 72 61 6d 65 2d 3e  pIn1 = &pFrame->
294f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
29500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 31   }else{.    pIn1
29510 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
29520 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
29530 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 31   memIsValid(pIn1
29540 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
29550 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
29560 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
29570 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
29580 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
29590 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
295a0 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
295b0 69 3c 70 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20  i<pIn2->u.i){.  
295c0 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49    pIn1->u.i = pI
295d0 6e 32 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62  n2->u.i;.  }.  b
295e0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
295f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  * SQLITE_OMIT_AU
29600 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a  TOINCREMENT */..
29610 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73  /* Opcode: IfPos
29620 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
29630 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
29640 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
29650 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c 20  s 1 or greater, 
29660 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
29670 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
29680 74 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74  to use this inst
29690 72 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67  ruction on a reg
296a0 69 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a  ister that does.
296b0 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
296c0 6e 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61  n integer.  An a
296d0 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
296e0 69 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f  ill result if yo
296f0 75 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  u try..*/.case O
29700 50 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20  P_IfPos: {      
29710 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
29720 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
29730 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
29740 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
29750 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66  &MEM_Int );.  if
29760 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b  ( pIn1->u.i>0 ){
29770 0a 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  .     pc = pOp->
29780 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  p2 - 1;.  }.  br
29790 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
297a0 65 3a 20 49 66 4e 65 67 20 50 31 20 50 32 20 2a  e: IfNeg P1 P2 *
297b0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   * *.**.** If th
297c0 65 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73  e value of regis
297d0 74 65 72 20 50 31 20 69 73 20 6c 65 73 73 20 74  ter P1 is less t
297e0 68 61 6e 20 7a 65 72 6f 2c 20 6a 75 6d 70 20 74  han zero, jump t
297f0 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49 74 20  o P2. .**.** It 
29800 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 75 73  is illegal to us
29810 65 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  e this instructi
29820 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74 65 72  on on a register
29830 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20 6e 6f   that does.** no
29840 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74  t contain an int
29850 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65 72 74  eger.  An assert
29860 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c 20 72  ion fault will r
29870 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74 72 79  esult if you try
29880 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e  ..*/.case OP_IfN
29890 65 67 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  eg: {        /* 
298a0 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
298b0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
298c0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
298d0 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
298e0 49 6e 74 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  Int );.  if( pIn
298f0 31 2d 3e 75 2e 69 3c 30 20 29 7b 0a 20 20 20 20  1->u.i<0 ){.    
29900 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
29910 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
29920 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
29930 5a 65 72 6f 20 50 31 20 50 32 20 50 33 20 2a 20  Zero P1 P2 P3 * 
29940 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69  *.**.** The regi
29950 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
29960 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
29970 20 20 41 64 64 20 6c 69 74 65 72 61 6c 20 50 33    Add literal P3
29980 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
29990 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
299a0 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20    If the result 
299b0 69 73 20 65 78 61 63 74 6c 79 20 30 2c 20 6a 75  is exactly 0, ju
299c0 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  mp to P2. .**.**
299d0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
299e0 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
299f0 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
29a00 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
29a10 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
29a20 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
29a30 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
29a40 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
29a50 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
29a60 5f 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20  _IfZero: {      
29a70 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
29a80 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
29a90 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
29aa0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
29ab0 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 49  &MEM_Int );.  pI
29ac0 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
29ad0 70 33 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  p3;.  if( pIn1->
29ae0 75 2e 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 70  u.i==0 ){.     p
29af0 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
29b00 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
29b10 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53  ./* Opcode: AggS
29b20 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20 50  tep * P2 P3 P4 P
29b30 35 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  5.**.** Execute 
29b40 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
29b50 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
29b60 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63  te.  The.** func
29b70 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75  tion has P5 argu
29b80 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61  ments.   P4 is a
29b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
29ba0 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
29bb0 74 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66  ture that specif
29bc0 69 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ies the function
29bd0 2e 20 20 55 73 65 20 72 65 67 69 73 74 65 72 0a  .  Use register.
29be0 2a 2a 20 50 33 20 61 73 20 74 68 65 20 61 63 63  ** P3 as the acc
29bf0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
29c00 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74 73  The P5 arguments
29c10 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
29c20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20  register P2 and 
29c30 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72  its.** successor
29c40 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  s..*/.case OP_Ag
29c50 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20 6e  gStep: {.  int n
29c60 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d  ;.  int i;.  Mem
29c70 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 2a 70   *pMem;.  Mem *p
29c80 52 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  Rec;.  sqlite3_c
29c90 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71  ontext ctx;.  sq
29ca0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
29cb0 56 61 6c 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d  Val;..  n = pOp-
29cc0 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >p5;.  assert( n
29cd0 3e 3d 30 20 29 3b 0a 20 20 70 52 65 63 20 3d 20  >=0 );.  pRec = 
29ce0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
29cf0 20 20 61 70 56 61 6c 20 3d 20 70 2d 3e 61 70 41    apVal = p->apA
29d00 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70  rg;.  assert( ap
29d10 56 61 6c 20 7c 7c 20 6e 3d 3d 30 20 29 3b 0a 20  Val || n==0 );. 
29d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
29d30 2b 2b 2c 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20  ++, pRec++){.   
29d40 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
29d50 6c 69 64 28 70 52 65 63 29 20 29 3b 0a 20 20 20  lid(pRec) );.   
29d60 20 61 70 56 61 6c 5b 69 5d 20 3d 20 70 52 65 63   apVal[i] = pRec
29d70 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
29d80 43 68 61 6e 67 65 28 70 2c 20 70 52 65 63 29 3b  Change(p, pRec);
29d90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29da0 4d 65 6d 53 74 6f 72 65 54 79 70 65 28 70 52 65  MemStoreType(pRe
29db0 63 29 3b 0a 20 20 7d 0a 20 20 63 74 78 2e 70 46  c);.  }.  ctx.pF
29dc0 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  unc = pOp->p4.pF
29dd0 75 6e 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  unc;.  assert( p
29de0 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
29df0 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a  >p3<=p->nMem );.
29e00 20 20 63 74 78 2e 70 4d 65 6d 20 3d 20 70 4d 65    ctx.pMem = pMe
29e10 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  m = &aMem[pOp->p
29e20 33 5d 3b 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b  3];.  pMem->n++;
29e30 0a 20 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d  .  ctx.s.flags =
29e40 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78   MEM_Null;.  ctx
29e50 2e 73 2e 7a 20 3d 20 30 3b 0a 20 20 63 74 78 2e  .s.z = 0;.  ctx.
29e60 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  s.zMalloc = 0;. 
29e70 20 63 74 78 2e 73 2e 78 44 65 6c 20 3d 20 30 3b   ctx.s.xDel = 0;
29e80 0a 20 20 63 74 78 2e 73 2e 64 62 20 3d 20 64 62  .  ctx.s.db = db
29e90 3b 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20  ;.  ctx.isError 
29ea0 3d 20 30 3b 0a 20 20 63 74 78 2e 70 43 6f 6c 6c  = 0;.  ctx.pColl
29eb0 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e   = 0;.  if( ctx.
29ec0 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53  pFunc->flags & S
29ed0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
29ee0 4f 4c 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OLL ){.    asser
29ef0 74 28 20 70 4f 70 3e 70 2d 3e 61 4f 70 20 29 3b  t( pOp>p->aOp );
29f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
29f10 5b 2d 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f  [-1].p4type==P4_
29f20 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 61  COLLSEQ );.    a
29f30 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
29f40 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65  pcode==OP_CollSe
29f50 71 20 29 3b 0a 20 20 20 20 63 74 78 2e 70 43 6f  q );.    ctx.pCo
29f60 6c 6c 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e  ll = pOp[-1].p4.
29f70 70 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 28 63 74  pColl;.  }.  (ct
29f80 78 2e 70 46 75 6e 63 2d 3e 78 53 74 65 70 29 28  x.pFunc->xStep)(
29f90 26 63 74 78 2c 20 6e 2c 20 61 70 56 61 6c 29 3b  &ctx, n, apVal);
29fa0 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35   /* IMP: R-24505
29fb0 2d 32 33 32 33 30 20 2a 2f 0a 20 20 69 66 28 20  -23230 */.  if( 
29fc0 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20  ctx.isError ){. 
29fd0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
29fe0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
29ff0 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
2a000 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 63  e3_value_text(&c
2a010 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63 20 3d  tx.s));.    rc =
2a020 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20   ctx.isError;.  
2a030 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
2a040 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e  MemRelease(&ctx.
2a050 73 29 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  s);..  break;.}.
2a060 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 46  ./* Opcode: AggF
2a070 69 6e 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20  inal P1 P2 * P4 
2a080 2a 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  *.**.** Execute 
2a090 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75  the finalizer fu
2a0a0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67  nction for an ag
2a0b0 67 72 65 67 61 74 65 2e 20 20 50 31 20 69 73 0a  gregate.  P1 is.
2a0c0 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f  ** the memory lo
2a0d0 63 61 74 69 6f 6e 20 74 68 61 74 20 69 73 20 74  cation that is t
2a0e0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 66  he accumulator f
2a0f0 6f 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65  or the aggregate
2a100 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68  ..**.** P2 is th
2a110 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
2a120 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20 73  ments that the s
2a130 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  tep function tak
2a140 65 73 20 61 6e 64 0a 2a 2a 20 50 34 20 69 73 20  es and.** P4 is 
2a150 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a160 20 46 75 6e 63 44 65 66 20 66 6f 72 20 74 68 69   FuncDef for thi
2a170 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  s function.  The
2a180 20 50 32 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20   P2.** argument 
2a190 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
2a1a0 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 49 74 20  his opcode.  It 
2a1b0 69 73 20 6f 6e 6c 79 20 74 68 65 72 65 20 74 6f  is only there to
2a1c0 20 64 69 73 61 6d 62 69 67 75 61 74 65 0a 2a 2a   disambiguate.**
2a1d0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
2a1e0 63 61 6e 20 74 61 6b 65 20 76 61 72 79 69 6e 67  can take varying
2a1f0 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 72 67 75   numbers of argu
2a200 6d 65 6e 74 73 2e 20 20 54 68 65 0a 2a 2a 20 50  ments.  The.** P
2a210 34 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e  4 argument is on
2a220 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68  ly needed for th
2a230 65 20 64 65 67 65 6e 65 72 61 74 65 20 63 61 73  e degenerate cas
2a240 65 20 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 73  e where.** the s
2a250 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  tep function was
2a260 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
2a270 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  called..*/.case 
2a280 4f 50 5f 41 67 67 46 69 6e 61 6c 3a 20 7b 0a 20  OP_AggFinal: {. 
2a290 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61 73   Mem *pMem;.  as
2a2a0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20  sert( pOp->p1>0 
2a2b0 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e  && pOp->p1<=p->n
2a2c0 4d 65 6d 20 29 3b 0a 20 20 70 4d 65 6d 20 3d 20  Mem );.  pMem = 
2a2d0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2a2e0 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 2d    assert( (pMem-
2a2f0 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f 4e  >flags & ~(MEM_N
2a300 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d 30  ull|MEM_Agg))==0
2a310 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2a320 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69 7a  e3VdbeMemFinaliz
2a330 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e  e(pMem, pOp->p4.
2a340 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20 72 63  pFunc);.  if( rc
2a350 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
2a360 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
2a370 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
2a380 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
2a390 78 74 28 70 4d 65 6d 29 29 3b 0a 20 20 7d 0a 20  xt(pMem));.  }. 
2a3a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a3b0 67 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d 2c  geEncoding(pMem,
2a3c0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50   encoding);.  UP
2a3d0 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
2a3e0 45 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20 73  E(pMem);.  if( s
2a3f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f  qlite3VdbeMemToo
2a400 42 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20  Big(pMem) ){.   
2a410 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
2a420 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23   }.  break;.}..#
2a430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a440 49 54 5f 57 41 4c 0a 2f 2a 20 4f 70 63 6f 64 65  IT_WAL./* Opcode
2a450 3a 20 43 68 65 63 6b 70 6f 69 6e 74 20 50 31 20  : Checkpoint P1 
2a460 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2a470 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
2a480 61 73 65 20 50 31 2e 20 54 68 69 73 20 69 73 20  ase P1. This is 
2a490 61 20 6e 6f 2d 6f 70 20 69 66 20 50 31 20 69 73  a no-op if P1 is
2a4a0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69   not currently i
2a4b0 6e 0a 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 20 50  n.** WAL mode. P
2a4c0 61 72 61 6d 65 74 65 72 20 50 32 20 69 73 20 6f  arameter P2 is o
2a4d0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
2a4e0 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
2a4f0 20 46 55 4c 4c 0a 2a 2a 20 6f 72 20 52 45 53 54   FULL.** or REST
2a500 41 52 54 2e 20 20 57 72 69 74 65 20 31 20 6f 72  ART.  Write 1 or
2a510 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20   0 into mem[P3] 
2a520 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  if the checkpoin
2a530 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  t returns.** SQL
2a540 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c  ITE_BUSY or not,
2a550 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
2a560 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
2a570 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2a580 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74 68  .** WAL after th
2a590 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74  e checkpoint int
2a5a0 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20  o mem[P3+1] and 
2a5b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
2a5c0 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41  ges.** in the WA
2a5d0 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  L that have been
2a5e0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 66   checkpointed af
2a5f0 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
2a600 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20  nt.** completes 
2a610 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20  into mem[P3+2]. 
2a620 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20 65   However on an e
2a630 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20  rror, mem[P3+1] 
2a640 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d  and.** mem[P3+2]
2a650 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
2a660 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20   to -1..*/.case 
2a670 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b  OP_Checkpoint: {
2a680 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2a6b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73  er */.  int aRes
2a6c0 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
2a6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2a6e0 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ts */.  Mem *pMe
2a6f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2a700 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a710 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2a720 0a 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b  ..  aRes[0] = 0;
2a730 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65  .  aRes[1] = aRe
2a740 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73  s[2] = -1;.  ass
2a750 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ert( pOp->p2==SQ
2a760 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2a770 50 41 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c  PASSIVE.       |
2a780 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  | pOp->p2==SQLIT
2a790 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
2a7a0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  L.       || pOp-
2a7b0 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
2a7c0 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20  KPOINT_RESTART. 
2a7d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2a7e0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
2a7f0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2a800 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52  2, &aRes[1], &aR
2a810 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63  es[2]);.  if( rc
2a820 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
2a830 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2a840 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d  _OK;.    aRes[0]
2a850 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
2a860 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65  i=0, pMem = &aMe
2a870 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b  m[pOp->p3]; i<3;
2a880 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
2a890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2a8a0 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20  mSetInt64(pMem, 
2a8b0 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20  (i64)aRes[i]);. 
2a8c0 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a   }    .  break;.
2a8d0 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66  };  .#endif..#if
2a8e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a8f0 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64  _PRAGMA./* Opcod
2a900 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50  e: JournalMode P
2a910 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a 0a  1 P2 P3 * P5.**.
2a920 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f  ** Change the jo
2a930 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61  urnal mode of da
2a940 74 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e  tabase P1 to P3.
2a950 20 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20   P3 must be one 
2a960 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f  of the.** PAGER_
2a970 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20  JOURNALMODE_XXX 
2a980 76 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67  values. If chang
2a990 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20  ing between the 
2a9a0 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b  various rollback
2a9b0 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74  .** modes (delet
2a9c0 65 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72  e, truncate, per
2a9d0 73 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65  sist, off and me
2a9e0 6d 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61  mory), this is a
2a9f0 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61   simple.** opera
2aa00 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72  tion. No IO is r
2aa10 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
2aa20 66 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20  f changing into 
2aa30 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f  or out of WAL mo
2aa40 64 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  de the procedure
2aa50 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63   is more complic
2aa60 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ated..**.** Writ
2aa70 65 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  e a string conta
2aa80 69 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  ining the final 
2aa90 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20  journal-mode to 
2aaa0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
2aab0 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d  case OP_JournalM
2aac0 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74  ode: {    /* out
2aad0 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a  2-prerelease */.
2aae0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 20 20 20    Btree *pBt;   
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab00 20 20 2f 2a 20 42 74 72 65 65 20 74 6f 20 63 68    /* Btree to ch
2ab10 61 6e 67 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64  ange journal mod
2ab20 65 20 6f 66 20 2a 2f 0a 20 20 50 61 67 65 72 20  e of */.  Pager 
2ab30 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
2ab40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ab50 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
2ab60 74 68 20 70 42 74 20 2a 2f 0a 20 20 69 6e 74 20  th pBt */.  int 
2ab70 65 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  eNew;           
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ab90 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ew journal mode 
2aba0 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c 64 3b 20 20  */.  int eOld;  
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6c 64 20       /* The old 
2abd0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a  journal mode */.
2abe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2abf0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2ac00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
2ac10 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 70  abase file for p
2ac20 50 61 67 65 72 20 2a 2f 0a 0a 20 20 65 4e 65 77  Pager */..  eNew
2ac30 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73   = pOp->p3;.  as
2ac40 73 65 72 74 28 20 65 4e 65 77 3d 3d 50 41 47 45  sert( eNew==PAGE
2ac50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
2ac60 4c 45 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  LETE .       || 
2ac70 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
2ac80 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
2ac90 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77   .       || eNew
2aca0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2acb0 4f 44 45 5f 50 45 52 53 49 53 54 20 0a 20 20 20  ODE_PERSIST .   
2acc0 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
2acd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2ace0 46 46 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65  FF.       || eNe
2acf0 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
2ad00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 20 20 20 20  MODE_MEMORY.    
2ad10 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
2ad20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2ad30 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77  L.       || eNew
2ad40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2ad50 4f 44 45 5f 51 55 45 52 59 0a 20 20 29 3b 0a 20  ODE_QUERY.  );. 
2ad60 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2ad70 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
2ad80 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 70 42 74  b->nDb );..  pBt
2ad90 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
2ada0 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67 65  p1].pBt;.  pPage
2adb0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
2adc0 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65 4f  Pager(pBt);.  eO
2add0 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ld = sqlite3Page
2ade0 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
2adf0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 65  pPager);.  if( e
2ae00 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
2ae10 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20 65  ALMODE_QUERY ) e
2ae20 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66  New = eOld;.  if
2ae30 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 4f  ( !sqlite3PagerO
2ae40 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c  kToChangeJournal
2ae50 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20 65  Mode(pPager) ) e
2ae60 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66  New = eOld;..#if
2ae70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ae80 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  _WAL.  zFilename
2ae90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
2aea0 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 29 3b  ilename(pPager);
2aeb0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c  ..  /* Do not al
2aec0 6c 6f 77 20 61 20 74 72 61 6e 73 69 74 69 6f 6e  low a transition
2aed0 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   to journal_mode
2aee0 3d 57 41 4c 20 66 6f 72 20 61 20 64 61 74 61 62  =WAL for a datab
2aef0 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74 65 6d 70  ase.  ** in temp
2af00 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 6f 72  orary storage or
2af10 20 69 66 20 74 68 65 20 56 46 53 20 64 6f 65 73   if the VFS does
2af20 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
2af30 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2f  red memory .  */
2af40 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47  .  if( eNew==PAG
2af50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
2af60 41 4c 0a 20 20 20 26 26 20 28 7a 46 69 6c 65 6e  AL.   && (zFilen
2af70 61 6d 65 5b 30 5d 3d 3d 30 20 20 20 20 20 20 20  ame[0]==0       
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 20 2a    /* Temp file *
2afa0 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21 73 71 6c  /.       || !sql
2afb0 69 74 65 33 50 61 67 65 72 57 61 6c 53 75 70 70  ite3PagerWalSupp
2afc0 6f 72 74 65 64 28 70 50 61 67 65 72 29 29 20 20  orted(pPager))  
2afd0 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64 2d 6d 65   /* No shared-me
2afe0 6d 6f 72 79 20 73 75 70 70 6f 72 74 20 2a 2f 0a  mory support */.
2aff0 20 20 29 7b 0a 20 20 20 20 65 4e 65 77 20 3d 20    ){.    eNew = 
2b000 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  eOld;.  }..  if(
2b010 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29 0a 20 20   (eNew!=eOld).  
2b020 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41 47 45 52   && (eOld==PAGER
2b030 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2b040 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
2b050 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
2b060 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 21 64  .  ){.    if( !d
2b070 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 7c 7c  b->autoCommit ||
2b080 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
2b090 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63  nt>1 ){.      rc
2b0a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2b0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
2b0c0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
2b0d0 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20 20 20 20  Msg, db, .      
2b0e0 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e      "cannot chan
2b0f0 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66  ge %s wal mode f
2b100 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61  rom within a tra
2b110 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20  nsaction",.     
2b120 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45       (eNew==PAGE
2b130 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
2b140 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75  L ? "into" : "ou
2b150 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a  t of").      );.
2b160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b170 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20 20 20   }else{. .      
2b180 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  if( eOld==PAGER_
2b190 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
2b1a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2b1b0 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d 6f 64   leaving WAL mod
2b1c0 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67  e, close the log
2b1d0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
2b1e0 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c 0a 20  sful, the call. 
2b1f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50 61 67         ** to Pag
2b200 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63 68 65  erCloseWal() che
2b210 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64 65 6c  ckpoints and del
2b220 65 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 61  etes the write-a
2b230 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20 20 20  head-log .      
2b240 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20 45 58    ** file. An EX
2b250 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d 61 79  CLUSIVE lock may
2b260 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64 20 6f   still be held o
2b270 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2b280 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile .        ** 
2b290 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
2b2a0 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20 20 20  ul return. .    
2b2b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
2b2c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b2d0 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65 72 29  CloseWal(pPager)
2b2e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b2f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b310 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d  PagerSetJournalM
2b320 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77  ode(pPager, eNew
2b330 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 6c     }else if( eOl
2b350 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  d==PAGER_JOURNAL
2b360 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
2b370 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6e 6f 74         /* Cannot
2b380 20 74 72 61 6e 73 69 74 69 6f 6e 20 64 69 72 65   transition dire
2b390 63 74 6c 79 20 66 72 6f 6d 20 4d 45 4d 4f 52 59  ctly from MEMORY
2b3a0 20 74 6f 20 57 41 4c 2e 20 20 55 73 65 20 6d 6f   to WAL.  Use mo
2b3b0 64 65 20 4f 46 46 0a 20 20 20 20 20 20 20 20 2a  de OFF.        *
2b3c0 2a 20 61 73 20 61 6e 20 69 6e 74 65 72 6d 65 64  * as an intermed
2b3d0 69 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  iate */.        
2b3e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a  sqlite3PagerSetJ
2b3f0 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
2b400 72 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  r, PAGER_JOURNAL
2b410 4d 4f 44 45 5f 4f 46 46 29 3b 0a 20 20 20 20 20  MODE_OFF);.     
2b420 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 4f   }.  .      /* O
2b430 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
2b440 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2b450 65 20 66 69 6c 65 2e 20 52 65 67 61 72 64 6c 65  e file. Regardle
2b460 73 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ss of the journa
2b470 6c 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c  l.      ** mode,
2b480 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2b490 6e 20 61 6c 77 61 79 73 20 75 73 65 73 20 61 20  n always uses a 
2b4a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2b4b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b4c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b4d0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
2b4e0 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Bt)==0 );.      
2b4f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b500 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b510 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  = sqlite3BtreeSe
2b520 74 56 65 72 73 69 6f 6e 28 70 42 74 2c 20 28 65  tVersion(pBt, (e
2b530 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
2b540 41 4c 4d 4f 44 45 5f 57 41 4c 20 3f 20 32 20 3a  ALMODE_WAL ? 2 :
2b550 20 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   1));.      }.  
2b560 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
2b570 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
2b580 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69  OMIT_WAL */..  i
2b590 66 28 20 72 63 20 29 7b 0a 20 20 20 20 65 4e 65  f( rc ){.    eNe
2b5a0 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 20 20  w = eOld;.  }.  
2b5b0 65 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 61  eNew = sqlite3Pa
2b5c0 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
2b5d0 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b  e(pPager, eNew);
2b5e0 0a 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ..  pOut = &aMem
2b5f0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75  [pOp->p2];.  pOu
2b600 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  t->flags = MEM_S
2b610 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  tr|MEM_Static|ME
2b620 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
2b630 7a 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  z = (char *)sqli
2b640 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f 64 65 6e 61  te3JournalModena
2b650 6d 65 28 65 4e 65 77 29 3b 0a 20 20 70 4f 75 74  me(eNew);.  pOut
2b660 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
2b670 6c 65 6e 33 30 28 70 4f 75 74 2d 3e 7a 29 3b 0a  len30(pOut->z);.
2b680 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 53 51    pOut->enc = SQ
2b690 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c  LITE_UTF8;.  sql
2b6a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
2b6b0 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e 63  coding(pOut, enc
2b6c0 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
2b6d0 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .};.#endif /* SQ
2b6e0 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
2b6f0 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
2b700 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
2b710 43 55 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65  CUUM) && !define
2b720 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54  d(SQLITE_OMIT_AT
2b730 54 41 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TACH)./* Opcode:
2b740 20 56 61 63 75 75 6d 20 2a 20 2a 20 2a 20 2a 20   Vacuum * * * * 
2b750 2a 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74  *.**.** Vacuum t
2b760 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  he entire databa
2b770 73 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  se.  This opcode
2b780 20 77 69 6c 6c 20 63 61 75 73 65 20 6f 74 68 65   will cause othe
2b790 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20 6d 61 63  r virtual.** mac
2b7a0 68 69 6e 65 73 20 74 6f 20 62 65 20 63 72 65 61  hines to be crea
2b7b0 74 65 64 20 61 6e 64 20 72 75 6e 2e 20 20 49 74  ted and run.  It
2b7c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
2b7d0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  ed from within.*
2b7e0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
2b7f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75  .*/.case OP_Vacu
2b800 75 6d 3a 20 7b 0a 20 20 72 63 20 3d 20 73 71 6c  um: {.  rc = sql
2b810 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28 26 70  ite3RunVacuum(&p
2b820 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29 3b 0a  ->zErrMsg, db);.
2b830 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2b840 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
2b850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2b860 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63 6f 64  VACUUM)./* Opcod
2b870 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20 50 31  e: IncrVacuum P1
2b880 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
2b890 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
2b8a0 20 73 74 65 70 20 6f 66 20 74 68 65 20 69 6e 63   step of the inc
2b8b0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
2b8c0 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a 2a 20  procedure on.** 
2b8d0 74 68 65 20 50 31 20 64 61 74 61 62 61 73 65 2e  the P1 database.
2b8e0 20 49 66 20 74 68 65 20 76 61 63 75 75 6d 20 68   If the vacuum h
2b8f0 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a 75 6d  as finished, jum
2b900 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  p to instruction
2b910 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77 69 73  .** P2. Otherwis
2b920 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  e, fall through 
2b930 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2b940 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
2b950 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d 3a 20   OP_IncrVacuum: 
2b960 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
2b970 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
2b980 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
2b990 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2b9a0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2b9b0 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65  assert( (p->btre
2b9c0 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62 4d 61  eMask & (((yDbMa
2b9d0 73 6b 29 31 29 3c 3c 70 4f 70 2d 3e 70 31 29 29  sk)1)<<pOp->p1))
2b9e0 21 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 64  !=0 );.  pBt = d
2b9f0 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
2ba00 70 42 74 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  pBt;.  rc = sqli
2ba10 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
2ba20 75 6d 28 70 42 74 29 3b 0a 20 20 69 66 28 20 72  um(pBt);.  if( r
2ba30 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2ba40 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e  {.    pc = pOp->
2ba50 70 32 20 2d 20 31 3b 0a 20 20 20 20 72 63 20 3d  p2 - 1;.    rc =
2ba60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2ba70 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2ba80 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78  f../* Opcode: Ex
2ba90 70 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  pire P1 * * * *.
2baa0 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63  **.** Cause prec
2bab0 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
2bac0 74 73 20 74 6f 20 62 65 63 6f 6d 65 20 65 78 70  ts to become exp
2bad0 69 72 65 64 2e 20 41 6e 20 65 78 70 69 72 65 64  ired. An expired
2bae0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 66 61   statement.** fa
2baf0 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ils with an erro
2bb00 72 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54 45  r code of SQLITE
2bb10 5f 53 43 48 45 4d 41 20 69 66 20 69 74 20 69 73  _SCHEMA if it is
2bb20 20 65 76 65 72 20 65 78 65 63 75 74 65 64 20 0a   ever executed .
2bb30 2a 2a 20 28 76 69 61 20 73 71 6c 69 74 65 33 5f  ** (via sqlite3_
2bb40 73 74 65 70 28 29 29 2e 0a 2a 2a 20 0a 2a 2a 20  step())..** .** 
2bb50 49 66 20 50 31 20 69 73 20 30 2c 20 74 68 65 6e  If P1 is 0, then
2bb60 20 61 6c 6c 20 53 51 4c 20 73 74 61 74 65 6d 65   all SQL stateme
2bb70 6e 74 73 20 62 65 63 6f 6d 65 20 65 78 70 69 72  nts become expir
2bb80 65 64 2e 20 49 66 20 50 31 20 69 73 20 6e 6f 6e  ed. If P1 is non
2bb90 2d 7a 65 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f  -zero,.** then o
2bba0 6e 6c 79 20 74 68 65 20 63 75 72 72 65 6e 74 6c  nly the currentl
2bbb0 79 20 65 78 65 63 75 74 69 6e 67 20 73 74 61 74  y executing stat
2bbc0 65 6d 65 6e 74 20 69 73 20 61 66 66 65 63 74 65  ement is affecte
2bbd0 64 2e 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45  d. .*/.case OP_E
2bbe0 78 70 69 72 65 3a 20 7b 0a 20 20 69 66 28 20 21  xpire: {.  if( !
2bbf0 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73  pOp->p1 ){.    s
2bc00 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
2bc10 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
2bc20 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
2bc30 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
2bc40 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
2bc50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2bc70 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 61 62  E./* Opcode: Tab
2bc80 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20 50 33 20  leLock P1 P2 P3 
2bc90 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69  P4 *.**.** Obtai
2bca0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61  n a lock on a pa
2bcb0 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
2bcc0 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2bcd0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
2bce0 65 6e 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64  en.** the shared
2bcf0 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
2bd00 73 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a  s enabled. .**.*
2bd10 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65  * P1 is the inde
2bd20 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
2bd30 65 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62  e in sqlite3.aDb
2bd40 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
2bd50 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  se.** on which t
2bd60 68 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69  he lock is acqui
2bd70 72 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b  red.  A readlock
2bd80 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20   is obtained if 
2bd90 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72  P3==0 or.** a wr
2bda0 69 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d  ite lock if P3==
2bdb0 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74  1..**.** P2 cont
2bdc0 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  ains the root-pa
2bdd0 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ge of the table 
2bde0 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50  to lock..**.** P
2bdf0 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  4 contains a poi
2be00 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  nter to the name
2be10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   of the table be
2be20 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73  ing locked. This
2be30 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64   is only.** used
2be40 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
2be50 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
2be60 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
2be70 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f   be obtained..*/
2be80 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f  .case OP_TableLo
2be90 63 6b 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69  ck: {.  u8 isWri
2bea0 74 65 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70  teLock = (u8)pOp
2beb0 2d 3e 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72  ->p3;.  if( isWr
2bec0 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64  iteLock || 0==(d
2bed0 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2bee0 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2bef0 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d   ){.    int p1 =
2bf00 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 20 20 61   pOp->p1; .    a
2bf10 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
2bf20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
2bf30 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
2bf40 72 65 65 4d 61 73 6b 20 26 20 28 28 28 79 44 62  reeMask & (((yDb
2bf50 4d 61 73 6b 29 31 29 3c 3c 70 31 29 29 21 3d 30  Mask)1)<<p1))!=0
2bf60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bf70 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c  isWriteLock==0 |
2bf80 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31  | isWriteLock==1
2bf90 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2bfa0 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
2bfb0 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70  le(db->aDb[p1].p
2bfc0 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57  Bt, pOp->p2, isW
2bfd0 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  riteLock);.    i
2bfe0 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  f( (rc&0xFF)==SQ
2bff0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  LITE_LOCKED ){. 
2c000 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2c010 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  *z = pOp->p4.z;.
2c020 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
2c030 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
2c040 73 67 2c 20 64 62 2c 20 22 64 61 74 61 62 61 73  sg, db, "databas
2c050 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
2c060 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  d: %s", z);.    
2c070 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
2c080 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c090 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2c0a0 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
2c0b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c0c0 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2c0d0 64 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a  de: VBegin * * *
2c0e0 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d   P4 *.**.** P4 m
2c0f0 61 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  ay be a pointer 
2c100 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74  to an sqlite3_vt
2c110 61 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66  ab structure. If
2c120 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a   so, call the .*
2c130 2a 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20  * xBegin method 
2c140 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  for that table..
2c150 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74  **.** Also, whet
2c160 68 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73  her or not P4 is
2c170 20 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74   set, check that
2c180 20 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69   this is not bei
2c190 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a  ng called from.*
2c1a0 2a 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62  * within a callb
2c1b0 61 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c  ack to a virtual
2c1c0 20 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d   table xSync() m
2c1d0 65 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c  ethod. If it is,
2c1e0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
2c1f0 64 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  de will be set t
2c200 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  o SQLITE_LOCKED.
2c210 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67  .*/.case OP_VBeg
2c220 69 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a  in: {.  VTable *
2c230 70 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d  pVTab;.  pVTab =
2c240 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a   pOp->p4.pVtab;.
2c250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
2c260 61 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61  abBegin(db, pVTa
2c270 62 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20  b);.  if( pVTab 
2c280 29 20 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d  ) importVtabErrM
2c290 73 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74  sg(p, pVTab->pVt
2c2a0 61 62 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ab);.  break;.}.
2c2b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2c2c0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2c2d0 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
2c2e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2c2f0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
2c300 65 3a 20 56 43 72 65 61 74 65 20 50 31 20 2a 20  e: VCreate P1 * 
2c310 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
2c320 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
2c330 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
2c340 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 43  n database P1. C
2c350 61 6c 6c 20 74 68 65 20 78 43 72 65 61 74 65 20  all the xCreate 
2c360 6d 65 74 68 6f 64 0a 2a 2a 20 66 6f 72 20 74 68  method.** for th
2c370 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
2c380 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a  e OP_VCreate: {.
2c390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
2c3a0 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64 62 2c  abCallCreate(db,
2c3b0 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2c3c0 34 2e 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67  4.z, &p->zErrMsg
2c3d0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  );.  break;.}.#e
2c3e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2c3f0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2c400 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2c410 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2c420 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
2c430 20 56 44 65 73 74 72 6f 79 20 50 31 20 2a 20 2a   VDestroy P1 * *
2c440 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2c450 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
2c460 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
2c470 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 43   database P1.  C
2c480 61 6c 6c 20 74 68 65 20 78 44 65 73 74 72 6f 79  all the xDestroy
2c490 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
2c4a0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
2c4b0 65 20 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20 7b  e OP_VDestroy: {
2c4c0 0a 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68  .  p->inVtabMeth
2c4d0 6f 64 20 3d 20 32 3b 0a 20 20 72 63 20 3d 20 73  od = 2;.  rc = s
2c4e0 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44 65  qlite3VtabCallDe
2c4f0 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e 70  stroy(db, pOp->p
2c500 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
2c510 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
2c520 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
2c530 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2c540 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2c550 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
2c560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2c570 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2c580 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20 2a  de: VOpen P1 * *
2c590 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
2c5a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2c5b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
2c5c0 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
2c5d0 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
2c5e0 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72  ..** P1 is a cur
2c5f0 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 69  sor number.  Thi
2c600 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20 61  s opcode opens a
2c610 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 76   cursor to the v
2c620 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  irtual.** table 
2c630 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20  and stores that 
2c640 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f  cursor in P1..*/
2c650 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a 20  .case OP_VOpen: 
2c660 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
2c670 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pCur;.  sqlite3_
2c680 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
2c690 61 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69  abCursor;.  sqli
2c6a0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
2c6b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  .  sqlite3_modul
2c6c0 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70  e *pModule;..  p
2c6d0 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62  Cur = 0;.  pVtab
2c6e0 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 56  Cursor = 0;.  pV
2c6f0 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
2c700 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  tab->pVtab;.  pM
2c710 6f 64 75 6c 65 20 3d 20 28 73 71 6c 69 74 65 33  odule = (sqlite3
2c720 5f 6d 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d  _module *)pVtab-
2c730 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65  >pModule;.  asse
2c740 72 74 28 70 56 74 61 62 20 26 26 20 70 4d 6f 64  rt(pVtab && pMod
2c750 75 6c 65 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f  ule);.  rc = pMo
2c760 64 75 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61  dule->xOpen(pVta
2c770 62 2c 20 26 70 56 74 61 62 43 75 72 73 6f 72 29  b, &pVtabCursor)
2c780 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62 45 72  ;.  importVtabEr
2c790 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a  rMsg(p, pVtab);.
2c7a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
2c7b0 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  =rc ){.    /* In
2c7c0 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65 33  itialize sqlite3
2c7d0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
2c7e0 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 70  e class */.    p
2c7f0 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
2c800 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 20 20  b = pVtab;..    
2c810 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 76 64  /* Initialise vd
2c820 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  be cursor object
2c830 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d 20 61   */.    pCur = a
2c840 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
2c850 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c   pOp->p1, 0, -1,
2c860 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75   0);.    if( pCu
2c870 72 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  r ){.      pCur-
2c880 3e 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  >pVtabCursor = p
2c890 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
2c8a0 20 20 70 43 75 72 2d 3e 70 4d 6f 64 75 6c 65 20    pCur->pModule 
2c8b0 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
2c8c0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
2c8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c8e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c8f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4d 6f 64   = 1;.      pMod
2c900 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
2c910 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  bCursor);.    }.
2c920 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
2c930 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2c940 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2c950 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c960 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2c970 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
2c980 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50 32 20  : VFilter P1 P2 
2c990 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 31  P3 P4 *.**.** P1
2c9a0 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
2c9b0 6e 65 64 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e  ned using VOpen.
2c9c0 20 20 50 32 20 69 73 20 61 6e 20 61 64 64 72 65    P2 is an addre
2c9d0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
2c9e0 0a 2a 2a 20 74 68 65 20 66 69 6c 74 65 72 65 64  .** the filtered
2c9f0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65   result set is e
2ca00 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  mpty..**.** P4 i
2ca10 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72  s either NULL or
2ca20 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77   a string that w
2ca30 61 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  as generated by 
2ca40 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 0a 2a  the xBestIndex.*
2ca50 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  * method of the 
2ca60 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 69 6e 74  module.  The int
2ca70 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
2ca80 68 65 20 50 34 20 73 74 72 69 6e 67 20 69 73 20  he P4 string is 
2ca90 6c 65 66 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d  left.** to the m
2caa0 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  odule implementa
2cab0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2cac0 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
2cad0 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
2cae0 6f 64 20 6f 6e 20 74 68 65 20 76 69 72 74 75 61  od on the virtua
2caf0 6c 20 74 61 62 6c 65 20 73 70 65 63 69 66 69 65  l table specifie
2cb00 64 0a 2a 2a 20 62 79 20 50 31 2e 20 20 54 68 65  d.** by P1.  The
2cb10 20 69 6e 74 65 67 65 72 20 71 75 65 72 79 20 70   integer query p
2cb20 6c 61 6e 20 70 61 72 61 6d 65 74 65 72 20 74 6f  lan parameter to
2cb30 20 78 46 69 6c 74 65 72 20 69 73 20 73 74 6f 72   xFilter is stor
2cb40 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a 2a  ed in register.*
2cb50 2a 20 50 33 2e 20 52 65 67 69 73 74 65 72 20 50  * P3. Register P
2cb60 33 2b 31 20 73 74 6f 72 65 73 20 74 68 65 20 61  3+1 stores the a
2cb70 72 67 63 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rgc parameter to
2cb80 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68   be passed to th
2cb90 65 0a 2a 2a 20 78 46 69 6c 74 65 72 20 6d 65 74  e.** xFilter met
2cba0 68 6f 64 2e 20 52 65 67 69 73 74 65 72 73 20 50  hod. Registers P
2cbb0 33 2b 32 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61  3+2..P3+1+argc a
2cbc0 72 65 20 74 68 65 20 61 72 67 63 0a 2a 2a 20 61  re the argc.** a
2cbd0 64 64 69 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65  dditional parame
2cbe0 74 65 72 73 20 77 68 69 63 68 20 61 72 65 20 70  ters which are p
2cbf0 61 73 73 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c  assed to.** xFil
2cc00 74 65 72 20 61 73 20 61 72 67 76 2e 20 52 65 67  ter as argv. Reg
2cc10 69 73 74 65 72 20 50 33 2b 32 20 62 65 63 6f 6d  ister P3+2 becom
2cc20 65 73 20 61 72 67 76 5b 30 5d 20 77 68 65 6e 20  es argv[0] when 
2cc30 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
2cc40 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  r..**.** A jump 
2cc50 69 73 20 6d 61 64 65 20 74 6f 20 50 32 20 69 66  is made to P2 if
2cc60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2cc70 61 66 74 65 72 20 66 69 6c 74 65 72 69 6e 67 20  after filtering 
2cc80 77 6f 75 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a  would be empty..
2cc90 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 46 69 6c 74  */.case OP_VFilt
2cca0 65 72 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  er: {   /* jump 
2ccb0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  */.  int nArg;. 
2ccc0 20 69 6e 74 20 69 51 75 65 72 79 3b 0a 20 20 63   int iQuery;.  c
2ccd0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
2cce0 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
2ccf0 4d 65 6d 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d  Mem *pQuery;.  M
2cd00 65 6d 20 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c  em *pArgc;.  sql
2cd10 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
2cd20 20 2a 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20   *pVtabCursor;. 
2cd30 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
2cd40 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73  Vtab;.  VdbeCurs
2cd50 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
2cd60 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  res;.  int i;.  
2cd70 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20  Mem **apArg;..  
2cd80 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70  pQuery = &aMem[p
2cd90 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63  Op->p3];.  pArgc
2cda0 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20   = &pQuery[1];. 
2cdb0 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
2cdc0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2cdd0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
2cde0 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47  pQuery) );.  REG
2cdf0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
2ce00 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  >p3, pQuery);.  
2ce10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56  assert( pCur->pV
2ce20 74 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  tabCursor );.  p
2ce30 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75  VtabCursor = pCu
2ce40 72 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r->pVtabCursor;.
2ce50 20 20 70 56 74 61 62 20 3d 20 70 56 74 61 62 43    pVtab = pVtabC
2ce60 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20  ursor->pVtab;.  
2ce70 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
2ce80 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20  >pModule;..  /* 
2ce90 47 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e  Grab the index n
2cea0 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70  umber and argc p
2ceb0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61  arameters */.  a
2cec0 73 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e  ssert( (pQuery->
2ced0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d  flags&MEM_Int)!=
2cee0 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67  0 && pArgc->flag
2cef0 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  s==MEM_Int );.  
2cf00 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67  nArg = (int)pArg
2cf10 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79  c->u.i;.  iQuery
2cf20 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e   = (int)pQuery->
2cf30 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  u.i;..  /* Invok
2cf40 65 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65  e the xFilter me
2cf50 74 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  thod */.  {.    
2cf60 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 61 70 41  res = 0;.    apA
2cf70 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20  rg = p->apArg;. 
2cf80 20 20 20 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c     for(i = 0; i<
2cf90 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2cfa0 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41    apArg[i] = &pA
2cfb0 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20  rgc[i+1];.      
2cfc0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74  sqlite3VdbeMemSt
2cfd0 6f 72 65 54 79 70 65 28 61 70 41 72 67 5b 69 5d  oreType(apArg[i]
2cfe0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  );.    }..    p-
2cff0 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
2d000 31 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d 6f 64  1;.    rc = pMod
2d010 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 74  ule->xFilter(pVt
2d020 61 62 43 75 72 73 6f 72 2c 20 69 51 75 65 72 79  abCursor, iQuery
2d030 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41 72  , pOp->p4.z, nAr
2d040 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 20 20 70  g, apArg);.    p
2d050 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2d060 20 30 3b 0a 20 20 20 20 69 6d 70 6f 72 74 56 74   0;.    importVt
2d070 61 62 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61  abErrMsg(p, pVta
2d080 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
2d090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d0a0 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65     res = pModule
2d0b0 2d 3e 78 45 6f 66 28 70 56 74 61 62 43 75 72 73  ->xEof(pVtabCurs
2d0c0 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  or);.    }..    
2d0d0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
2d0e0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
2d0f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
2d100 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30  Cur->nullRow = 0
2d110 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  ;..  break;.}.#e
2d120 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2d130 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2d140 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2d150 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2d160 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
2d170 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50   VColumn P1 P2 P
2d180 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  3 * *.**.** Stor
2d190 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2d1a0 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20  he P2-th column 
2d1b0 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66  of.** the row of
2d1c0 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62   the virtual-tab
2d1d0 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  le that the .** 
2d1e0 50 31 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  P1 cursor is poi
2d1f0 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65  nting to into re
2d200 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61  gister P3..*/.ca
2d210 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b  se OP_VColumn: {
2d220 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
2d230 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
2d240 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
2d250 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a  pModule;.  Mem *
2d260 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  pDest;.  sqlite3
2d270 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78  _context sContex
2d280 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72  t;..  VdbeCursor
2d290 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73   *pCur = p->apCs
2d2a0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2d2b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61  sert( pCur->pVta
2d2c0 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73  bCursor );.  ass
2d2d0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
2d2e0 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
2d2f0 65 6d 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20  em );.  pDest = 
2d300 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
2d310 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
2d320 67 65 28 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  ge(p, pDest);.  
2d330 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f  if( pCur->nullRo
2d340 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  w ){.    sqlite3
2d350 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
2d360 44 65 73 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  Dest);.    break
2d370 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62 20 3d 20  ;.  }.  pVtab = 
2d380 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73 6f  pCur->pVtabCurso
2d390 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
2d3a0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
2d3b0 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  dule;.  assert( 
2d3c0 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e  pModule->xColumn
2d3d0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43   );.  memset(&sC
2d3e0 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
2d3f0 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 0a 20  f(sContext));.. 
2d400 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 63   /* The output c
2d410 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61 64 79 20  ell may already 
2d420 68 61 76 65 20 61 20 62 75 66 66 65 72 20 61 6c  have a buffer al
2d430 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65 0a 20 20  located. Move.  
2d440 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
2d450 6f 6e 74 65 6e 74 73 20 74 6f 20 73 43 6f 6e 74  ontents to sCont
2d460 65 78 74 2e 73 20 73 6f 20 69 6e 20 63 61 73 65  ext.s so in case
2d470 20 74 68 65 20 75 73 65 72 2d 66 75 6e 63 74 69   the user-functi
2d480 6f 6e 20 0a 20 20 2a 2a 20 63 61 6e 20 75 73 65  on .  ** can use
2d490 20 74 68 65 20 61 6c 72 65 61 64 79 20 61 6c 6c   the already all
2d4a0 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 69 6e  ocated buffer in
2d4b0 73 74 65 61 64 20 6f 66 20 61 6c 6c 6f 63 61 74  stead of allocat
2d4c0 69 6e 67 20 61 20 0a 20 20 2a 2a 20 6e 65 77 20  ing a .  ** new 
2d4d0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  one..  */.  sqli
2d4e0 74 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26  te3VdbeMemMove(&
2d4f0 73 43 6f 6e 74 65 78 74 2e 73 2c 20 70 44 65 73  sContext.s, pDes
2d500 74 29 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65  t);.  MemSetType
2d510 46 6c 61 67 28 26 73 43 6f 6e 74 65 78 74 2e 73  Flag(&sContext.s
2d520 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 0a 20 20  , MEM_Null);..  
2d530 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  rc = pModule->xC
2d540 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74 61  olumn(pCur->pVta
2d550 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74 65  bCursor, &sConte
2d560 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  xt, pOp->p2);.  
2d570 69 6d 70 6f 72 74 56 74 61 62 45 72 72 4d 73 67  importVtabErrMsg
2d580 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
2d590 28 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72  ( sContext.isErr
2d5a0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  or ){.    rc = s
2d5b0 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b  Context.isError;
2d5c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  .  }..  /* Copy 
2d5d0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
2d5e0 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  e function to th
2d5f0 65 20 50 33 20 72 65 67 69 73 74 65 72 2e 20 57  e P3 register. W
2d600 65 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 72  e.  ** do this r
2d610 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2d620 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
2d630 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 74 6f  rror occurred to
2d640 20 65 6e 73 75 72 65 20 61 6e 79 0a 20 20 2a 2a   ensure any.  **
2d650 20 64 79 6e 61 6d 69 63 20 61 6c 6c 6f 63 61 74   dynamic allocat
2d660 69 6f 6e 20 69 6e 20 73 43 6f 6e 74 65 78 74 2e  ion in sContext.
2d670 73 20 28 61 20 4d 65 6d 20 73 74 72 75 63 74 29  s (a Mem struct)
2d680 20 69 73 20 20 72 65 6c 65 61 73 65 64 2e 0a 20   is  released.. 
2d690 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
2d6a0 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
2d6b0 26 73 43 6f 6e 74 65 78 74 2e 73 2c 20 65 6e 63  &sContext.s, enc
2d6c0 6f 64 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  oding);.  sqlite
2d6d0 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 44 65  3VdbeMemMove(pDe
2d6e0 73 74 2c 20 26 73 43 6f 6e 74 65 78 74 2e 73 29  st, &sContext.s)
2d6f0 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
2d700 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65 73  CE(pOp->p3, pDes
2d710 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
2d720 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29  _BLOBSIZE(pDest)
2d730 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
2d740 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44  VdbeMemTooBig(pD
2d750 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  est) ){.    goto
2d760 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
2d770 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
2d780 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
2d790 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
2d7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d7b0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2d7c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78  ./* Opcode: VNex
2d7d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
2d7e0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74  .** Advance virt
2d7f0 75 61 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20  ual table P1 to 
2d800 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
2d810 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 20 61  its result set a
2d820 6e 64 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e  nd.** jump to in
2d830 73 74 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f  struction P2.  O
2d840 72 2c 20 69 66 20 74 68 65 20 76 69 72 74 75 61  r, if the virtua
2d850 6c 20 74 61 62 6c 65 20 68 61 73 20 72 65 61 63  l table has reac
2d860 68 65 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  hed.** the end o
2d870 66 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74  f its result set
2d880 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
2d890 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2d8a0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2d8b0 63 61 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b  case OP_VNext: {
2d8c0 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
2d8d0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2d8e0 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  tab;.  const sql
2d8f0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
2d900 64 75 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  dule;.  int res;
2d910 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2d920 43 75 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b  Cur;..  res = 0;
2d930 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43  .  pCur = p->apC
2d940 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2d950 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74  ssert( pCur->pVt
2d960 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66  abCursor );.  if
2d970 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
2d980 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ){.    break;.  
2d990 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
2d9a0 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  ->pVtabCursor->p
2d9b0 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20  Vtab;.  pModule 
2d9c0 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
2d9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64  ;.  assert( pMod
2d9e0 75 6c 65 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20  ule->xNext );.. 
2d9f0 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78   /* Invoke the x
2da00 4e 65 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66  Next() method of
2da10 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65   the module. The
2da20 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
2da30 20 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c   the.  ** underl
2da40 79 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ying implementat
2da50 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ion to return an
2da60 20 65 72 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63   error if one oc
2da70 63 75 72 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a  curs during.  **
2da80 20 78 4e 65 78 74 28 29 2e 20 49 6e 73 74 65 61   xNext(). Instea
2da90 64 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  d, if an error o
2daa0 63 63 75 72 73 2c 20 74 72 75 65 20 69 73 20 72  ccurs, true is r
2dab0 65 74 75 72 6e 65 64 20 28 69 6e 64 69 63 61 74  eturned (indicat
2dac0 69 6e 67 20 74 68 61 74 20 0a 20 20 2a 2a 20 64  ing that .  ** d
2dad0 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
2dae0 29 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  ) and the error 
2daf0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 77 68  code returned wh
2db00 65 6e 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20  en xColumn or.  
2db10 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65  ** some other me
2db20 74 68 6f 64 20 69 73 20 6e 65 78 74 20 69 6e 76  thod is next inv
2db30 6f 6b 65 64 20 6f 6e 20 74 68 65 20 73 61 76 65  oked on the save
2db40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63   virtual table c
2db50 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 70 2d  ursor..  */.  p-
2db60 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
2db70 31 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  1;.  rc = pModul
2db80 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 70  e->xNext(pCur->p
2db90 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 70  VtabCursor);.  p
2dba0 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
2dbb0 20 30 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62   0;.  importVtab
2dbc0 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29  ErrMsg(p, pVtab)
2dbd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2dbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 73  TE_OK ){.    res
2dbf0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66   = pModule->xEof
2dc00 28 70 43 75 72 2d 3e 70 56 74 61 62 43 75 72 73  (pCur->pVtabCurs
2dc10 6f 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  or);.  }..  if( 
2dc20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  !res ){.    /* I
2dc30 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 2c  f there is data,
2dc40 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
2dc50 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
2dc60 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
2dc70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2dc80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2dc90 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2dca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2dcb0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f  IRTUALTABLE./* O
2dcc0 70 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20 50  pcode: VRename P
2dcd0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
2dce0 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
2dcf0 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
2dd00 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
2dd10 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
2dd20 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f  cture..** This o
2dd30 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68  pcode invokes th
2dd40 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2dd50 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20  xRename method. 
2dd60 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  The value.** in 
2dd70 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 70  register P1 is p
2dd80 61 73 73 65 64 20 61 73 20 74 68 65 20 7a 4e 61  assed as the zNa
2dd90 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  me argument to t
2dda0 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f  he xRename metho
2ddb0 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52  d..*/.case OP_VR
2ddc0 65 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74  ename: {.  sqlit
2ddd0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
2dde0 20 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a 0a 20    Mem *pName;.. 
2ddf0 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34   pVtab = pOp->p4
2de00 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
2de10 20 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d 5b 70   pName = &aMem[p
2de20 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2de30 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  t( pVtab->pModul
2de40 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a 20 20  e->xRename );.  
2de50 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
2de60 69 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20 20 52  id(pName) );.  R
2de70 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
2de80 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20  p->p1, pName);. 
2de90 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
2dea0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
2deb0 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d  );.  rc = pVtab-
2dec0 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d  >pModule->xRenam
2ded0 65 28 70 56 74 61 62 2c 20 70 4e 61 6d 65 2d 3e  e(pVtab, pName->
2dee0 7a 29 3b 0a 20 20 69 6d 70 6f 72 74 56 74 61 62  z);.  importVtab
2def0 45 72 72 4d 73 67 28 70 2c 20 70 56 74 61 62 29  ErrMsg(p, pVtab)
2df00 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
2df10 20 30 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a   0;..  break;.}.
2df20 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2df30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
2df40 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
2df50 64 65 3a 20 56 55 70 64 61 74 65 20 50 31 20 50  de: VUpdate P1 P
2df60 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
2df70 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
2df80 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  to a virtual tab
2df90 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71  le object, an sq
2dfa0 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
2dfb0 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70  ture..** This op
2dfc0 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
2dfd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78   corresponding x
2dfe0 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20 50  Update method. P
2dff0 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20  2 values.** are 
2e000 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f 72  contiguous memor
2e010 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  y cells starting
2e020 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20 74   at P3 to pass t
2e030 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a 2a  o the xUpdate .*
2e040 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54 68  * invocation. Th
2e050 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
2e060 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63 6f  ter (P3+P2-1) co
2e070 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
2e080 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65 6e   .** p2th elemen
2e090 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61 72  t of the argv ar
2e0a0 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78 55  ray passed to xU
2e0b0 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pdate..**.** The
2e0c0 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 20   xUpdate method 
2e0d0 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54 45  will do a DELETE
2e0e0 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f 72   or an INSERT or
2e0f0 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61 72   both..** The ar
2e100 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28 77  gv[0] element (w
2e110 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73  hich corresponds
2e120 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   to memory cell 
2e130 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72 6f  P3).** is the ro
2e140 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f 20  wid of a row to 
2e150 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67 76  delete.  If argv
2e160 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  [0] is NULL then
2e170 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f 6e   no .** deletion
2e180 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61 72   occurs.  The ar
2e190 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69 73  gv[1] element is
2e1a0 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
2e1b0 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20 20  e new .** row.  
2e1c0 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  This can be NULL
2e1d0 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69 72   to have the vir
2e1e0 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65 63  tual table selec
2e1f0 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f  t the new .** ro
2e200 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e 20  wid for itself. 
2e210 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
2e220 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
2e230 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74 68  array are .** th
2e240 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75  e values of colu
2e250 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20 72  mns in the new r
2e260 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32 3d  ow..**.** If P2=
2e270 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65 72  =1 then no inser
2e280 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  t is performed. 
2e290 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20   argv[0] is the 
2e2a0 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72 6f  rowid of.** a ro
2e2b0 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a 0a  w to delete..**.
2e2c0 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c 65  ** P1 is a boole
2e2d0 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20 69  an flag. If it i
2e2e0 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 6e  s set to true an
2e2f0 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63 61  d the xUpdate ca
2e300 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ll.** is success
2e310 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ful, then the va
2e320 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2e330 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
2e340 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a 20  ert_rowid() .** 
2e350 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
2e360 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  lue of the rowid
2e370 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75 73   for the row jus
2e380 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 63  t inserted..*/.c
2e390 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
2e3a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
2e3b0 20 2a 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74   *pVtab;.  sqlit
2e3c0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
2e3d0 6c 65 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  le;.  int nArg;.
2e3e0 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
2e3f0 65 5f 69 6e 74 36 34 20 72 6f 77 69 64 3b 0a 20  e_int64 rowid;. 
2e400 20 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 20 20   Mem **apArg;.  
2e410 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20 61 73 73 65  Mem *pX;..  asse
2e420 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 20  rt( pOp->p2==1  
2e430 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35        || pOp->p5
2e440 3d 3d 4f 45 5f 46 61 69 6c 20 20 20 7c 7c 20 70  ==OE_Fail   || p
2e450 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c 62  Op->p5==OE_Rollb
2e460 61 63 6b 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ack .       || p
2e470 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p5==OE_Abort
2e480 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f   || pOp->p5==OE_
2e490 49 67 6e 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e 70  Ignore || pOp->p
2e4a0 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20  5==OE_Replace.  
2e4b0 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  );.  pVtab = pOp
2e4c0 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
2e4d0 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 28  b;.  pModule = (
2e4e0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
2e4f0 29 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  )pVtab->pModule;
2e500 0a 20 20 6e 41 72 67 20 3d 20 70 4f 70 2d 3e 70  .  nArg = pOp->p
2e510 32 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  2;.  assert( pOp
2e520 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41  ->p4type==P4_VTA
2e530 42 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  B );.  if( ALWAY
2e540 53 28 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61  S(pModule->xUpda
2e550 74 65 29 20 29 7b 0a 20 20 20 20 75 38 20 76 74  te) ){.    u8 vt
2e560 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 64  abOnConflict = d
2e570 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63  b->vtabOnConflic
2e580 74 3b 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70  t;.    apArg = p
2e590 2d 3e 61 70 41 72 67 3b 0a 20 20 20 20 70 58 20  ->apArg;.    pX 
2e5a0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
2e5b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2e5c0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
2e5d0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
2e5e0 56 61 6c 69 64 28 70 58 29 20 29 3b 0a 20 20 20  Valid(pX) );.   
2e5f0 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
2e600 6e 67 65 28 70 2c 20 70 58 29 3b 0a 20 20 20 20  nge(p, pX);.    
2e610 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2e620 53 74 6f 72 65 54 79 70 65 28 70 58 29 3b 0a 20  StoreType(pX);. 
2e630 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20       apArg[i] = 
2e640 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b 0a  pX;.      pX++;.
2e650 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 76 74      }.    db->vt
2e660 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 70  abOnConflict = p
2e670 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63 20 3d  Op->p5;.    rc =
2e680 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74   pModule->xUpdat
2e690 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61  e(pVtab, nArg, a
2e6a0 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b 0a 20  pArg, &rowid);. 
2e6b0 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f 6e     db->vtabOnCon
2e6c0 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e 43 6f  flict = vtabOnCo
2e6d0 6e 66 6c 69 63 74 3b 0a 20 20 20 20 69 6d 70 6f  nflict;.    impo
2e6e0 72 74 56 74 61 62 45 72 72 4d 73 67 28 70 2c 20  rtVtabErrMsg(p, 
2e6f0 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28 20  pVtab);.    if( 
2e700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2e710 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
2e720 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 31    assert( nArg>1
2e730 20 26 26 20 61 70 41 72 67 5b 30 5d 20 26 26 20   && apArg[0] && 
2e740 28 61 70 41 72 67 5b 30 5d 2d 3e 66 6c 61 67 73  (apArg[0]->flags
2e750 26 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b 0a 20 20  &MEM_Null) );.  
2e760 20 20 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69      db->lastRowi
2e770 64 20 3d 20 6c 61 73 74 52 6f 77 69 64 20 3d 20  d = lastRowid = 
2e780 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  rowid;.    }.   
2e790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e7a0 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
2e7b0 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f  p->p4.pVtab->bCo
2e7c0 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
2e7d0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f    if( pOp->p5==O
2e7e0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
2e7f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e800 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
2e810 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
2e820 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d  rAction = ((pOp-
2e830 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  >p5==OE_Replace)
2e840 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f   ? OE_Abort : pO
2e850 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a  p->p5);.      }.
2e860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e870 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
2e880 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b     }.  }.  break
2e890 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2e8a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2e8b0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64  LTABLE */..#ifnd
2e8c0 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ef  SQLITE_OMIT_
2e8d0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a  PAGER_PRAGMAS./*
2e8e0 20 4f 70 63 6f 64 65 3a 20 50 61 67 65 63 6f 75   Opcode: Pagecou
2e8f0 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  nt P1 P2 * * *.*
2e900 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63  *.** Write the c
2e910 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
2e920 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2e930 73 65 20 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20  se P1 to memory 
2e940 63 65 6c 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  cell P2..*/.case
2e950 20 4f 50 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b   OP_Pagecount: {
2e960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
2e970 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a  ut2-prerelease *
2e980 2f 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  /.  pOut->u.i = 
2e990 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2e9a0 50 61 67 65 28 64 62 2d 3e 61 44 62 5b 70 4f 70  Page(db->aDb[pOp
2e9b0 2d 3e 70 31 5d 2e 70 42 74 29 3b 0a 20 20 62 72  ->p1].pBt);.  br
2e9c0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  eak;.}.#endif...
2e9d0 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45 5f  #ifndef  SQLITE_
2e9e0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
2e9f0 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  AS./* Opcode: Ma
2ea00 78 50 67 63 6e 74 20 50 31 20 50 32 20 50 33 20  xPgcnt P1 P2 P3 
2ea10 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  * *.**.** Try to
2ea20 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
2ea30 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
2ea40 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 74  database P1 to t
2ea50 68 65 20 76 61 6c 75 65 20 69 6e 20 50 33 2e 0a  he value in P3..
2ea60 2a 2a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  ** Do not let th
2ea70 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
2ea80 6f 75 6e 74 20 66 61 6c 6c 20 62 65 6c 6f 77 20  ount fall below 
2ea90 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2eaa0 20 63 6f 75 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f   count and.** do
2eab0 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
2eac0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
2ead0 6e 74 20 76 61 6c 75 65 20 69 66 20 50 33 3d 3d  nt value if P3==
2eae0 30 2e 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 74  0..**.** Store t
2eaf0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
2eb00 63 6f 75 6e 74 20 61 66 74 65 72 20 74 68 65 20  count after the 
2eb10 63 68 61 6e 67 65 20 69 6e 20 72 65 67 69 73 74  change in regist
2eb20 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  er P2..*/.case O
2eb30 50 5f 4d 61 78 50 67 63 6e 74 3a 20 7b 20 20 20  P_MaxPgcnt: {   
2eb40 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
2eb50 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
2eb60 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
2eb70 77 4d 61 78 3b 0a 20 20 42 74 72 65 65 20 2a 70  wMax;.  Btree *p
2eb80 42 74 3b 0a 0a 20 20 70 42 74 20 3d 20 64 62 2d  Bt;..  pBt = db-
2eb90 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42  >aDb[pOp->p1].pB
2eba0 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20 30 3b  t;.  newMax = 0;
2ebb0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29  .  if( pOp->p3 )
2ebc0 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 73  {.    newMax = s
2ebd0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
2ebe0 61 67 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  age(pBt);.    if
2ebf0 28 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e 73 69  ( newMax < (unsi
2ec00 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29 20 6e  gned)pOp->p3 ) n
2ec10 65 77 4d 61 78 20 3d 20 28 75 6e 73 69 67 6e 65  ewMax = (unsigne
2ec20 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20  d)pOp->p3;.  }. 
2ec30 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c   pOut->u.i = sql
2ec40 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
2ec50 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77 4d 61  Count(pBt, newMa
2ec60 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  x);.  break;.}.#
2ec70 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
2ec80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
2ec90 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61  E./* Opcode: Tra
2eca0 63 65 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  ce * * * P4 *.**
2ecb0 0a 2a 2a 20 49 66 20 74 72 61 63 69 6e 67 20 69  .** If tracing i
2ecc0 73 20 65 6e 61 62 6c 65 64 20 28 62 79 20 74 68  s enabled (by th
2ecd0 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28  e sqlite3_trace(
2ece0 29 29 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68  )) interface, th
2ecf0 65 6e 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38 20  en.** the UTF-8 
2ed00 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64  string contained
2ed10 20 69 6e 20 50 34 20 69 73 20 65 6d 69 74 74 65   in P4 is emitte
2ed20 64 20 6f 6e 20 74 68 65 20 74 72 61 63 65 20 63  d on the trace c
2ed30 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65  allback..*/.case
2ed40 20 4f 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20 63   OP_Trace: {.  c
2ed50 68 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63  har *zTrace;.  c
2ed60 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 64  har *z;..  if( d
2ed70 62 2d 3e 78 54 72 61 63 65 20 26 26 20 28 7a 54  b->xTrace && (zT
2ed80 72 61 63 65 20 3d 20 28 70 4f 70 2d 3e 70 34 2e  race = (pOp->p4.
2ed90 7a 20 3f 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20  z ? pOp->p4.z : 
2eda0 70 2d 3e 7a 53 71 6c 29 29 21 3d 30 20 29 7b 0a  p->zSql))!=0 ){.
2edb0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56      z = sqlite3V
2edc0 64 62 65 45 78 70 61 6e 64 53 71 6c 28 70 2c 20  dbeExpandSql(p, 
2edd0 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 64 62 2d  zTrace);.    db-
2ede0 3e 78 54 72 61 63 65 28 64 62 2d 3e 70 54 72 61  >xTrace(db->pTra
2edf0 63 65 41 72 67 2c 20 7a 29 3b 0a 20 20 20 20 73  ceArg, z);.    s
2ee00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ee10 20 7a 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   z);.  }.#ifdef 
2ee20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
2ee30 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
2ee40 53 51 4c 49 54 45 5f 53 71 6c 54 72 61 63 65 29  SQLITE_SqlTrace)
2ee50 21 3d 30 0a 20 20 20 26 26 20 28 7a 54 72 61 63  !=0.   && (zTrac
2ee60 65 20 3d 20 28 70 4f 70 2d 3e 70 34 2e 7a 20 3f  e = (pOp->p4.z ?
2ee70 20 70 4f 70 2d 3e 70 34 2e 7a 20 3a 20 70 2d 3e   pOp->p4.z : p->
2ee80 7a 53 71 6c 29 29 21 3d 30 0a 20 20 29 7b 0a 20  zSql))!=0.  ){. 
2ee90 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2eea0 72 69 6e 74 66 28 22 53 51 4c 2d 74 72 61 63 65  rintf("SQL-trace
2eeb0 3a 20 25 73 5c 6e 22 2c 20 7a 54 72 61 63 65 29  : %s\n", zTrace)
2eec0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
2eed0 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2eee0 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
2eef0 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  f.../* Opcode: N
2ef00 6f 6f 70 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  oop * * * * *.**
2ef10 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  .** Do nothing. 
2ef20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
2ef30 6e 20 69 73 20 6f 66 74 65 6e 20 75 73 65 66 75  n is often usefu
2ef40 6c 20 61 73 20 61 20 6a 75 6d 70 0a 2a 2a 20 64  l as a jump.** d
2ef50 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f  estination..*/./
2ef60 2a 0a 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 45  *.** The magic E
2ef70 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 61 72  xplain opcode ar
2ef80 65 20 6f 6e 6c 79 20 69 6e 73 65 72 74 65 64 20  e only inserted 
2ef90 77 68 65 6e 20 65 78 70 6c 61 69 6e 3d 3d 32 20  when explain==2 
2efa0 28 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 6f 20  (which.** is to 
2efb0 73 61 79 20 77 68 65 6e 20 74 68 65 20 45 58 50  say when the EXP
2efc0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2efd0 73 79 6e 74 61 78 20 69 73 20 75 73 65 64 2e 29  syntax is used.)
2efe0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2eff0 72 65 63 6f 72 64 73 20 69 6e 66 6f 72 6d 61 74  records informat
2f000 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6f 70 74  ion from the opt
2f010 69 6d 69 7a 65 72 2e 20 20 49 74 20 69 73 20 74  imizer.  It is t
2f020 68 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61  he.** the same a
2f030 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 69 73  s a no-op.  This
2f040 20 6f 70 63 6f 64 65 73 6e 65 76 65 72 20 61 70   opcodesnever ap
2f050 70 65 61 72 73 20 69 6e 20 61 20 72 65 61 6c 20  pears in a real 
2f060 56 4d 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 64  VM program..*/.d
2f070 65 66 61 75 6c 74 3a 20 7b 20 20 20 20 20 20 20  efault: {       
2f080 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 72 65     /* This is re
2f090 61 6c 6c 79 20 4f 50 5f 4e 6f 6f 70 20 61 6e 64  ally OP_Noop and
2f0a0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20   OP_Explain */. 
2f0b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2f0c0 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f 70 20 7c 7c  code==OP_Noop ||
2f0d0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2f0e0 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 62 72  _Explain );.  br
2f0f0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  eak;.}../*******
2f100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f140 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ******.** The ca
2f150 73 65 73 20 6f 66 20 74 68 65 20 73 77 69 74 63  ses of the switc
2f160 68 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 76  h statement abov
2f170 65 20 74 68 69 73 20 6c 69 6e 65 20 73 68 6f 75  e this line shou
2f180 6c 64 20 61 6c 6c 20 62 65 20 69 6e 64 65 6e 74  ld all be indent
2f190 65 64 0a 2a 2a 20 62 79 20 36 20 73 70 61 63 65  ed.** by 6 space
2f1a0 73 2e 20 20 42 75 74 20 74 68 65 20 6c 65 66 74  s.  But the left
2f1b0 2d 6d 6f 73 74 20 36 20 73 70 61 63 65 73 20 68  -most 6 spaces h
2f1c0 61 76 65 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ave been removed
2f1d0 20 74 6f 20 69 6d 70 72 6f 76 65 20 74 68 65 0a   to improve the.
2f1e0 2a 2a 20 72 65 61 64 61 62 69 6c 69 74 79 2e 20  ** readability. 
2f1f0 20 46 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74   From this point
2f200 20 6f 6e 20 64 6f 77 6e 2c 20 74 68 65 20 6e 6f   on down, the no
2f210 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f 6e  rmal indentation
2f220 20 72 75 6c 65 73 20 61 72 65 0a 2a 2a 20 72 65   rules are.** re
2f230 73 74 6f 72 65 64 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  stored..********
2f240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f280 2a 2a 2a 2a 2a 2f 0a 20 20 20 20 7d 0a 0a 23 69  *****/.    }..#i
2f290 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
2f2a0 45 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75 36  E.    {.      u6
2f2b0 34 20 65 6c 61 70 73 65 64 20 3d 20 73 71 6c 69  4 elapsed = sqli
2f2c0 74 65 33 48 77 74 69 6d 65 28 29 20 2d 20 73 74  te3Hwtime() - st
2f2d0 61 72 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  art;.      pOp->
2f2e0 63 79 63 6c 65 73 20 2b 3d 20 65 6c 61 70 73 65  cycles += elapse
2f2f0 64 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 63 6e  d;.      pOp->cn
2f300 74 2b 2b 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  t++;.#if 0.     
2f310 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75     fprintf(stdou
2f320 74 2c 20 22 25 31 30 6c 6c 75 20 22 2c 20 65 6c  t, "%10llu ", el
2f330 61 70 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20  apsed);.        
2f340 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
2f350 4f 70 28 73 74 64 6f 75 74 2c 20 6f 72 69 67 50  Op(stdout, origP
2f360 63 2c 20 26 61 4f 70 5b 6f 72 69 67 50 63 5d 29  c, &aOp[origPc])
2f370 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 23  ;.#endif.    }.#
2f380 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
2f390 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
2f3a0 20 61 64 64 73 20 6e 6f 74 68 69 6e 67 20 74 6f   adds nothing to
2f3b0 20 74 68 65 20 61 63 74 75 61 6c 20 66 75 6e 63   the actual func
2f3c0 74 69 6f 6e 61 6c 69 74 79 0a 20 20 20 20 2a 2a  tionality.    **
2f3d0 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
2f3e0 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 68 65 72    It is only her
2f3f0 65 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  e for testing an
2f400 64 20 64 65 62 75 67 67 69 6e 67 2e 0a 20 20 20  d debugging..   
2f410 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
2f420 20 68 61 6e 64 2c 20 69 74 20 64 6f 65 73 20 62   hand, it does b
2f430 75 72 6e 20 43 50 55 20 63 79 63 6c 65 73 20 65  urn CPU cycles e
2f440 76 65 72 79 20 74 69 6d 65 20 74 68 72 6f 75 67  very time throug
2f450 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 76 61  h.    ** the eva
2f460 6c 75 61 74 6f 72 20 6c 6f 6f 70 2e 20 20 53 6f  luator loop.  So
2f470 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20 69 74   we can leave it
2f480 20 6f 75 74 20 77 68 65 6e 20 4e 44 45 42 55 47   out when NDEBUG
2f490 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20   is defined..   
2f4a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
2f4b0 55 47 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  UG.    assert( p
2f4c0 63 3e 3d 2d 31 20 26 26 20 70 63 3c 70 2d 3e 6e  c>=-1 && pc<p->n
2f4d0 4f 70 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  Op );..#ifdef SQ
2f4e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
2f4f0 66 28 20 70 2d 3e 74 72 61 63 65 20 29 7b 0a 20  f( p->trace ){. 
2f500 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
2f510 20 66 70 72 69 6e 74 66 28 70 2d 3e 74 72 61 63   fprintf(p->trac
2f520 65 2c 22 72 63 3d 25 64 5c 6e 22 2c 72 63 29 3b  e,"rc=%d\n",rc);
2f530 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2f540 6f 70 66 6c 61 67 73 20 26 20 28 4f 50 46 4c 47  opflags & (OPFLG
2f550 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45 41 53 45  _OUT2_PRERELEASE
2f560 7c 4f 50 46 4c 47 5f 4f 55 54 32 29 20 29 7b 0a  |OPFLG_OUT2) ){.
2f570 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 72          register
2f580 54 72 61 63 65 28 70 2d 3e 74 72 61 63 65 2c 20  Trace(p->trace, 
2f590 70 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70  pOp->p2, &aMem[p
2f5a0 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20  Op->p2]);.      
2f5b0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  }.      if( pOp-
2f5c0 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
2f5d0 5f 4f 55 54 33 20 29 7b 0a 20 20 20 20 20 20 20  _OUT3 ){.       
2f5e0 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70   registerTrace(p
2f5f0 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 33  ->trace, pOp->p3
2f600 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
2f610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f620 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
2f630 54 45 5f 44 45 42 55 47 20 2a 2f 0a 23 65 6e 64  TE_DEBUG */.#end
2f640 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
2f650 0a 20 20 7d 20 20 2f 2a 20 54 68 65 20 65 6e 64  .  }  /* The end
2f660 20 6f 66 20 74 68 65 20 66 6f 72 28 3b 3b 29 20   of the for(;;) 
2f670 6c 6f 6f 70 20 74 68 65 20 6c 6f 6f 70 73 20 74  loop the loops t
2f680 68 72 6f 75 67 68 20 6f 70 63 6f 64 65 73 20 2a  hrough opcodes *
2f690 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  /..  /* If we re
2f6a0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
2f6b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  it means that ex
2f6c0 65 63 75 74 69 6f 6e 20 69 73 20 66 69 6e 69 73  ecution is finis
2f6d0 68 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  hed with.  ** an
2f6e0 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d 65 20 6b   error of some k
2f6f0 69 6e 64 2e 0a 20 20 2a 2f 0a 76 64 62 65 5f 65  ind..  */.vdbe_e
2f700 72 72 6f 72 5f 68 61 6c 74 3a 0a 20 20 61 73 73  rror_halt:.  ass
2f710 65 72 74 28 20 72 63 20 29 3b 0a 20 20 70 2d 3e  ert( rc );.  p->
2f720 72 63 20 3d 20 72 63 3b 0a 20 20 74 65 73 74 63  rc = rc;.  testc
2f730 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
2f740 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
2f750 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
2f760 67 28 72 63 2c 20 22 73 74 61 74 65 6d 65 6e 74  g(rc, "statement
2f770 20 61 62 6f 72 74 73 20 61 74 20 25 64 3a 20 5b   aborts at %d: [
2f780 25 73 5d 20 25 73 22 2c 20 0a 20 20 20 20 20 20  %s] %s", .      
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 63 2c               pc,
2f7a0 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72   p->zSql, p->zEr
2f7b0 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2f7c0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 69  VdbeHalt(p);.  i
2f7d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2f7e0 45 52 52 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e  ERR_NOMEM ) db->
2f7f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
2f800 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
2f810 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 65 73  ERROR;.  if( res
2f820 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3e  etSchemaOnFault>
2f830 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2f840 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2f850 65 6d 61 28 64 62 2c 20 72 65 73 65 74 53 63 68  ema(db, resetSch
2f860 65 6d 61 4f 6e 46 61 75 6c 74 2d 31 29 3b 0a 20  emaOnFault-1);. 
2f870 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73   }..  /* This is
2f880 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 6f 75   the only way ou
2f890 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  t of this proced
2f8a0 75 72 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ure.  We have to
2f8b0 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  .  ** release th
2f8c0 65 20 6d 75 74 65 78 65 73 20 6f 6e 20 62 74 72  e mutexes on btr
2f8d0 65 65 73 20 74 68 61 74 20 77 65 72 65 20 61 63  ees that were ac
2f8e0 71 75 69 72 65 64 20 61 74 20 74 68 65 0a 20 20  quired at the.  
2f8f0 2a 2a 20 74 6f 70 2e 20 2a 2f 0a 76 64 62 65 5f  ** top. */.vdbe_
2f900 72 65 74 75 72 6e 3a 0a 20 20 64 62 2d 3e 6c 61  return:.  db->la
2f910 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52 6f  stRowid = lastRo
2f920 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  wid;.  sqlite3Vd
2f930 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  beLeave(p);.  re
2f940 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
2f950 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61  ump to here if a
2f960 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
2f970 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49  larger than SQLI
2f980 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20 20  TE_MAX_LENGTH.  
2f990 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
2f9a0 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67 3a  d..  */.too_big:
2f9b0 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72  .  sqlite3SetStr
2f9c0 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
2f9d0 20 64 62 2c 20 22 73 74 72 69 6e 67 20 6f 72 20   db, "string or 
2f9e0 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b 0a  blob too big");.
2f9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f    rc = SQLITE_TO
2fa00 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64 62  OBIG;.  goto vdb
2fa10 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20  e_error_halt;.. 
2fa20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
2fa30 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
2fa40 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d 65  ails..  */.no_me
2fa50 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  m:.  db->mallocF
2fa60 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  ailed = 1;.  sql
2fa70 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
2fa80 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
2fa90 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
2faa0 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
2fab0 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62  OMEM;.  goto vdb
2fac0 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20  e_error_halt;.. 
2fad0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
2fae0 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b   for any other k
2faf0 69 6e 64 20 6f 66 20 66 61 74 61 6c 20 65 72 72  ind of fatal err
2fb00 6f 72 2e 20 20 54 68 65 20 22 72 63 22 20 76 61  or.  The "rc" va
2fb10 72 69 61 62 6c 65 0a 20 20 2a 2a 20 73 68 6f 75  riable.  ** shou
2fb20 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 72 72 6f  ld hold the erro
2fb30 72 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 61  r number..  */.a
2fb40 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2fb50 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  r:.  assert( p->
2fb60 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20  zErrMsg==0 );.  
2fb70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2fb80 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  iled ) rc = SQLI
2fb90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
2fba0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2fbb0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
2fbc0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2fbd0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
2fbe0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
2fbf0 53 74 72 28 72 63 29 29 3b 0a 20 20 7d 0a 20 20  Str(rc));.  }.  
2fc00 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f 72 5f  goto vdbe_error_
2fc10 68 61 6c 74 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  halt;..  /* Jump
2fc20 20 74 6f 20 68 65 72 65 20 69 66 20 74 68 65 20   to here if the 
2fc30 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
2fc40 74 28 29 20 41 50 49 20 73 65 74 73 20 74 68 65  t() API sets the
2fc50 20 69 6e 74 65 72 72 75 70 74 0a 20 20 2a 2a 20   interrupt.  ** 
2fc60 66 6c 61 67 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74  flag..  */.abort
2fc70 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70  _due_to_interrup
2fc80 74 3a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  t:.  assert( db-
2fc90 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
2fca0 64 20 29 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49  d );.  rc = SQLI
2fcb0 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20  TE_INTERRUPT;.  
2fcc0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73 71  p->rc = rc;.  sq
2fcd0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2fce0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
2fcf0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
2fd00 53 74 72 28 72 63 29 29 3b 0a 20 20 67 6f 74 6f  Str(rc));.  goto
2fd10 20 76 64 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74   vdbe_error_halt
2fd20 3b 0a 7d 0a                                      ;.}.