/ Hex Artifact Content
Login

Artifact d30c6c3e022ff0c4ff0202adfcaf38b89cb642ee:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
0840: 65 2e 63 2c 76 20 31 2e 38 30 39 20 32 30 30 39  e.c,v 1.809 2009
0850: 2f 30 31 2f 30 35 20 31 38 3a 30 32 3a 32 37 20  /01/05 18:02:27 
0860: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0870: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0880: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h".#include <ct
0890: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
08a0: 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  "vdbeInt.h"../*.
08b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
08c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
08d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
08e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
08f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0900: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0910: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0920: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0930: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0940: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0950: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0960: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0970: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0980: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0990: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
09a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
09b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
09c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
09f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0a00: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0a10: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0a20: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0a30: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0a40: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0a50: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0a60: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0a70: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0a80: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0a90: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
0aa0: 20 20 57 68 65 6e 20 72 65 61 63 68 65 73 20 7a    When reaches z
0ab0: 65 72 6f 2c 20 74 68 65 20 75 31 2e 69 73 49 6e  ero, the u1.isIn
0ac0: 74 65 72 72 75 70 74 65 64 0a 2a 2a 20 66 69 65  terrupted.** fie
0ad0: 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
0ae0: 33 20 73 74 72 75 63 74 75 72 65 20 69 73 20 73  3 structure is s
0af0: 65 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  et in order to s
0b00: 69 6d 75 6c 61 74 65 20 61 6e 64 20 69 6e 74 65  imulate and inte
0b10: 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrupt..**.** Thi
0b20: 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 75 73  s facility is us
0b30: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ed for testing p
0b40: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 49  urposes only.  I
0b50: 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63 74  t does not funct
0b60: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f 72 64  ion.** in an ord
0b70: 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a 2f 0a  inary build..*/.
0b80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
0b90: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  ST.int sqlite3_i
0ba0: 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 20 3d  nterrupt_count =
0bb0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0bc0: 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62 61  * The next globa
0bd0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
0be0: 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20 74  cremented each t
0bf0: 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20  ype the OP_Sort 
0c00: 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65 78 65  opcode.** is exe
0c10: 63 75 74 65 64 2e 20 20 54 68 65 20 74 65 73 74  cuted.  The test
0c20: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0c30: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0c40: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0c50: 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20 69 73  at.** sorting is
0c60: 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20 6e 6f   occurring or no
0c70: 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 61  t occurring at a
0c80: 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d 65 73  ppropriate times
0c90: 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  .   This variabl
0ca0: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0cb0: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0cc0: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0cd0: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ce0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0cf0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0d00: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0d10: 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  t sqlite3_sort_c
0d20: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
0d30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ../*.** The next
0d40: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0d50: 20 72 65 63 6f 72 64 73 20 74 68 65 20 73 69 7a   records the siz
0d60: 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  e of the largest
0d70: 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f 72 20   MEM_Blob.** or 
0d80: 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68 61 73  MEM_Str that has
0d90: 20 62 65 65 6e 20 75 73 65 64 20 62 79 20 61 20   been used by a 
0da0: 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20 54 68  VDBE opcode.  Th
0db0: 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
0dc0: 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 69 6e  s.** use this in
0dd0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d 61 6b  formation to mak
0de0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
0df0: 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63 74 69  zero-blob functi
0e00: 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20 77 6f  onality.** is wo
0e10: 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e  rking correctly.
0e20: 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65     This variable
0e30: 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69 6f 6e   has no function
0e40: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f 0a 2a   other than to.*
0e50: 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20 74 68  * help verify th
0e60: 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  e correct operat
0e70: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61  ion of the libra
0e80: 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ry..*/.#ifdef SQ
0e90: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
0ea0: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0eb0: 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76  ze = 0;.static v
0ec0: 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42 6c 6f  oid updateMaxBlo
0ed0: 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b 0a 20  bsize(Mem *p){. 
0ee0: 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26   if( (p->flags &
0ef0: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
0f00: 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e 6e 3e  ob))!=0 && p->n>
0f10: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0f20: 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  size ){.    sqli
0f30: 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
0f40: 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d 0a 23   = p->n;.  }.}.#
0f50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
0f60: 74 20 61 20 72 65 67 69 73 74 65 72 20 74 6f 20  t a register to 
0f70: 73 65 65 20 69 66 20 69 74 20 65 78 63 65 65 64  see if it exceed
0f80: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  s the current ma
0f90: 78 69 6d 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e  ximum blob size.
0fa0: 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20  .** If it does, 
0fb0: 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77 20 6d  record the new m
0fc0: 61 78 69 6d 75 6d 20 62 6c 6f 62 20 73 69 7a 65  aximum blob size
0fd0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
0fe0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
0ff0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1000: 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1010: 53 54 29 0a 23 20 64 65 66 69 6e 65 20 55 50 44  ST).# define UPD
1020: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
1030: 28 50 29 20 20 75 70 64 61 74 65 4d 61 78 42 6c  (P)  updateMaxBl
1040: 6f 62 73 69 7a 65 28 50 29 0a 23 65 6c 73 65 0a  obsize(P).#else.
1050: 23 20 64 65 66 69 6e 65 20 55 50 44 41 54 45 5f  # define UPDATE_
1060: 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 50 29 0a  MAX_BLOBSIZE(P).
1070: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
1080: 6e 76 65 72 74 20 74 68 65 20 67 69 76 65 6e 20  nvert the given 
1090: 72 65 67 69 73 74 65 72 20 69 6e 74 6f 20 61 20  register into a 
10a0: 73 74 72 69 6e 67 20 69 66 20 69 74 20 69 73 6e  string if it isn
10b0: 27 74 20 6f 6e 65 0a 2a 2a 20 61 6c 72 65 61 64  't one.** alread
10c0: 79 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  y. Return non-ze
10d0: 72 6f 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ro if a malloc()
10e0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   fails..*/.#defi
10f0: 6e 65 20 53 74 72 69 6e 67 69 66 79 28 50 2c 20  ne Stringify(P, 
1100: 65 6e 63 29 20 5c 0a 20 20 20 69 66 28 28 28 50  enc) \.   if(((P
1110: 29 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  )->flags&(MEM_St
1120: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
1130: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  && sqlite3VdbeMe
1140: 6d 53 74 72 69 6e 67 69 66 79 28 50 2c 65 6e 63  mStringify(P,enc
1150: 29 29 20 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f  )) \.     { goto
1160: 20 6e 6f 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a   no_mem; }../*.*
1170: 2a 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 73  * An ephemeral s
1180: 74 72 69 6e 67 20 76 61 6c 75 65 20 28 73 69 67  tring value (sig
1190: 6e 69 66 69 65 64 20 62 79 20 74 68 65 20 4d 45  nified by the ME
11a0: 4d 5f 45 70 68 65 6d 20 66 6c 61 67 29 20 63 6f  M_Ephem flag) co
11b0: 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e  ntains.** a poin
11c0: 74 65 72 20 74 6f 20 61 20 64 79 6e 61 6d 69 63  ter to a dynamic
11d0: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ally allocated s
11e0: 74 72 69 6e 67 20 77 68 65 72 65 20 73 6f 6d 65  tring where some
11f0: 20 6f 74 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a   other entity.**
1200: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1210: 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67  for deallocating
1220: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 20 20 42   that string.  B
1230: 65 63 61 75 73 65 20 74 68 65 20 72 65 67 69 73  ecause the regis
1240: 74 65 72 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ter.** does not 
1250: 63 6f 6e 74 72 6f 6c 20 74 68 65 20 73 74 72 69  control the stri
1260: 6e 67 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ng, it might be 
1270: 64 65 6c 65 74 65 64 20 77 69 74 68 6f 75 74 20  deleted without 
1280: 74 68 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  the register.** 
1290: 6b 6e 6f 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  knowing it..**.*
12a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12b0: 6f 6e 76 65 72 74 73 20 61 6e 20 65 70 68 65 6d  onverts an ephem
12c0: 65 72 61 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f  eral string into
12d0: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
12e0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73 74 72 69  llocated.** stri
12f0: 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 67 69  ng that the regi
1300: 73 74 65 72 20 69 74 73 65 6c 66 20 63 6f 6e 74  ster itself cont
1310: 72 6f 6c 73 2e 20 20 49 6e 20 6f 74 68 65 72 20  rols.  In other 
1320: 77 6f 72 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e  words, it.** con
1330: 76 65 72 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68  verts an MEM_Eph
1340: 65 6d 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61  em string into a
1350: 6e 20 4d 45 4d 5f 44 79 6e 20 73 74 72 69 6e 67  n MEM_Dyn string
1360: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 65 65  ..*/.#define Dee
1370: 70 68 65 6d 65 72 61 6c 69 7a 65 28 50 29 20 5c  phemeralize(P) \
1380: 0a 20 20 20 69 66 28 20 28 28 50 29 2d 3e 66 6c  .   if( ((P)->fl
1390: 61 67 73 26 4d 45 4d 5f 45 70 68 65 6d 29 21 3d  ags&MEM_Ephem)!=
13a0: 30 20 5c 0a 20 20 20 20 20 20 20 26 26 20 73 71  0 \.       && sq
13b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65  lite3VdbeMemMake
13c0: 57 72 69 74 65 61 62 6c 65 28 50 29 20 29 7b 20  Writeable(P) ){ 
13d0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 7d 0a 0a 2f  goto no_mem;}../
13e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74 65  *.** Call sqlite
13f0: 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c  3VdbeMemExpandBl
1400: 6f 62 28 29 20 6f 6e 20 74 68 65 20 73 75 70 70  ob() on the supp
1410: 6c 69 65 64 20 76 61 6c 75 65 20 28 74 79 70 65  lied value (type
1420: 20 4d 65 6d 2a 29 0a 2a 2a 20 50 20 69 66 20 72   Mem*).** P if r
1430: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 23 64 65 66  equired..*/.#def
1440: 69 6e 65 20 45 78 70 61 6e 64 42 6c 6f 62 28 50  ine ExpandBlob(P
1450: 29 20 28 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d  ) (((P)->flags&M
1460: 45 4d 5f 5a 65 72 6f 29 3f 73 71 6c 69 74 65 33  EM_Zero)?sqlite3
1470: 56 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f  VdbeMemExpandBlo
1480: 62 28 50 29 3a 30 29 0a 0a 2f 2a 0a 2a 2a 20 41  b(P):0)../*.** A
1490: 72 67 75 6d 65 6e 74 20 70 4d 65 6d 20 70 6f 69  rgument pMem poi
14a0: 6e 74 73 20 61 74 20 61 20 72 65 67 69 73 74 65  nts at a registe
14b0: 72 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 70  r that will be p
14c0: 61 73 73 65 64 20 74 6f 20 61 0a 2a 2a 20 75 73  assed to a.** us
14d0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
14e0: 69 6f 6e 20 6f 72 20 72 65 74 75 72 6e 65 64 20  ion or returned 
14f0: 74 6f 20 74 68 65 20 75 73 65 72 20 61 73 20 74  to the user as t
1500: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 71  he result of a q
1510: 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
1520: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 27 64  ond argument, 'd
1530: 62 5f 65 6e 63 27 20 69 73 20 74 68 65 20 74 65  b_enc' is the te
1540: 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64  xt encoding used
1550: 20 62 79 20 74 68 65 20 76 64 62 65 20 66 6f 72   by the vdbe for
1560: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 76 61 72  .** register var
1570: 69 61 62 6c 65 73 2e 20 20 54 68 69 73 20 72 6f  iables.  This ro
1580: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70  utine sets the p
1590: 4d 65 6d 2d 3e 65 6e 63 20 61 6e 64 20 70 4d 65  Mem->enc and pMe
15a0: 6d 2d 3e 74 79 70 65 0a 2a 2a 20 76 61 72 69 61  m->type.** varia
15b0: 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68 65  bles used by the
15c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2a   sqlite3_value_*
15d0: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a  () routines..*/.
15e0: 23 64 65 66 69 6e 65 20 73 74 6f 72 65 54 79 70  #define storeTyp
15f0: 65 49 6e 66 6f 28 41 2c 42 29 20 5f 73 74 6f 72  eInfo(A,B) _stor
1600: 65 54 79 70 65 49 6e 66 6f 28 41 29 0a 73 74 61  eTypeInfo(A).sta
1610: 74 69 63 20 76 6f 69 64 20 5f 73 74 6f 72 65 54  tic void _storeT
1620: 79 70 65 49 6e 66 6f 28 4d 65 6d 20 2a 70 4d 65  ypeInfo(Mem *pMe
1630: 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  m){.  int flags 
1640: 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
1650: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
1660: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4d 65  _Null ){.    pMe
1670: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
1680: 5f 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 65 6c 73  _NULL;.  }.  els
1690: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45  e if( flags & ME
16a0: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70 4d 65  M_Int ){.    pMe
16b0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
16c0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 20 20  _INTEGER;.  }.  
16d0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
16e0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
16f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
1700: 4c 49 54 45 5f 46 4c 4f 41 54 3b 0a 20 20 7d 0a  LITE_FLOAT;.  }.
1710: 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73    else if( flags
1720: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1730: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
1740: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 7d 65  QLITE_TEXT;.  }e
1750: 6c 73 65 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  lse{.    pMem->t
1760: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 42 4c 4f  ype = SQLITE_BLO
1770: 42 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  B;.  }.}../*.** 
1780: 50 72 6f 70 65 72 74 69 65 73 20 6f 66 20 6f 70  Properties of op
1790: 63 6f 64 65 73 2e 20 20 54 68 65 20 4f 50 46 4c  codes.  The OPFL
17a0: 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 6d 61  G_INITIALIZER ma
17b0: 63 72 6f 20 69 73 0a 2a 2a 20 63 72 65 61 74 65  cro is.** create
17c0: 64 20 62 79 20 6d 6b 6f 70 63 6f 64 65 68 2e 61  d by mkopcodeh.a
17d0: 77 6b 20 64 75 72 69 6e 67 20 63 6f 6d 70 69 6c  wk during compil
17e0: 61 74 69 6f 6e 2e 20 20 44 61 74 61 20 69 73 20  ation.  Data is 
17f0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
1800: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   the comments fo
1810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 63 61 73  llowing the "cas
1820: 65 20 4f 50 5f 78 78 78 78 3a 22 20 73 74 61 74  e OP_xxxx:" stat
1830: 65 6d 65 6e 74 73 20 69 6e 0a 2a 2a 20 74 68 69  ements in.** thi
1840: 73 20 66 69 6c 65 2e 20 20 0a 2a 2f 0a 73 74 61  s file.  .*/.sta
1850: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1860: 65 64 20 63 68 61 72 20 6f 70 63 6f 64 65 50 72  ed char opcodePr
1870: 6f 70 65 72 74 79 5b 5d 20 3d 20 4f 50 46 4c 47  operty[] = OPFLG
1880: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 0a 2f  _INITIALIZER;../
1890: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
18a0: 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 68 61   if an opcode ha
18b0: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 4f 50 46  s any of the OPF
18c0: 4c 47 5f 78 78 78 20 70 72 6f 70 65 72 74 69 65  LG_xxx propertie
18d0: 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
18e0: 79 20 6d 61 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  y mask..*/.int s
18f0: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1900: 48 61 73 50 72 6f 70 65 72 74 79 28 69 6e 74 20  HasProperty(int 
1910: 6f 70 63 6f 64 65 2c 20 69 6e 74 20 6d 61 73 6b  opcode, int mask
1920: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 63  ){.  assert( opc
1930: 6f 64 65 3e 30 20 26 26 20 6f 70 63 6f 64 65 3c  ode>0 && opcode<
1940: 28 69 6e 74 29 73 69 7a 65 6f 66 28 6f 70 63 6f  (int)sizeof(opco
1950: 64 65 50 72 6f 70 65 72 74 79 29 20 29 3b 0a 20  deProperty) );. 
1960: 20 72 65 74 75 72 6e 20 28 6f 70 63 6f 64 65 50   return (opcodeP
1970: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 26  roperty[opcode]&
1980: 6d 61 73 6b 29 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  mask)!=0;.}../*.
1990: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 56 64 62 65  ** Allocate Vdbe
19a0: 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69 43  Cursor number iC
19b0: 75 72 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ur.  Return a po
19c0: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 52 65  inter to it.  Re
19d0: 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
19e0: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
19f0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
1a00: 56 64 62 65 43 75 72 73 6f 72 20 2a 61 6c 6c 6f  VdbeCursor *allo
1a10: 63 61 74 65 43 75 72 73 6f 72 28 0a 20 20 56 64  cateCursor(.  Vd
1a20: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1a30: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1a40: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
1a50: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
1a60: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1a70: 66 20 74 68 65 20 6e 65 77 20 56 64 62 65 43 75  f the new VdbeCu
1a80: 72 73 6f 72 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f  rsor */.  Op *pO
1a90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1aa0: 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  /* */.  int iDb,
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac0: 20 57 68 65 6e 20 64 61 74 61 62 61 73 65 20 74   When database t
1ad0: 68 65 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  he cursor belong
1ae0: 73 20 74 6f 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20  s to, or -1 */. 
1af0: 20 69 6e 74 20 69 73 42 74 72 65 65 43 75 72 73   int isBtreeCurs
1b00: 6f 72 20 20 20 20 20 2f 2a 20 2a 2f 0a 29 7b 0a  or     /* */.){.
1b10: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6d 65    /* Find the me
1b20: 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 77  mory cell that w
1b30: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
1b40: 74 6f 72 65 20 74 68 65 20 62 6c 6f 62 20 6f 66  tore the blob of
1b50: 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71   memory.  ** req
1b60: 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 56  uired for this V
1b70: 64 62 65 43 75 72 73 6f 72 20 73 74 72 75 63 74  dbeCursor struct
1b80: 75 72 65 2e 20 49 74 20 69 73 20 63 6f 6e 76 65  ure. It is conve
1b90: 6e 69 65 6e 74 20 74 6f 20 75 73 65 20 61 20 0a  nient to use a .
1ba0: 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d 6f 72 79    ** vdbe memory
1bb0: 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61 67 65 20   cell to manage 
1bc0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
1bd0: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  ation required f
1be0: 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62 65 43 75  or a.  ** VdbeCu
1bf0: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 66  rsor structure f
1c00: 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
1c10: 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a 2a 0a 20   reasons:.  **. 
1c20: 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74 69 6d 65   **   * Sometime
1c30: 73 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  s cursor numbers
1c40: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 61 20   are used for a 
1c50: 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
1c60: 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20 70 75 72  ent.  **     pur
1c70: 70 6f 73 65 73 20 69 6e 20 61 20 76 64 62 65 20  poses in a vdbe 
1c80: 70 72 6f 67 72 61 6d 2e 20 54 68 65 20 64 69 66  program. The dif
1c90: 66 65 72 65 6e 74 20 75 73 65 73 20 6d 69 67 68  ferent uses migh
1ca0: 74 20 72 65 71 75 69 72 65 0a 20 20 2a 2a 20 20  t require.  **  
1cb0: 20 20 20 64 69 66 66 65 72 65 6e 74 20 73 69 7a     different siz
1cc0: 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ed allocations. 
1cd0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 70 72 6f  Memory cells pro
1ce0: 76 69 64 65 20 67 72 6f 77 61 62 6c 65 0a 20 20  vide growable.  
1cf0: 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61 74 69 6f  **     allocatio
1d00: 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ns..  **.  **   
1d10: 2a 20 57 68 65 6e 20 75 73 69 6e 67 20 45 4e 41  * When using ENA
1d20: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1d30: 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79 20 63 65  EMENT, memory ce
1d40: 6c 6c 20 62 75 66 66 65 72 73 20 63 61 6e 0a 20  ll buffers can. 
1d50: 20 2a 2a 20 20 20 20 20 62 65 20 66 72 65 65 64   **     be freed
1d60: 20 6c 61 7a 69 6c 79 20 76 69 61 20 74 68 65 20   lazily via the 
1d70: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
1d80: 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e 20 54 68  memory() API. Th
1d90: 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d 69 6e 69  is.  **     mini
1da0: 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d 62 65 72  mizes the number
1db0: 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61 6c 6c 73   of malloc calls
1dc0: 20 6d 61 64 65 20 62 79 20 74 68 65 20 73 79 73   made by the sys
1dd0: 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  tem..  **.  ** M
1de0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1df0: 63 75 72 73 6f 72 73 20 61 72 65 20 61 6c 6c 6f  cursors are allo
1e00: 63 61 74 65 64 20 61 74 20 74 68 65 20 74 6f 70  cated at the top
1e10: 20 6f 66 20 74 68 65 20 61 64 64 72 65 73 73 0a   of the address.
1e20: 20 20 2a 2a 20 73 70 61 63 65 2e 20 4d 65 6d 6f    ** space. Memo
1e30: 72 79 20 63 65 6c 6c 20 28 70 2d 3e 6e 4d 65 6d  ry cell (p->nMem
1e40: 29 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  ) corresponds to
1e50: 20 63 75 72 73 6f 72 20 30 2e 20 53 70 61 63 65   cursor 0. Space
1e60: 20 66 6f 72 0a 20 20 2a 2a 20 63 75 72 73 6f 72   for.  ** cursor
1e70: 20 31 20 69 73 20 6d 61 6e 61 67 65 64 20 62 79   1 is managed by
1e80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 70 2d   memory cell (p-
1e90: 3e 6e 4d 65 6d 2d 31 29 2c 20 65 74 63 2e 0a 20  >nMem-1), etc.. 
1ea0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
1eb0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 2d 3e 6e 4d  = &p->aMem[p->nM
1ec0: 65 6d 2d 69 43 75 72 5d 3b 0a 0a 20 20 69 6e 74  em-iCur];..  int
1ed0: 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43 75   nByte;.  VdbeCu
1ee0: 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a 20  rsor *pCx = 0;. 
1ef0: 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64   /* If the opcod
1f00: 65 20 6f 66 20 70 4f 70 20 69 73 20 4f 50 5f 53  e of pOp is OP_S
1f10: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 68  etNumColumns, th
1f20: 65 6e 20 70 4f 70 2d 3e 70 32 20 63 6f 6e 74 61  en pOp->p2 conta
1f30: 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d  ins.  ** the num
1f40: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1f50: 20 74 68 65 20 72 65 63 6f 72 64 73 20 63 6f 6e   the records con
1f60: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61  tained in the ta
1f70: 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
1f80: 78 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20  x being opened. 
1f90: 55 73 65 20 74 68 69 73 20 74 6f 20 72 65 73 65  Use this to rese
1fa0: 72 76 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  rve space for th
1fb0: 65 20 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  e .  ** VdbeCurs
1fc0: 6f 72 2e 61 54 79 70 65 5b 5d 20 61 72 72 61 79  or.aType[] array
1fd0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ..  */.  int nFi
1fe0: 65 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  eld = 0;.  if( p
1ff0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2000: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 20 7c 7c 20  etNumColumns || 
2010: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2020: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 29 7b  OpenEphemeral ){
2030: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  .    nField = pO
2040: 70 2d 3e 70 32 3b 0a 20 20 7d 0a 20 20 6e 42 79  p->p2;.  }.  nBy
2050: 74 65 20 3d 20 0a 20 20 20 20 20 20 73 69 7a 65  te = .      size
2060: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 20 2b  of(VdbeCursor) +
2070: 20 0a 20 20 20 20 20 20 28 69 73 42 74 72 65 65   .      (isBtree
2080: 43 75 72 73 6f 72 3f 73 71 6c 69 74 65 33 42 74  Cursor?sqlite3Bt
2090: 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a  reeCursorSize():
20a0: 30 29 20 2b 20 0a 20 20 20 20 20 20 32 2a 6e 46  0) + .      2*nF
20b0: 69 65 6c 64 2a 73 69 7a 65 6f 66 28 75 33 32 29  ield*sizeof(u32)
20c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
20d0: 72 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  r<p->nCursor );.
20e0: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 5b 69    if( p->apCsr[i
20f0: 43 75 72 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  Cur] ){.    sqli
2100: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
2110: 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69 43  r(p, p->apCsr[iC
2120: 75 72 5d 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  ur]);.    p->apC
2130: 73 72 5b 69 43 75 72 5d 20 3d 20 30 3b 0a 20 20  sr[iCur] = 0;.  
2140: 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
2150: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
2160: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 6e 42 79 74  mGrow(pMem, nByt
2170: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e  e, 0) ){.    p->
2180: 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20 70 43  apCsr[iCur] = pC
2190: 78 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 2a  x = (VdbeCursor*
21a0: 29 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65  )pMem->z;.    me
21b0: 6d 73 65 74 28 70 4d 65 6d 2d 3e 7a 2c 20 30 2c  mset(pMem->z, 0,
21c0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 43 78   nByte);.    pCx
21d0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
21e0: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
21f0: 46 69 65 6c 64 3b 0a 20 20 20 20 69 66 28 20 6e  Field;.    if( n
2200: 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Field ){.      p
2210: 43 78 2d 3e 61 54 79 70 65 20 3d 20 28 75 33 32  Cx->aType = (u32
2220: 20 2a 29 26 70 4d 65 6d 2d 3e 7a 5b 73 69 7a 65   *)&pMem->z[size
2230: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 29 5d 3b  of(VdbeCursor)];
2240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2250: 73 42 74 72 65 65 43 75 72 73 6f 72 20 29 7b 0a  sBtreeCursor ){.
2260: 20 20 20 20 20 20 70 43 78 2d 3e 70 43 75 72 73        pCx->pCurs
2270: 6f 72 20 3d 20 28 42 74 43 75 72 73 6f 72 2a 29  or = (BtCursor*)
2280: 0a 20 20 20 20 20 20 20 20 20 20 26 70 4d 65 6d  .          &pMem
2290: 2d 3e 7a 5b 73 69 7a 65 6f 66 28 56 64 62 65 43  ->z[sizeof(VdbeC
22a0: 75 72 73 6f 72 29 2b 32 2a 6e 46 69 65 6c 64 2a  ursor)+2*nField*
22b0: 73 69 7a 65 6f 66 28 75 33 32 29 5d 3b 0a 20 20  sizeof(u32)];.  
22c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22d0: 20 70 43 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   pCx;.}../*.** T
22e0: 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20  ry to convert a 
22f0: 76 61 6c 75 65 20 69 6e 74 6f 20 61 20 6e 75 6d  value into a num
2300: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2310: 69 6f 6e 20 69 66 20 77 65 20 63 61 6e 0a 2a 2a  ion if we can.**
2320: 20 64 6f 20 73 6f 20 77 69 74 68 6f 75 74 20 6c   do so without l
2330: 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69  oss of informati
2340: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
2350: 72 64 73 2c 20 69 66 20 74 68 65 20 73 74 72 69  rds, if the stri
2360: 6e 67 0a 2a 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65  ng.** looks like
2370: 20 61 20 6e 75 6d 62 65 72 2c 20 63 6f 6e 76 65   a number, conve
2380: 72 74 20 69 74 20 69 6e 74 6f 20 61 20 6e 75 6d  rt it into a num
2390: 62 65 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73  ber.  If it does
23a0: 20 6e 6f 74 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b   not.** look lik
23b0: 65 20 61 20 6e 75 6d 62 65 72 2c 20 6c 65 61 76  e a number, leav
23c0: 65 20 69 74 20 61 6c 6f 6e 65 2e 0a 2a 2f 0a 73  e it alone..*/.s
23d0: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
23e0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
23f0: 4d 65 6d 20 2a 70 52 65 63 29 7b 0a 20 20 69 66  Mem *pRec){.  if
2400: 28 20 28 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  ( (pRec->flags &
2410: 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49   (MEM_Real|MEM_I
2420: 6e 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nt))==0 ){.    i
2430: 6e 74 20 72 65 61 6c 6e 75 6d 3b 0a 20 20 20 20  nt realnum;.    
2440: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
2450: 6c 54 65 72 6d 69 6e 61 74 65 28 70 52 65 63 29  lTerminate(pRec)
2460: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
2470: 3e 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 0a  >flags&MEM_Str).
2480: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
2490: 74 65 33 49 73 4e 75 6d 62 65 72 28 70 52 65 63  te3IsNumber(pRec
24a0: 2d 3e 7a 2c 20 26 72 65 61 6c 6e 75 6d 2c 20 70  ->z, &realnum, p
24b0: 52 65 63 2d 3e 65 6e 63 29 20 29 7b 0a 20 20 20  Rec->enc) ){.   
24c0: 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
24d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
24e0: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 52  hangeEncoding(pR
24f0: 65 63 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ec, SQLITE_UTF8)
2500: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61  ;.      if( !rea
2510: 6c 6e 75 6d 20 26 26 20 73 71 6c 69 74 65 33 41  lnum && sqlite3A
2520: 74 6f 69 36 34 28 70 52 65 63 2d 3e 7a 2c 20 26  toi64(pRec->z, &
2530: 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  value) ){.      
2540: 20 20 70 52 65 63 2d 3e 75 2e 69 20 3d 20 76 61    pRec->u.i = va
2550: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  lue;.        Mem
2560: 53 65 74 54 79 70 65 46 6c 61 67 28 70 52 65 63  SetTypeFlag(pRec
2570: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20  , MEM_Int);.    
2580: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2590: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
25a0: 65 61 6c 69 66 79 28 70 52 65 63 29 3b 0a 20 20  ealify(pRec);.  
25b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
25d0: 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ing is determine
25e0: 20 62 79 20 74 68 65 20 61 66 66 69 6e 69 74 79   by the affinity
25f0: 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a 0a 2a   parameter:.**.*
2600: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
2610: 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54 45 5f  EGER:.** SQLITE_
2620: 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53 51 4c  AFF_REAL:.** SQL
2630: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a  ITE_AFF_NUMERIC:
2640: 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20 63 6f  .**    Try to co
2650: 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 6e  nvert pRec to an
2660: 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
2670: 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a 2a 2a  ntation or a .**
2680: 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69      floating-poi
2690: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
26a0: 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65 72 20  n if an integer 
26b0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
26c0: 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f 73 73  *    is not poss
26d0: 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  ible.  Note that
26e0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 65 70   the integer rep
26f0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 0a 2a  resentation is.*
2700: 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72 65 66  *    always pref
2710: 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66 20 74  erred, even if t
2720: 68 65 20 61 66 66 69 6e 69 74 79 20 69 73 20 52  he affinity is R
2730: 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a 2a 20  EAL, because.** 
2740: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65     an integer re
2750: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
2760: 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66 69 63  more space effic
2770: 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ient on disk..**
2780: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  .** SQLITE_AFF_T
2790: 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e 76 65  EXT:.**    Conve
27a0: 72 74 20 70 52 65 63 20 74 6f 20 61 20 74 65 78  rt pRec to a tex
27b0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
27c0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  ..**.** SQLITE_A
27d0: 46 46 5f 4e 4f 4e 45 3a 0a 2a 2a 20 20 20 20 4e  FF_NONE:.**    N
27e0: 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73 20 75  o-op.  pRec is u
27f0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
2800: 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79 41 66  tic void applyAf
2810: 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20 2a 70  finity(.  Mem *p
2820: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Rec,          /*
2830: 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20 61 70   The value to ap
2840: 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74 6f 20  ply affinity to 
2850: 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
2860: 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ty,      /* The 
2870: 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61  affinity to be a
2880: 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38 20 65  pplied */.  u8 e
2890: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
28a0: 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65 78 74  /* Use this text
28b0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29 7b 0a   encoding */.){.
28c0: 20 20 69 66 28 20 61 66 66 69 6e 69 74 79 3d 3d    if( affinity==
28d0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
28e0: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61  ){.    /* Only a
28f0: 74 74 65 6d 70 74 20 74 68 65 20 63 6f 6e 76 65  ttempt the conve
2900: 72 73 69 6f 6e 20 74 6f 20 54 45 58 54 20 69 66  rsion to TEXT if
2910: 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 74   there is an int
2920: 65 67 65 72 20 6f 72 20 72 65 61 6c 0a 20 20 20  eger or real.   
2930: 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69   ** representati
2940: 6f 6e 20 28 62 6c 6f 62 20 61 6e 64 20 4e 55 4c  on (blob and NUL
2950: 4c 20 64 6f 20 6e 6f 74 20 67 65 74 20 63 6f 6e  L do not get con
2960: 76 65 72 74 65 64 29 20 62 75 74 20 6e 6f 20 73  verted) but no s
2970: 74 72 69 6e 67 0a 20 20 20 20 2a 2a 20 72 65 70  tring.    ** rep
2980: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  resentation..   
2990: 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   */.    if( 0==(
29a0: 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pRec->flags&MEM_
29b0: 53 74 72 29 20 26 26 20 28 70 52 65 63 2d 3e 66  Str) && (pRec->f
29c0: 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61 6c 7c 4d  lags&(MEM_Real|M
29d0: 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20 20 20 20  EM_Int)) ){.    
29e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
29f0: 53 74 72 69 6e 67 69 66 79 28 70 52 65 63 2c 20  Stringify(pRec, 
2a00: 65 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  enc);.    }.    
2a10: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2a20: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2a30: 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
2a40: 61 66 66 69 6e 69 74 79 21 3d 53 51 4c 49 54 45  affinity!=SQLITE
2a50: 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
2a60: 20 61 73 73 65 72 74 28 20 61 66 66 69 6e 69 74   assert( affinit
2a70: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  y==SQLITE_AFF_IN
2a80: 54 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74  TEGER || affinit
2a90: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
2aa0: 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
2ab0: 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  || affinity==SQL
2ac0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
2ad0: 29 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d 65  );.    applyNume
2ae0: 72 69 63 41 66 66 69 6e 69 74 79 28 70 52 65 63  ricAffinity(pRec
2af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d  );.    if( pRec-
2b00: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
2b10: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
2b20: 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66  e3VdbeIntegerAff
2b30: 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20 20  inity(pRec);.   
2b40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2b50: 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 74  Try to convert t
2b60: 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75 6e  he type of a fun
2b70: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 6f  ction argument o
2b80: 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  r a result colum
2b90: 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d 65  n.** into a nume
2ba0: 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74 69  ric representati
2bb0: 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72 20  on.  Use either 
2bc0: 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c 20  INTEGER or REAL 
2bd0: 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73 20  whichever.** is 
2be0: 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42 75  appropriate.  Bu
2bf0: 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63 6f  t only do the co
2c00: 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20 69  nversion if it i
2c10: 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 6f  s possible witho
2c20: 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69 6e  ut.** loss of in
2c30: 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72 65  formation and re
2c40: 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65 64  turn the revised
2c50: 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72 67   type of the arg
2c60: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
2c70: 73 20 69 73 20 61 6e 20 45 58 50 45 52 49 4d 45  s is an EXPERIME
2c80: 4e 54 41 4c 20 61 70 69 20 61 6e 64 20 69 73 20  NTAL api and is 
2c90: 73 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67  subject to chang
2ca0: 65 20 6f 72 20 72 65 6d 6f 76 61 6c 2e 0a 2a 2f  e or removal..*/
2cb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c  .int sqlite3_val
2cc0: 75 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28  ue_numeric_type(
2cd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2ce0: 56 61 6c 29 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65  Val){.  Mem *pMe
2cf0: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2d00: 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
2d10: 66 69 6e 69 74 79 28 70 4d 65 6d 29 3b 0a 20 20  finity(pMem);.  
2d20: 73 74 6f 72 65 54 79 70 65 49 6e 66 6f 28 70 4d  storeTypeInfo(pM
2d30: 65 6d 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  em, 0);.  return
2d40: 20 70 4d 65 6d 2d 3e 74 79 70 65 3b 0a 7d 0a 0a   pMem->type;.}..
2d50: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2d60: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2d70: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2d80: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2d90: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2da0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
2db0: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
2dc0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
2dd0: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
2de0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2df0: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
2e00: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
2e10: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
2e20: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
2e30: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
2e40: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2e50: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 57 72  E_DEBUG./*.** Wr
2e60: 69 74 65 20 61 20 6e 69 63 65 20 73 74 72 69 6e  ite a nice strin
2e70: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2e80: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   of the contents
2e90: 20 6f 66 20 63 65 6c 6c 20 70 4d 65 6d 0a 2a 2a   of cell pMem.**
2ea0: 20 69 6e 74 6f 20 62 75 66 66 65 72 20 7a 42 75   into buffer zBu
2eb0: 66 2c 20 6c 65 6e 67 74 68 20 6e 42 75 66 2e 0a  f, length nBuf..
2ec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2ed0: 64 62 65 4d 65 6d 50 72 65 74 74 79 50 72 69 6e  dbeMemPrettyPrin
2ee0: 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 63 68 61  t(Mem *pMem, cha
2ef0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63 68 61 72  r *zBuf){.  char
2f00: 20 2a 7a 43 73 72 20 3d 20 7a 42 75 66 3b 0a 20   *zCsr = zBuf;. 
2f10: 20 69 6e 74 20 66 20 3d 20 70 4d 65 6d 2d 3e 66   int f = pMem->f
2f20: 6c 61 67 73 3b 0a 0a 20 20 73 74 61 74 69 63 20  lags;..  static 
2f30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
2f40: 74 20 65 6e 63 6e 61 6d 65 73 5b 5d 20 3d 20 7b  t encnames[] = {
2f50: 22 28 58 29 22 2c 20 22 28 38 29 22 2c 20 22 28  "(X)", "(8)", "(
2f60: 31 36 4c 45 29 22 2c 20 22 28 31 36 42 45 29 22  16LE)", "(16BE)"
2f70: 7d 3b 0a 0a 20 20 69 66 28 20 66 26 4d 45 4d 5f  };..  if( f&MEM_
2f80: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 69 6e 74 20  Blob ){.    int 
2f90: 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  i;.    char c;. 
2fa0: 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 44     if( f & MEM_D
2fb0: 79 6e 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  yn ){.      c = 
2fc0: 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'z';.      asser
2fd0: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
2fe0: 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d  tic|MEM_Ephem))=
2ff0: 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  =0 );.    }else 
3000: 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74  if( f & MEM_Stat
3010: 69 63 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  ic ){.      c = 
3020: 27 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  't';.      asser
3030: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e  t( (f & (MEM_Dyn
3040: 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20  |MEM_Ephem))==0 
3050: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
3060: 20 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29   f & MEM_Ephem )
3070: 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 65 27 3b  {.      c = 'e';
3080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3090: 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c  f & (MEM_Static|
30a0: 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a  MEM_Dyn))==0 );.
30b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30c0: 20 63 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a   c = 's';.    }.
30d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
30e0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c  rintf(100, zCsr,
30f0: 20 22 25 63 22 2c 20 63 29 3b 0a 20 20 20 20 7a   "%c", c);.    z
3100: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
3110: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
3120: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3130: 74 66 28 31 30 30 2c 20 7a 43 73 72 2c 20 22 25  tf(100, zCsr, "%
3140: 64 5b 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  d[", pMem->n);. 
3150: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
3160: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
3170: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3180: 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e  <16 && i<pMem->n
3190: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      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 20 22 25 30 32 58 22  00, zCsr, "%02X"
31c0: 2c 20 28 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b  , ((int)pMem->z[
31d0: 69 5d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 20  i] & 0xFF));.   
31e0: 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74     zCsr += sqlit
31f0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29  e3Strlen30(zCsr)
3200: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
3210: 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69 3c 70  i=0; i<16 && i<p
3220: 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Mem->n; i++){.  
3230: 20 20 20 20 63 68 61 72 20 7a 20 3d 20 70 4d 65      char z = pMe
3240: 6d 2d 3e 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69  m->z[i];.      i
3250: 66 28 20 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36  f( z<32 || z>126
3260: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27   ) *zCsr++ = '.'
3270: 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 2a 7a 43  ;.      else *zC
3280: 73 72 2b 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a  sr++ = z;.    }.
3290: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
32a0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72 2c  rintf(100, zCsr,
32b0: 20 22 5d 25 73 22 2c 20 65 6e 63 6e 61 6d 65 73   "]%s", encnames
32c0: 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20  [pMem->enc]);.  
32d0: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
32e0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b  3Strlen30(zCsr);
32f0: 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45 4d  .    if( f & MEM
3300: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 73  _Zero ){.      s
3310: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3320: 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22  100, zCsr,"+%dz"
3330: 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b  ,pMem->u.nZero);
3340: 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  .      zCsr += s
3350: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3360: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Csr);.    }.    
3370: 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20  *zCsr = '\0';.  
3380: 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45  }else if( f & ME
3390: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e 74  M_Str ){.    int
33a0: 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b   j, k;.    zBuf[
33b0: 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66  0] = ' ';.    if
33c0: 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b  ( f & MEM_Dyn ){
33d0: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
33e0: 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'z';.      asse
33f0: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
3400: 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  atic|MEM_Ephem))
3410: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3420: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74 61   if( f & MEM_Sta
3430: 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42 75  tic ){.      zBu
3440: 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20  f[1] = 't';.    
3450: 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28    assert( (f & (
3460: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65  MEM_Dyn|MEM_Ephe
3470: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
3480: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
3490: 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a  Ephem ){.      z
34a0: 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20  Buf[1] = 'e';.  
34b0: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
34c0: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
34d0: 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20  _Dyn))==0 );.   
34e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42   }else{.      zB
34f0: 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20  uf[1] = 's';.   
3500: 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20   }.    k = 2;.  
3510: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3520: 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d  tf(100, &zBuf[k]
3530: 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29  , "%d", pMem->n)
3540: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
3550: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66  e3Strlen30(&zBuf
3560: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b  [k]);.    zBuf[k
3570: 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66  ++] = '[';.    f
3580: 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20  or(j=0; j<15 && 
3590: 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b  j<pMem->n; j++){
35a0: 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20 70 4d  .      u8 c = pM
35b0: 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20  em->z[j];.      
35c0: 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20 63  if( c>=0x20 && c
35d0: 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20 20  <0x7f ){.       
35e0: 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a   zBuf[k++] = c;.
35f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3600: 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d       zBuf[k++] =
3610: 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   '.';.      }.  
3620: 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b    }.    zBuf[k++
3630: 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c  ] = ']';.    sql
3640: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3650: 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e  0,&zBuf[k], encn
3660: 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29  ames[pMem->enc])
3670: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
3680: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75 66  e3Strlen30(&zBuf
3690: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b  [k]);.    zBuf[k
36a0: 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ++] = 0;.  }.}.#
36b0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
36c0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
36d0: 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75 65   Print the value
36e0: 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20 66   of a register f
36f0: 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72 70 6f  or tracing purpo
3700: 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ses:.*/.static v
3710: 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69 6e  oid memTracePrin
3720: 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 4d 65 6d  t(FILE *out, Mem
3730: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66   *p){.  if( p->f
3740: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
3750: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
3760: 75 74 2c 20 22 20 4e 55 4c 4c 22 29 3b 0a 20 20  ut, " NULL");.  
3770: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 66 6c  }else if( (p->fl
3780: 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d  ags & (MEM_Int|M
3790: 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d 5f 49  EM_Str))==(MEM_I
37a0: 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b 0a 20  nt|MEM_Str) ){. 
37b0: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
37c0: 22 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75  " si:%lld", p->u
37d0: 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  .i);.  }else if(
37e0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
37f0: 49 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  Int ){.    fprin
3800: 74 66 28 6f 75 74 2c 20 22 20 69 3a 25 6c 6c 64  tf(out, " i:%lld
3810: 22 2c 20 70 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65  ", p->u.i);.  }e
3820: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3830: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
3840: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
3850: 22 20 72 3a 25 67 22 2c 20 70 2d 3e 72 29 3b 0a  " r:%g", p->r);.
3860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
3870: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
3880: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50   sqlite3VdbeMemP
3890: 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a 42  rettyPrint(p, zB
38a0: 75 66 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  uf);.    fprintf
38b0: 28 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20  (out, " ");.    
38c0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
38d0: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a  ", zBuf);.  }.}.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 69  static void regi
38f0: 73 74 65 72 54 72 61 63 65 28 46 49 4c 45 20 2a  sterTrace(FILE *
3900: 6f 75 74 2c 20 69 6e 74 20 69 52 65 67 2c 20 4d  out, int iReg, M
3910: 65 6d 20 2a 70 29 7b 0a 20 20 66 70 72 69 6e 74  em *p){.  fprint
3920: 66 28 6f 75 74 2c 20 22 52 45 47 5b 25 64 5d 20  f(out, "REG[%d] 
3930: 3d 20 22 2c 20 69 52 65 67 29 3b 0a 20 20 6d 65  = ", iReg);.  me
3940: 6d 54 72 61 63 65 50 72 69 6e 74 28 6f 75 74 2c  mTracePrint(out,
3950: 20 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   p);.  fprintf(o
3960: 75 74 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e  ut, "\n");.}.#en
3970: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
3980: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
3990: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
39a0: 45 28 52 2c 4d 29 20 69 66 28 70 2d 3e 74 72 61  E(R,M) if(p->tra
39b0: 63 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65  ce)registerTrace
39c0: 28 70 2d 3e 74 72 61 63 65 2c 52 2c 4d 29 0a 23  (p->trace,R,M).#
39d0: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 52  else.#  define R
39e0: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52 2c  EGISTER_TRACE(R,
39f0: 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64  M).#endif...#ifd
3a00: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
3a10: 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d 65 2e 68  ./* .** hwtime.h
3a20: 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c 69 6e 65   contains inline
3a30: 20 61 73 73 65 6d 62 6c 65 72 20 63 6f 64 65 20   assembler code 
3a40: 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
3a50: 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72 66 6f 72   .** high-perfor
3a60: 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20 72 6f 75  mance timing rou
3a70: 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  tines..*/.#inclu
3a80: 64 65 20 22 68 77 74 69 6d 65 2e 68 22 0a 0a 23  de "hwtime.h"..#
3a90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
3aa0: 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52   CHECK_FOR_INTER
3ab0: 52 55 50 54 20 6d 61 63 72 6f 20 64 65 66 69 6e  RUPT macro defin
3ac0: 65 64 20 68 65 72 65 20 6c 6f 6f 6b 73 20 74 6f  ed here looks to
3ad0: 20 73 65 65 20 69 66 20 74 68 65 0a 2a 2a 20 73   see if the.** s
3ae0: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
3af0: 28 29 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  () routine has b
3b00: 65 65 6e 20 63 61 6c 6c 65 64 2e 20 20 49 66 20  een called.  If 
3b10: 69 74 20 68 61 73 20 62 65 65 6e 2c 20 74 68 65  it has been, the
3b20: 6e 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20  n.** processing 
3b30: 6f 66 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  of the VDBE prog
3b40: 72 61 6d 20 69 73 20 69 6e 74 65 72 72 75 70 74  ram is interrupt
3b50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ed..**.** This m
3b60: 61 63 72 6f 20 61 64 64 65 64 20 74 6f 20 65 76  acro added to ev
3b70: 65 72 79 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ery instruction 
3b80: 74 68 61 74 20 64 6f 65 73 20 61 20 6a 75 6d 70  that does a jump
3b90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
3ba0: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 6c 6f 6f 70  implement a loop
3bb0: 2e 20 20 54 68 69 73 20 74 65 73 74 20 75 73 65  .  This test use
3bc0: 64 20 74 6f 20 62 65 20 6f 6e 20 65 76 65 72 79  d to be on every
3bd0: 20 73 69 6e 67 6c 65 20 69 6e 73 74 72 75 63 74   single instruct
3be0: 69 6f 6e 2c 0a 2a 2a 20 62 75 74 20 74 68 61 74  ion,.** but that
3bf0: 20 6d 65 61 6e 74 20 77 65 20 6d 6f 72 65 20 74   meant we more t
3c00: 65 73 74 69 6e 67 20 74 68 61 74 20 77 65 20 6e  esting that we n
3c10: 65 65 64 65 64 2e 20 20 42 79 20 6f 6e 6c 79 20  eeded.  By only 
3c20: 74 65 73 74 69 6e 67 20 74 68 65 0a 2a 2a 20 66  testing the.** f
3c30: 6c 61 67 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  lag on jump inst
3c40: 72 75 63 74 69 6f 6e 73 2c 20 77 65 20 67 65 74  ructions, we get
3c50: 20 61 20 28 73 6d 61 6c 6c 29 20 73 70 65 65 64   a (small) speed
3c60: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2f   improvement..*/
3c70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 46  .#define CHECK_F
3c80: 4f 52 5f 49 4e 54 45 52 52 55 50 54 20 5c 0a 20  OR_INTERRUPT \. 
3c90: 20 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49    if( db->u1.isI
3ca0: 6e 74 65 72 72 75 70 74 65 64 20 29 20 67 6f 74  nterrupted ) got
3cb0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 69  o abort_due_to_i
3cc0: 6e 74 65 72 72 75 70 74 3b 0a 0a 23 69 66 64 65  nterrupt;..#ifde
3cd0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
3ce0: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 45 78  tatic int fileEx
3cf0: 69 73 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ists(sqlite3 *db
3d00: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
3d10: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  ile){.  int res 
3d20: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
3d30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 64 65  SQLITE_OK;.#ifde
3d40: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3d50: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 75 72  /* If we are cur
3d60: 72 65 6e 74 6c 79 20 74 65 73 74 69 6e 67 20 49  rently testing I
3d70: 4f 20 65 72 72 6f 72 73 2c 20 74 68 65 6e 20 64  O errors, then d
3d80: 6f 20 6e 6f 74 20 63 61 6c 6c 20 4f 73 41 63 63  o not call OsAcc
3d90: 65 73 73 28 29 20 74 6f 0a 20 20 2a 2a 20 74 65  ess() to.  ** te
3da0: 73 74 20 66 6f 72 20 74 68 65 20 70 72 65 73 65  st for the prese
3db0: 6e 63 65 20 6f 66 20 7a 46 69 6c 65 2e 20 54 68  nce of zFile. Th
3dc0: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
3dd0: 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 0a  y IO error that.
3de0: 20 20 2a 2a 20 6f 63 63 75 72 73 20 68 65 72 65    ** occurs here
3df0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 65 70   will not be rep
3e00: 6f 72 74 65 64 2c 20 63 61 75 73 69 6e 67 20 74  orted, causing t
3e10: 68 65 20 74 65 73 74 20 74 6f 20 66 61 69 6c 2e  he test to fail.
3e20: 0a 20 20 2a 2f 0a 20 20 65 78 74 65 72 6e 20 69  .  */.  extern i
3e30: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
3e40: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 69  ror_pending;.  i
3e50: 66 28 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  f( sqlite3_io_er
3e60: 72 6f 72 5f 70 65 6e 64 69 6e 67 3c 3d 30 20 29  ror_pending<=0 )
3e70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
3e80: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
3e90: 28 64 62 2d 3e 70 56 66 73 2c 20 7a 46 69 6c 65  (db->pVfs, zFile
3ea0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
3eb0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
3ec0: 20 72 65 74 75 72 6e 20 28 72 65 73 20 26 26 20   return (res && 
3ed0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  rc==SQLITE_OK);.
3ee0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
3ef0: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  f NDEBUG./*.** T
3f00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3f10: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
3f20: 20 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72   within an asser
3f30: 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  t() expression. 
3f40: 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61  It.** checks tha
3f50: 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54  t the sqlite3.nT
3f60: 72 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61  ransaction varia
3f70: 62 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79  ble is correctly
3f80: 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e   set to.** the n
3f90: 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61  umber of non-tra
3fa0: 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
3fb0: 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  nts currently in
3fc0: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
3fd0: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
3fe0: 20 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f   sqlite3.pSavepo
3ff0: 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67  int..** .** Usag
4000: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73  e:.**.**     ass
4010: 65 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f  ert( checkSavepo
4020: 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a  intCount(db) );.
4030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
4040: 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
4050: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
4060: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53    int n = 0;.  S
4070: 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66  avepoint *p;.  f
4080: 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f  or(p=db->pSavepo
4090: 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  int; p; p=p->pNe
40a0: 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72  xt) n++;.  asser
40b0: 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65  t( n==(db->nSave
40c0: 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72  point + db->isTr
40d0: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
40e0: 6e 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  nt) );.  return 
40f0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
4100: 2a 2a 20 45 78 65 63 75 74 65 20 61 73 20 6d 75  ** Execute as mu
4110: 63 68 20 6f 66 20 61 20 56 44 42 45 20 70 72 6f  ch of a VDBE pro
4120: 67 72 61 6d 20 61 73 20 77 65 20 63 61 6e 20 74  gram as we can t
4130: 68 65 6e 20 72 65 74 75 72 6e 2e 0a 2a 2a 0a 2a  hen return..**.*
4140: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  * sqlite3VdbeMak
4150: 65 52 65 61 64 79 28 29 20 6d 75 73 74 20 62 65  eReady() must be
4160: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 74   called before t
4170: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
4180: 72 64 65 72 20 74 6f 0a 2a 2a 20 63 6c 6f 73 65  rder to.** close
4190: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 69 74   the program wit
41a0: 68 20 61 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  h a final OP_Hal
41b0: 74 20 61 6e 64 20 74 6f 20 73 65 74 20 75 70 20  t and to set up 
41c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 0a 2a 2a  the callbacks.**
41d0: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d   and the error m
41e0: 65 73 73 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  essage pointer..
41f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 65 76 65 72 20 61  **.** Whenever a
4200: 20 72 6f 77 20 6f 72 20 72 65 73 75 6c 74 20 64   row or result d
4210: 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
4220: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  , this routine w
4230: 69 6c 6c 20 65 69 74 68 65 72 0a 2a 2a 20 69 6e  ill either.** in
4240: 76 6f 6b 65 20 74 68 65 20 72 65 73 75 6c 74 20  voke the result 
4250: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68 65  callback (if the
4260: 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 72 65  re is one) or re
4270: 74 75 72 6e 20 77 69 74 68 0a 2a 2a 20 53 51 4c  turn with.** SQL
4280: 49 54 45 5f 52 4f 57 2e 0a 2a 2a 0a 2a 2a 20 49  ITE_ROW..**.** I
4290: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
42a0: 6d 61 64 65 20 74 6f 20 6f 70 65 6e 20 61 20 6c  made to open a l
42b0: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 2c 20  ocked database, 
42c0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
42d0: 65 0a 2a 2a 20 77 69 6c 6c 20 65 69 74 68 65 72  e.** will either
42e0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
42f0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 74 68   callback (if th
4300: 65 72 65 20 69 73 20 6f 6e 65 29 20 6f 72 20 69  ere is one) or i
4310: 74 20 77 69 6c 6c 0a 2a 2a 20 72 65 74 75 72 6e  t will.** return
4320: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a   SQLITE_BUSY..**
4330: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
4340: 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
4350: 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
4360: 74 65 6e 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  ten to memory ob
4370: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
4380: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
4390: 61 6e 64 20 70 2d 3e 7a 45 72 72 4d 73 67 20 69  and p->zErrMsg i
43a0: 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  s made to point 
43b0: 74 6f 20 74 68 61 74 20 6d 65 6d 6f 72 79 2e 0a  to that memory..
43c0: 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 64  ** The error cod
43d0: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  e is stored in p
43e0: 2d 3e 72 63 20 61 6e 64 20 74 68 69 73 20 72 6f  ->rc and this ro
43f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
4400: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a  LITE_ERROR..**.*
4410: 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 62 61 63  * If the callbac
4420: 6b 20 65 76 65 72 20 72 65 74 75 72 6e 73 20 6e  k ever returns n
4430: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
4440: 65 20 70 72 6f 67 72 61 6d 20 65 78 69 74 73 0a  e program exits.
4450: 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ** immediately. 
4460: 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   There will be n
4470: 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  o error message 
4480: 62 75 74 20 74 68 65 20 70 2d 3e 72 63 20 66 69  but the p->rc fi
4490: 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  eld is.** set to
44a0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 61 6e   SQLITE_ABORT an
44b0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
44c0: 69 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ill return SQLIT
44d0: 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20 41  E_ERROR..**.** A
44e0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
44f0: 6f 6e 20 65 72 72 6f 72 20 63 61 75 73 65 73 20  on error causes 
4500: 70 2d 3e 72 63 20 74 6f 20 62 65 20 73 65 74 20  p->rc to be set 
4510: 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
4520: 61 6e 64 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  and this.** rout
4530: 69 6e 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ine to return SQ
4540: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a  LITE_ERROR..**.*
4550: 2a 20 4f 74 68 65 72 20 66 61 74 61 6c 20 65 72  * Other fatal er
4560: 72 6f 72 73 20 72 65 74 75 72 6e 20 53 51 4c 49  rors return SQLI
4570: 54 45 5f 45 52 52 4f 52 2e 0a 2a 2a 0a 2a 2a 20  TE_ERROR..**.** 
4580: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
4590: 6e 65 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c  ne has finished,
45a0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
45b0: 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65  lize() should be
45c0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 63 6c 65 61  .** used to clea
45d0: 6e 20 75 70 20 74 68 65 20 6d 65 73 73 20 74 68  n up the mess th
45e0: 61 74 20 77 61 73 20 6c 65 66 74 20 62 65 68 69  at was left behi
45f0: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
4600: 65 33 56 64 62 65 45 78 65 63 28 0a 20 20 56 64  e3VdbeExec(.  Vd
4610: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
4620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4630: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  VDBE */.){.  int
4640: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
4650: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
4660: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
4670: 2f 0a 20 20 4f 70 20 2a 70 4f 70 3b 20 20 20 20  /.  Op *pOp;    
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4690: 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72 61 74  * Current operat
46a0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
46b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
46c0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
46d0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
46e0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
46f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4700: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 65  tabase */.  u8 e
4710: 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43 28 64 62  ncoding = ENC(db
4720: 29 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  );     /* The da
4730: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
4740: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 31 20 3d  */.  Mem *pIn1 =
4750: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
4760: 2f 2a 20 31 73 74 20 69 6e 70 75 74 20 6f 70 65  /* 1st input ope
4770: 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rand */.  Mem *p
4780: 49 6e 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In2 = 0;        
4790: 20 20 20 20 20 2f 2a 20 32 6e 64 20 69 6e 70 75       /* 2nd inpu
47a0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
47b0: 65 6d 20 2a 70 49 6e 33 20 3d 20 30 3b 20 20 20  em *pIn3 = 0;   
47c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 72 64            /* 3rd
47d0: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
47e0: 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 20 3d 20  /.  Mem *pOut = 
47f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4800: 2a 20 4f 75 74 70 75 74 20 6f 70 65 72 61 6e 64  * Output operand
4810: 20 2a 2f 0a 20 20 75 38 20 6f 70 50 72 6f 70 65   */.  u8 opPrope
4820: 72 74 79 3b 0a 20 20 69 6e 74 20 69 43 6f 6d 70  rty;.  int iComp
4830: 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  are = 0;        
4840: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 6c    /* Result of l
4850: 61 73 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f  ast OP_Compare o
4860: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
4870: 74 20 2a 61 50 65 72 6d 75 74 65 20 3d 20 30 3b  t *aPermute = 0;
4880: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
4890: 75 61 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d 6e  uation of column
48a0: 73 20 66 6f 72 20 4f 50 5f 43 6f 6d 70 61 72 65  s for OP_Compare
48b0: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
48c0: 50 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73 74  PROFILE.  u64 st
48d0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
48e0: 20 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f 63       /* CPU cloc
48f0: 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72 74  k count at start
4900: 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20   of opcode */.  
4910: 69 6e 74 20 6f 72 69 67 50 63 3b 20 20 20 20 20  int origPc;     
4920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
4930: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 61 74  ogram counter at
4940: 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65   start of opcode
4950: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   */.#endif.#ifnd
4960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
4970: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
4980: 0a 20 20 69 6e 74 20 6e 50 72 6f 67 72 65 73 73  .  int nProgress
4990: 4f 70 73 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Ops = 0;      /*
49a0: 20 4f 70 63 6f 64 65 73 20 65 78 65 63 75 74 65   Opcodes execute
49b0: 64 20 73 69 6e 63 65 20 70 72 6f 67 72 65 73 73  d since progress
49c0: 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 23 65   callback. */.#e
49d0: 6e 64 69 66 0a 20 20 55 6e 70 61 63 6b 65 64 52  ndif.  UnpackedR
49e0: 65 63 6f 72 64 20 61 54 65 6d 70 52 65 63 5b 31  ecord aTempRec[1
49f0: 36 5d 3b 20 2f 2a 20 53 70 61 63 65 20 74 6f 20  6]; /* Space to 
4a00: 68 6f 6c 64 20 61 20 74 72 61 6e 73 69 65 6e 74  hold a transient
4a10: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
4a20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
4a30: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4a40: 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71  IC_RUN );  /* sq
4a50: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65 72  lite3_step() ver
4a60: 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ifies this */.  
4a70: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
4a80: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
4a90: 42 55 53 59 20 29 3b 0a 20 20 73 71 6c 69 74 65  BUSY );.  sqlite
4aa0: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
4ab0: 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78  Enter(&p->aMutex
4ac0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
4ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
4ae0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
4af0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
4b00: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
4b10: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
4b20: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
4b30: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
4b40: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
4b50: 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20  d.  */.    goto 
4b60: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73  no_mem;.  }.  as
4b70: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
4b80: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
4b90: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
4ba0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
4bb0: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
4bc0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b 0a  ->explain==0 );.
4bd0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
4be0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  = 0;.  db->busyH
4bf0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
4c00: 3b 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e  ;.  CHECK_FOR_IN
4c10: 54 45 52 52 55 50 54 3b 0a 20 20 73 71 6c 69 74  TERRUPT;.  sqlit
4c20: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
4c30: 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
4c40: 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
4c50: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
4c60: 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  loc();.  if( p->
4c70: 70 63 3d 3d 30 20 0a 20 20 20 26 26 20 28 28 70  pc==0 .   && ((p
4c80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
4c90: 4c 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67  LITE_VdbeListing
4ca0: 29 20 7c 7c 20 66 69 6c 65 45 78 69 73 74 73 28  ) || fileExists(
4cb0: 64 62 2c 20 22 76 64 62 65 5f 65 78 70 6c 61 69  db, "vdbe_explai
4cc0: 6e 22 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  n")).  ){.    in
4cd0: 74 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  t i;.    printf(
4ce0: 22 56 44 42 45 20 50 72 6f 67 72 61 6d 20 4c 69  "VDBE Program Li
4cf0: 73 74 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20  sting:\n");.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4d10: 53 71 6c 28 70 29 3b 0a 20 20 20 20 66 6f 72 28  Sql(p);.    for(
4d20: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
4d30: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4d40: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
4d50: 64 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  dout, i, &p->aOp
4d60: 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  [i]);.    }.  }.
4d70: 20 20 69 66 28 20 66 69 6c 65 45 78 69 73 74 73    if( fileExists
4d80: 28 64 62 2c 20 22 76 64 62 65 5f 74 72 61 63 65  (db, "vdbe_trace
4d90: 22 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 72 61  ") ){.    p->tra
4da0: 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d  ce = stdout;.  }
4db0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
4dc0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e  ignMalloc();.#en
4dd0: 64 69 66 0a 20 20 66 6f 72 28 70 63 3d 70 2d 3e  dif.  for(pc=p->
4de0: 70 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  pc; rc==SQLITE_O
4df0: 4b 3b 20 70 63 2b 2b 29 7b 0a 20 20 20 20 61 73  K; pc++){.    as
4e00: 73 65 72 74 28 20 70 63 3e 3d 30 20 26 26 20 70  sert( pc>=0 && p
4e10: 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 20 20  c<p->nOp );.    
4e20: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
4e30: 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  iled ) goto no_m
4e40: 65 6d 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f  em;.#ifdef VDBE_
4e50: 50 52 4f 46 49 4c 45 0a 20 20 20 20 6f 72 69 67  PROFILE.    orig
4e60: 50 63 20 3d 20 70 63 3b 0a 20 20 20 20 73 74 61  Pc = pc;.    sta
4e70: 72 74 20 3d 20 73 71 6c 69 74 65 33 48 77 74 69  rt = sqlite3Hwti
4e80: 6d 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  me();.#endif.   
4e90: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70   pOp = &p->aOp[p
4ea0: 63 5d 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  c];..    /* Only
4eb0: 20 61 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20 69   allow tracing i
4ec0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
4ed0: 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a  s defined..    *
4ee0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ef0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d  DEBUG.    if( p-
4f00: 3e 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  >trace ){.      
4f10: 69 66 28 20 70 63 3d 3d 30 20 29 7b 0a 20 20 20  if( pc==0 ){.   
4f20: 20 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42       printf("VDB
4f30: 45 20 45 78 65 63 75 74 69 6f 6e 20 54 72 61 63  E Execution Trac
4f40: 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  e:\n");.        
4f50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
4f60: 53 71 6c 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  Sql(p);.      }.
4f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4f80: 65 50 72 69 6e 74 4f 70 28 70 2d 3e 74 72 61 63  ePrintOp(p->trac
4f90: 65 2c 20 70 63 2c 20 70 4f 70 29 3b 0a 20 20 20  e, pc, pOp);.   
4fa0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72   }.    if( p->tr
4fb0: 61 63 65 3d 3d 30 20 26 26 20 70 63 3d 3d 30 20  ace==0 && pc==0 
4fc0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4fd0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4fe0: 63 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  c();.      if( f
4ff0: 69 6c 65 45 78 69 73 74 73 28 64 62 2c 20 22 76  ileExists(db, "v
5000: 64 62 65 5f 73 71 6c 74 72 61 63 65 22 29 20 29  dbe_sqltrace") )
5010: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5020: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29  3VdbePrintSql(p)
5030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5040: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
5050: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 0a  Malloc();.    }.
5060: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 0a 20  #endif.      .. 
5070: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
5080: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
5090: 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e 74   simulate an int
50a0: 65 72 72 75 70 74 2e 20 20 54 68 69 73 20 6f 6e  errupt.  This on
50b0: 6c 79 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ly happens.    *
50c0: 2a 20 69 66 20 77 65 20 68 61 76 65 20 61 20 73  * if we have a s
50d0: 70 65 63 69 61 6c 20 74 65 73 74 20 62 75 69 6c  pecial test buil
50e0: 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  d..    */.#ifdef
50f0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
5100: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74   if( sqlite3_int
5110: 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e 30 20 29  errupt_count>0 )
5120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5130: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 2d  interrupt_count-
5140: 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  -;.      if( sql
5150: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
5160: 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ount==0 ){.     
5170: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
5180: 72 75 70 74 28 64 62 29 3b 0a 20 20 20 20 20 20  rupt(db);.      
5190: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
51a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51b0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
51c0: 4c 42 41 43 4b 0a 20 20 20 20 2f 2a 20 43 61 6c  LBACK.    /* Cal
51d0: 6c 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  l the progress c
51e0: 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73  allback if it is
51f0: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
5200: 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d  the required num
5210: 62 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 56 44  ber.    ** of VD
5220: 42 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e  BE ops have been
5230: 20 65 78 65 63 75 74 65 64 20 28 65 69 74 68 65   executed (eithe
5240: 72 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76  r since this inv
5250: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 2a  ocation of.    *
5260: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  * sqlite3VdbeExe
5270: 63 28 29 20 6f 72 20 73 69 6e 63 65 20 6c 61 73  c() or since las
5280: 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 67 72  t time the progr
5290: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 61 73  ess callback was
52a0: 20 63 61 6c 6c 65 64 29 2e 0a 20 20 20 20 2a 2a   called)..    **
52b0: 20 49 66 20 74 68 65 20 70 72 6f 67 72 65 73 73   If the progress
52c0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
52d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 65 78 69 74  s non-zero, exit
52e0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
52f0: 68 69 6e 65 20 77 69 74 68 0a 20 20 20 20 2a 2a  hine with.    **
5300: 20 61 20 72 65 74 75 72 6e 20 63 6f 64 65 20 53   a return code S
5310: 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a 20 20 20  QLITE_ABORT..   
5320: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
5330: 78 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20  xProgress ){.   
5340: 20 20 20 69 66 28 20 64 62 2d 3e 6e 50 72 6f 67     if( db->nProg
5350: 72 65 73 73 4f 70 73 3d 3d 6e 50 72 6f 67 72 65  ressOps==nProgre
5360: 73 73 4f 70 73 20 29 7b 0a 20 20 20 20 20 20 20  ssOps ){.       
5370: 20 69 6e 74 20 70 72 63 3b 0a 20 20 20 20 20 20   int prc;.      
5380: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
5390: 65 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74  etyOff(db) ) got
53a0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
53b0: 69 73 75 73 65 3b 0a 20 20 20 20 20 20 20 20 70  isuse;.        p
53c0: 72 63 20 3d 64 62 2d 3e 78 50 72 6f 67 72 65 73  rc =db->xProgres
53d0: 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41  s(db->pProgressA
53e0: 72 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rg);.        if(
53f0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
5400: 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  (db) ) goto abor
5410: 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b  t_due_to_misuse;
5420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 63  .        if( prc
5430: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
5440: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
5450: 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ERRUPT;.        
5460: 20 20 67 6f 74 6f 20 76 64 62 65 5f 65 72 72 6f    goto vdbe_erro
5470: 72 5f 68 61 6c 74 3b 0a 20 20 20 20 20 20 20 20  r_halt;.        
5480: 7d 0a 20 20 20 20 20 20 20 20 6e 50 72 6f 67 72  }.        nProgr
5490: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
54a0: 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 6f 67 72    }.      nProgr
54b0: 65 73 73 4f 70 73 2b 2b 3b 0a 20 20 20 20 7d 0a  essOps++;.    }.
54c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
54d0: 6f 20 63 6f 6d 6d 6f 6e 20 73 65 74 75 70 20 70  o common setup p
54e0: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 6e  rocessing for an
54f0: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 73  y opcode that is
5500: 20 6d 61 72 6b 65 64 0a 20 20 20 20 2a 2a 20 77   marked.    ** w
5510: 69 74 68 20 74 68 65 20 22 6f 75 74 32 2d 70 72  ith the "out2-pr
5520: 65 72 65 6c 65 61 73 65 22 20 74 61 67 2e 20 20  erelease" tag.  
5530: 53 75 63 68 20 6f 70 63 6f 64 65 73 20 68 61 76  Such opcodes hav
5540: 65 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a  e a single.    *
5550: 2a 20 6f 75 74 70 75 74 20 77 68 69 63 68 20 69  * output which i
5560: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
5570: 68 65 20 50 32 20 70 61 72 61 6d 65 74 65 72 2e  he P2 parameter.
5580: 20 20 54 68 65 20 50 32 20 72 65 67 69 73 74 65    The P2 registe
5590: 72 0a 20 20 20 20 2a 2a 20 69 73 20 69 6e 69 74  r.    ** is init
55a0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 4e 55 4c  ialized to a NUL
55b0: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f 70  L..    */.    op
55c0: 50 72 6f 70 65 72 74 79 20 3d 20 6f 70 63 6f 64  Property = opcod
55d0: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
55e0: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
55f0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
5600: 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45 4c 45  FLG_OUT2_PRERELE
5610: 41 53 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ASE)!=0 ){.     
5620: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5630: 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
5640: 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e  rt( pOp->p2<=p->
5650: 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 70 4f  nMem );.      pO
5660: 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  ut = &p->aMem[pO
5670: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 73 71  p->p2];.      sq
5680: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
5690: 61 73 65 45 78 74 65 72 6e 61 6c 28 70 4f 75 74  aseExternal(pOut
56a0: 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 66  );.      pOut->f
56b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
56c0: 0a 20 20 20 20 7d 65 6c 73 65 0a 20 0a 20 20 20  .    }else. .   
56d0: 20 2f 2a 20 44 6f 20 63 6f 6d 6d 6f 6e 20 73 65   /* Do common se
56e0: 74 75 70 20 66 6f 72 20 6f 70 63 6f 64 65 73 20  tup for opcodes 
56f0: 6d 61 72 6b 65 64 20 77 69 74 68 20 6f 6e 65 20  marked with one 
5700: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5710: 0a 20 20 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74  .    ** combinat
5720: 69 6f 6e 73 20 6f 66 20 70 72 6f 70 65 72 74 69  ions of properti
5730: 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es..    **.    *
5740: 2a 20 20 20 20 20 20 20 20 20 20 20 69 6e 31 0a  *           in1.
5750: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
5760: 20 69 6e 31 20 69 6e 32 0a 20 20 20 20 2a 2a 20   in1 in2.    ** 
5770: 20 20 20 20 20 20 20 20 20 20 69 6e 31 20 69 6e            in1 in
5780: 32 20 6f 75 74 33 0a 20 20 20 20 2a 2a 20 20 20  2 out3.    **   
5790: 20 20 20 20 20 20 20 20 69 6e 31 20 69 6e 33 0a          in1 in3.
57a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 56 61      **.    ** Va
57b0: 72 69 61 62 6c 65 73 20 70 49 6e 31 2c 20 70 49  riables pIn1, pI
57c0: 6e 32 2c 20 61 6e 64 20 70 49 6e 33 20 61 72 65  n2, and pIn3 are
57d0: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
57e0: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  o appropriate.  
57f0: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 66    ** registers f
5800: 6f 72 20 69 6e 70 75 74 73 2e 20 20 56 61 72 69  or inputs.  Vari
5810: 61 62 6c 65 20 70 4f 75 74 20 70 6f 69 6e 74 73  able pOut points
5820: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 72   to the output r
5830: 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  egister..    */.
5840: 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65      if( (opPrope
5850: 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29  rty & OPFLG_IN1)
5860: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
5870: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29  ert( pOp->p1>0 )
5880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5890: 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p1<=p->nMem
58a0: 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 31 20 3d   );.      pIn1 =
58b0: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
58c0: 31 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53 54  1];.      REGIST
58d0: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
58e0: 2c 20 70 49 6e 31 29 3b 0a 20 20 20 20 20 20 69  , pIn1);.      i
58f0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5900: 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29   OPFLG_IN2)!=0 )
5910: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5920: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
5930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5940: 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p2<=p->nMem 
5950: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 32 20  );.        pIn2 
5960: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
5970: 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 52 45 47  p2];.        REG
5980: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
5990: 3e 70 32 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20  >p2, pIn2);.    
59a0: 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65      if( (opPrope
59b0: 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33  rty & OPFLG_OUT3
59c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
59d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
59e0: 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  3>0 );.         
59f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
5a00: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
5a10: 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26 70         pOut = &p
5a20: 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b  ->aMem[pOp->p3];
5a30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a40: 20 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 50 72   }else if( (opPr
5a50: 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49  operty & OPFLG_I
5a60: 4e 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N3)!=0 ){.      
5a70: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5a80: 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  3>0 );.        a
5a90: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
5aa0: 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20  p->nMem );.     
5ab0: 20 20 20 70 49 6e 33 20 3d 20 26 70 2d 3e 61 4d     pIn3 = &p->aM
5ac0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
5ad0: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
5ae0: 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 49 6e  ACE(pOp->p3, pIn
5af0: 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  3);.      }.    
5b00: 7d 65 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f  }else if( (opPro
5b10: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e  perty & OPFLG_IN
5b20: 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  2)!=0 ){.      a
5b30: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
5b40: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
5b50: 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d  ( pOp->p2<=p->nM
5b60: 65 6d 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 32  em );.      pIn2
5b70: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d   = &p->aMem[pOp-
5b80: 3e 70 32 5d 3b 0a 20 20 20 20 20 20 52 45 47 49  >p2];.      REGI
5b90: 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
5ba0: 70 32 2c 20 70 49 6e 32 29 3b 0a 20 20 20 20 7d  p2, pIn2);.    }
5bb0: 65 6c 73 65 20 69 66 28 20 28 6f 70 50 72 6f 70  else if( (opProp
5bc0: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33  erty & OPFLG_IN3
5bd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
5be0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
5bf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
5c00: 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65   pOp->p3<=p->nMe
5c10: 6d 20 29 3b 0a 20 20 20 20 20 20 70 49 6e 33 20  m );.      pIn3 
5c20: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
5c30: 70 33 5d 3b 0a 20 20 20 20 20 20 52 45 47 49 53  p3];.      REGIS
5c40: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
5c50: 33 2c 20 70 49 6e 33 29 3b 0a 20 20 20 20 7d 0a  3, pIn3);.    }.
5c60: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
5c70: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a  ->opcode ){../**
5c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57  ***********.** W
5cd0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61  hat follows is a
5ce0: 20 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20   massive switch 
5cf0: 73 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20  statement where 
5d00: 65 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d  each case implem
5d10: 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61  ents a.** separa
5d20: 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  te instruction i
5d30: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
5d40: 63 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f  chine.  If we fo
5d50: 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a  llow the usual.*
5d60: 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f  * indentation co
5d70: 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20  nventions, each 
5d80: 63 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69  case should be i
5d90: 6e 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61  ndented by 6 spa
5da0: 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61  ces.  But.** tha
5db0: 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61  t is a lot of wa
5dc0: 73 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68  sted space on th
5dd0: 65 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20  e left margin.  
5de0: 53 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68  So the code with
5df0: 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68  in.** the switch
5e00: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20   statement will 
5e10: 62 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65  break with conve
5e20: 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75  ntion and be flu
5e30: 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72  sh-left. Another
5e40: 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20  .** big comment 
5e50: 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73  (similar to this
5e60: 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20   one) will mark 
5e70: 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  the point in the
5e80: 20 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77   code where.** w
5e90: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63  e transition bac
5ea0: 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65  k to normal inde
5eb0: 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ntation..**.** T
5ec0: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66  he formatting of
5ed0: 20 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d   each case is im
5ee0: 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61  portant.  The ma
5ef0: 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74  kefile for SQLit
5f00: 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74  e.** generates t
5f10: 77 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f  wo C files "opco
5f20: 64 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f  des.h" and "opco
5f30: 64 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69  des.c" by scanni
5f40: 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20  ng this.** file 
5f50: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65  looking for line
5f60: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
5f70: 68 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54  h "case OP_".  T
5f80: 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c  he opcodes.h fil
5f90: 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69  es.** will be fi
5fa0: 6c 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e  lled with #defin
5fb0: 65 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69  es that give uni
5fc0: 71 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  que integer valu
5fd0: 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70  es to each.** op
5fe0: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63  code and the opc
5ff0: 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66  odes.c file is f
6000: 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72  illed with an ar
6010: 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77  ray of strings w
6020: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72  here.** each str
6030: 69 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f  ing is the symbo
6040: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  lic name for the
6050: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f   corresponding o
6060: 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a  pcode.  If the.*
6070: 2a 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74  * case statement
6080: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
6090: 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65  a comment of the
60a0: 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61   form "/# same a
60b0: 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61  s ... #/".** tha
60c0: 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65  t comment is use
60d0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
60e0: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  he particular va
60f0: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
6100: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b  e..**.** Other k
6110: 65 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63  eywords in the c
6120: 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c  omment that foll
6130: 6f 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72  ows each case ar
6140: 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e  e used to.** con
6150: 73 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47  struct the OPFLG
6160: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c  _INITIALIZER val
6170: 75 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  ue that initiali
6180: 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72  zes opcodeProper
6190: 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64  ty[]..** Keyword
61a0: 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20  s include: in1, 
61b0: 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 5f 70  in2, in3, out2_p
61c0: 72 65 72 65 6c 65 61 73 65 2c 20 6f 75 74 32 2c  rerelease, out2,
61d0: 20 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74   out3.  See.** t
61e0: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
61f0: 20 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69   script for addi
6200: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
6210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65  on..**.** Docume
6220: 6e 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44  ntation about VD
6230: 42 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65  BE opcodes is ge
6240: 6e 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e  nerated by scann
6250: 69 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a  ing this file.**
6260: 20 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68   for lines of th
6270: 61 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f  at contain "Opco
6280: 64 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65  de:".  That line
6290: 20 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75   and all subsequ
62a0: 65 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c  ent.** comment l
62b0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e  ines are used in
62c0: 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   the generation 
62d0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74  of the opcode.ht
62e0: 6d 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ml documentation
62f0: 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  .** file..**.** 
6300: 53 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20  SUMMARY:.**.**  
6310: 20 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73     Formatting is
6320: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63   important to sc
6330: 72 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20  ripts that scan 
6340: 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  this file..**   
6350: 20 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65    Do not deviate
6360: 20 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74   from the format
6370: 74 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65  ting style curre
6380: 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  ntly in use..**.
6390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
63e0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f  /* Opcode:  Goto
63f0: 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   * P2 * * *.**.*
6400: 2a 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  * An uncondition
6410: 61 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65  al jump to addre
6420: 73 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65  ss P2..** The ne
6430: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  xt instruction e
6440: 78 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20  xecuted will be 
6450: 0a 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69  .** the one at i
6460: 6e 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65  ndex P2 from the
6470: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
6480: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f   the program..*/
6490: 0a 63 61 73 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b  .case OP_Goto: {
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
64b0: 6a 75 6d 70 20 2a 2f 0a 20 20 43 48 45 43 4b 5f  jump */.  CHECK_
64c0: 46 4f 52 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  FOR_INTERRUPT;. 
64d0: 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
64e0: 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
64f0: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 73 75 62  * Opcode:  Gosub
6500: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
6510: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72  ** Write the cur
6520: 72 65 6e 74 20 61 64 64 72 65 73 73 20 6f 6e 74  rent address ont
6530: 6f 20 72 65 67 69 73 74 65 72 20 50 31 0a 2a 2a  o register P1.**
6540: 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d 70 20 74   and then jump t
6550: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2f  o address P2..*/
6560: 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75 62 3a 20  .case OP_Gosub: 
6570: 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
6580: 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
6590: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
65a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
65b0: 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
65c0: 49 6e 31 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  In1 = &p->aMem[p
65d0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
65e0: 74 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  t( (pIn1->flags 
65f0: 26 20 4d 45 4d 5f 44 79 6e 29 3d 3d 30 20 29 3b  & MEM_Dyn)==0 );
6600: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6610: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e 31   MEM_Int;.  pIn1
6620: 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20 20 52 45  ->u.i = pc;.  RE
6630: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
6640: 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20 20 70  ->p1, pIn1);.  p
6650: 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
6660: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
6670: 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20  Opcode:  Return 
6680: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
6690: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   Jump to the nex
66a0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66  t instruction af
66b0: 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73 20  ter the address 
66c0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
66d0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75 72  */.case OP_Retur
66e0: 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  n: {           /
66f0: 2a 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72  * in1 */.  asser
6700: 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  t( pIn1->flags &
6710: 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 63   MEM_Int );.  pc
6720: 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e   = (int)pIn1->u.
6730: 69 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  i;.  break;.}../
6740: 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64  * Opcode:  Yield
6750: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
6760: 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72  * Swap the progr
6770: 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20  am counter with 
6780: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
6790: 69 73 74 65 72 20 50 31 2e 0a 2a 2f 0a 63 61 73  ister P1..*/.cas
67a0: 65 20 4f 50 5f 59 69 65 6c 64 3a 20 7b 20 20 20  e OP_Yield: {   
67b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
67c0: 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b  */.  int pcDest;
67d0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31  .  assert( (pIn1
67e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
67f0: 6e 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31 2d  n)==0 );.  pIn1-
6800: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6810: 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69 6e  ;.  pcDest = (in
6820: 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 70  t)pIn1->u.i;.  p
6830: 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 63 3b 0a 20  In1->u.i = pc;. 
6840: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
6850: 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a  pOp->p1, pIn1);.
6860: 20 20 70 63 20 3d 20 70 63 44 65 73 74 3b 0a 20    pc = pcDest;. 
6870: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
6880: 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31 20  pcode:  Halt P1 
6890: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
68a0: 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  Exit immediately
68b0: 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75 72 73  .  All open curs
68c0: 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63 6c 6f  ors, etc are clo
68d0: 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  sed.** automatic
68e0: 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69  ally..**.** P1 i
68f0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  s the result cod
6900: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
6910: 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20 73 71  lite3_exec(), sq
6920: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c 0a 2a  lite3_reset(),.*
6930: 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66 69 6e  * or sqlite3_fin
6940: 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20 61 20  alize().  For a 
6950: 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74 68 69  normal halt, thi
6960: 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51 4c 49  s should be SQLI
6970: 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20 46 6f  TE_OK (0)..** Fo
6980: 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63 61 6e  r errors, it can
6990: 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 76   be some other v
69a0: 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d 30 20  alue.  If P1!=0 
69b0: 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64 65 74  then P2 will det
69c0: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
69d0: 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f 6c 6c  r or not to roll
69e0: 62 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  back the current
69f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 44   transaction.  D
6a00: 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o not rollback.*
6a10: 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61 69 6c  * if P2==OE_Fail
6a20: 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  . Do the rollbac
6a30: 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f 6c 6c  k if P2==OE_Roll
6a40: 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d 4f 45  back.  If P2==OE
6a50: 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65 6e 20  _Abort,.** then 
6a60: 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63 68 61  back out all cha
6a70: 6e 67 65 73 20 74 68 61 74 20 68 61 76 65 20 6f  nges that have o
6a80: 63 63 75 72 72 65 64 20 64 75 72 69 6e 67 20 74  ccurred during t
6a90: 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  his execution of
6aa0: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20 62 75   the.** VDBE, bu
6ab0: 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63  t do not rollbac
6ac0: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
6ad0: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20  n. .**.** If P4 
6ae0: 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65 6e  is not null then
6af0: 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   it is an error 
6b00: 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a  message string..
6b10: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
6b20: 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20  n implied "Halt 
6b30: 30 20 30 20 30 22 20 69 6e 73 74 72 75 63 74 69  0 0 0" instructi
6b40: 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20 74  on inserted at t
6b50: 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a  he very end of.*
6b60: 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e  * every program.
6b70: 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74    So a jump past
6b80: 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
6b90: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f  ction of the pro
6ba0: 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73  gram.** is the s
6bb0: 61 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e 67  ame as executing
6bc0: 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f   Halt..*/.case O
6bd0: 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 70 2d 3e 72  P_Halt: {.  p->r
6be0: 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70  c = pOp->p1;.  p
6bf0: 2d 3e 70 63 20 3d 20 70 63 3b 0a 20 20 70 2d 3e  ->pc = pc;.  p->
6c00: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 70 4f  errorAction = pO
6c10: 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 70 4f 70  p->p2;.  if( pOp
6c20: 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20 73 71  ->p4.z ){.    sq
6c30: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6c40: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
6c50: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
6c60: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
6c70: 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
6c80: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
6c90: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
6ca0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
6cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6cc0: 42 55 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72  BUSY ){.    p->r
6cd0: 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
6ce0: 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
6cf0: 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f 20     rc = p->rc ? 
6d00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53  SQLITE_ERROR : S
6d10: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6d20: 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75    goto vdbe_retu
6d30: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  rn;.}../* Opcode
6d40: 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 32 20  : Integer P1 P2 
6d50: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
6d60: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76  32-bit integer v
6d70: 61 6c 75 65 20 50 31 20 69 73 20 77 72 69 74 74  alue P1 is writt
6d80: 65 6e 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  en into register
6d90: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
6da0: 49 6e 74 65 67 65 72 3a 20 7b 20 20 20 20 20 20  Integer: {      
6db0: 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
6dc0: 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f 75 74 2d  lease */.  pOut-
6dd0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6de0: 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
6df0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 62 72 65 61 6b  pOp->p1;.  break
6e00: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
6e10: 49 6e 74 36 34 20 2a 20 50 32 20 2a 20 50 34 20  Int64 * P2 * P4 
6e20: 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  *.**.** P4 is a 
6e30: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
6e40: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
6e50: 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74  e..** Write that
6e60: 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
6e70: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
6e80: 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20   OP_Int64: {    
6e90: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d 70         /* out2-p
6ea0: 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61  rerelease */.  a
6eb0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
6ec0: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
6ed0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
6ee0: 74 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  t;.  pOut->u.i =
6ef0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a   *pOp->p4.pI64;.
6f00: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6f10: 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32  pcode: Real * P2
6f20: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
6f30: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
6f40: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
6f50: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
6f60: 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61  ** Write that va
6f70: 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
6f80: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
6f90: 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Real: {        
6fa0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
6fb0: 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 2d 70 72  K_FLOAT, out2-pr
6fc0: 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 70 4f  erelease */.  pO
6fd0: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
6fe0: 52 65 61 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Real;.  assert( 
6ff0: 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 2a 70  !sqlite3IsNaN(*p
7000: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 20 29 3b  Op->p4.pReal) );
7010: 0a 20 20 70 4f 75 74 2d 3e 72 20 3d 20 2a 70 4f  .  pOut->r = *pO
7020: 70 2d 3e 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62  p->p4.pReal;.  b
7030: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
7040: 64 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32  de: String8 * P2
7050: 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34   * P4 *.**.** P4
7060: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
7070: 20 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d   terminated UTF-
7080: 38 20 73 74 72 69 6e 67 2e 20 54 68 69 73 20 6f  8 string. This o
7090: 70 63 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f  pcode is transfo
70a0: 72 6d 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 6e  rmed .** into an
70b0: 20 4f 50 5f 53 74 72 69 6e 67 20 62 65 66 6f 72   OP_String befor
70c0: 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  e it is executed
70d0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
70e0: 69 6d 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ime..*/.case OP_
70f0: 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20 20  String8: {      
7100: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
7110: 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 2d 70 72  _STRING, out2-pr
7120: 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 61 73  erelease */.  as
7130: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21  sert( pOp->p4.z!
7140: 3d 30 20 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  =0 );.  pOp->opc
7150: 6f 64 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b  ode = OP_String;
7160: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c  .  pOp->p1 = sql
7170: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 70  ite3Strlen30(pOp
7180: 2d 3e 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65  ->p4.z);..#ifnde
7190: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
71a0: 46 31 36 0a 20 20 69 66 28 20 65 6e 63 6f 64 69  F16.  if( encodi
71b0: 6e 67 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  ng!=SQLITE_UTF8 
71c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
71d0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
71e0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c  , pOp->p4.z, -1,
71f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7200: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7210: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
7220: 3d 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e  =sqlite3VdbeChan
7230: 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
7240: 20 65 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74   encoding) ) got
7250: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 69 66  o no_mem;.    if
7260: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7270: 69 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57  ite3VdbeMemMakeW
7280: 72 69 74 65 61 62 6c 65 28 70 4f 75 74 29 20 29  riteable(pOut) )
7290: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
72a0: 20 20 70 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 20    pOut->zMalloc 
72b0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  = 0;.    pOut->f
72c0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61 74  lags |= MEM_Stat
72d0: 69 63 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  ic;.    pOut->fl
72e0: 61 67 73 20 26 3d 20 7e 4d 45 4d 5f 44 79 6e 3b  ags &= ~MEM_Dyn;
72f0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  .    if( pOp->p4
7300: 74 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43  type==P4_DYNAMIC
7310: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7320: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
7330: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  >p4.z);.    }.  
7340: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7350: 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20  P4_DYNAMIC;.    
7360: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74  pOp->p4.z = pOut
7370: 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31  ->z;.    pOp->p1
7380: 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 20 20   = pOut->n;.    
7390: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
73a0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
73b0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
73c0: 20 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69       goto too_bi
73d0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 55 50 44  g;.    }.    UPD
73e0: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
73f0: 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61  (pOut);.    brea
7400: 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  k;.  }.#endif.  
7410: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
7420: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
7430: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
7440: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
7450: 0a 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  .  }.  /* Fall t
7460: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
7470: 78 74 20 63 61 73 65 2c 20 4f 50 5f 53 74 72 69  xt case, OP_Stri
7480: 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f 2a 20 4f 70  ng */.}.  ./* Op
7490: 63 6f 64 65 3a 20 53 74 72 69 6e 67 20 50 31 20  code: String P1 
74a0: 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  P2 * P4 *.**.** 
74b0: 54 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65  The string value
74c0: 20 50 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31   P4 of length P1
74d0: 20 28 62 79 74 65 73 29 20 69 73 20 73 74 6f 72   (bytes) is stor
74e0: 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
74f0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 74  2..*/.case OP_St
7500: 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20 20 20  ring: {         
7510: 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
7520: 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
7530: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
7540: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
7550: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61   MEM_Str|MEM_Sta
7560: 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  tic|MEM_Term;.  
7570: 70 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70  pOut->z = pOp->p
7580: 34 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  4.z;.  pOut->n =
7590: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74   pOp->p1;.  pOut
75a0: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
75b0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
75c0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
75d0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
75e0: 63 6f 64 65 3a 20 4e 75 6c 6c 20 2a 20 50 32 20  code: Null * P2 
75f0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
7600: 65 20 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65  e a NULL into re
7610: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
7620: 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20 20  se OP_Null: {   
7630: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 2d          /* out2-
7640: 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  prerelease */.  
7650: 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70  break;.}.../* Op
7660: 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50 32  code: Blob P1 P2
7670: 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 70   * P4.**.** P4 p
7680: 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f 62 20  oints to a blob 
7690: 6f 66 20 64 61 74 61 20 50 31 20 62 79 74 65 73  of data P1 bytes
76a0: 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20 74 68   long.  Store th
76b0: 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20 72 65  is.** blob in re
76c0: 67 69 73 74 65 72 20 50 32 2e 20 54 68 69 73 20  gister P2. This 
76d0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6e  instruction is n
76e0: 6f 74 20 63 6f 64 65 64 20 64 69 72 65 63 74 6c  ot coded directl
76f0: 79 0a 2a 2a 20 62 79 20 74 68 65 20 63 6f 6d 70  y.** by the comp
7700: 69 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 74  iler. Instead, t
7710: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 61 79 65  he compiler laye
7720: 72 20 73 70 65 63 69 66 69 65 73 0a 2a 2a 20 61  r specifies.** a
7730: 6e 20 4f 50 5f 48 65 78 42 6c 6f 62 20 6f 70 63  n OP_HexBlob opc
7740: 6f 64 65 2c 20 77 69 74 68 20 74 68 65 20 68 65  ode, with the he
7750: 78 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  x string represe
7760: 6e 74 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ntation of.** th
7770: 65 20 62 6c 6f 62 20 61 73 20 50 34 2e 20 54 68  e blob as P4. Th
7780: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 74 72 61  is opcode is tra
7790: 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 4f  nsformed to an O
77a0: 50 5f 42 6c 6f 62 0a 2a 2a 20 74 68 65 20 66 69  P_Blob.** the fi
77b0: 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
77c0: 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 63 61 73 65  xecuted..*/.case
77d0: 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20   OP_Blob: {     
77e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
77f0: 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
7800: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
7810: 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  p1 <= SQLITE_MAX
7820: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 73 71 6c  _LENGTH );.  sql
7830: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
7840: 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e  r(pOut, pOp->p4.
7850: 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30  z, pOp->p1, 0, 0
7860: 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  );.  pOut->enc =
7870: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
7880: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
7890: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
78a0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  .}../* Opcode: V
78b0: 61 72 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20  ariable P1 P2 * 
78c0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  * *.**.** The va
78d0: 6c 75 65 20 6f 66 20 76 61 72 69 61 62 6c 65 20  lue of variable 
78e0: 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  P1 is written in
78f0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
7900: 41 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  A variable is.**
7910: 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 69 6e 20 74   an unknown in t
7920: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
7930: 73 74 72 69 6e 67 20 61 73 20 68 61 6e 64 65 64  string as handed
7940: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70   to sqlite3_comp
7950: 69 6c 65 28 29 2e 0a 2a 2a 20 41 6e 79 20 6f 63  ile()..** Any oc
7960: 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20  currence of the 
7970: 27 3f 27 20 63 68 61 72 61 63 74 65 72 20 69 6e  '?' character in
7980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
7990: 4c 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  L is considered.
79a0: 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 2e 20 20  ** a variable.  
79b0: 56 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  Variables in the
79c0: 20 53 51 4c 20 73 74 72 69 6e 67 20 61 72 65 20   SQL string are 
79d0: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 6c 65 66 74  number from left
79e0: 20 74 6f 0a 2a 2a 20 72 69 67 68 74 20 62 65 67   to.** right beg
79f0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 31 2e 20 20  inning with 1.  
7a00: 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 76 61  The values of va
7a10: 72 69 61 62 6c 65 73 20 61 72 65 20 73 65 74 20  riables are set 
7a20: 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
7a30: 69 74 65 33 5f 62 69 6e 64 28 29 20 41 50 49 2e  ite3_bind() API.
7a40: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69  .*/.case OP_Vari
7a50: 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
7a60: 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
7a70: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 20  ease */.  int j 
7a80: 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31 3b 0a 20  = pOp->p1 - 1;. 
7a90: 20 4d 65 6d 20 2a 70 56 61 72 3b 0a 20 20 61 73   Mem *pVar;.  as
7aa0: 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c  sert( j>=0 && j<
7ab0: 70 2d 3e 6e 56 61 72 20 29 3b 0a 0a 20 20 70 56  p->nVar );..  pV
7ac0: 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 6a 5d  ar = &p->aVar[j]
7ad0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ;.  if( sqlite3V
7ae0: 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61  dbeMemTooBig(pVa
7af0: 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  r) ){.    goto t
7b00: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 73 71  oo_big;.  }.  sq
7b10: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
7b20: 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 26 70  lowCopy(pOut, &p
7b30: 2d 3e 61 56 61 72 5b 6a 5d 2c 20 4d 45 4d 5f 53  ->aVar[j], MEM_S
7b40: 74 61 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45  tatic);.  UPDATE
7b50: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
7b60: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
7b70: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65  ./* Opcode: Move
7b80: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
7b90: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 76 61 6c  .** Move the val
7ba0: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
7bb0: 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72  P1..P1+P3-1 over
7bc0: 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
7bd0: 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20  rs P2..P2+P3-1. 
7be0: 20 52 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50   Registers P1..P
7bf0: 31 2b 50 31 2d 31 20 61 72 65 0a 2a 2a 20 6c 65  1+P1-1 are.** le
7c00: 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c  ft holding a NUL
7c10: 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72  L.  It is an err
7c20: 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65 72 20  or for register 
7c30: 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31  ranges.** P1..P1
7c40: 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32  +P3-1 and P2..P2
7c50: 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70  +P3-1 to overlap
7c60: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76  ..*/.case OP_Mov
7c70: 65 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e: {.  char *zMa
7c80: 6c 6c 6f 63 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  lloc;.  int n = 
7c90: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 6e 74 20 70  pOp->p3;.  int p
7ca0: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  1 = pOp->p1;.  i
7cb0: 6e 74 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  nt p2 = pOp->p2;
7cc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29  .  assert( n>0 )
7cd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 3e 30  ;.  assert( p1>0
7ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31   );.  assert( p1
7cf0: 2b 6e 3c 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  +n<p->nMem );.  
7d00: 70 49 6e 31 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pIn1 = &p->aMem[
7d10: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
7d20: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
7d30: 20 70 32 2b 6e 3c 70 2d 3e 6e 4d 65 6d 20 29 3b   p2+n<p->nMem );
7d40: 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d  .  pOut = &p->aM
7d50: 65 6d 5b 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  em[p2];.  assert
7d60: 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32  ( p1+n<=p2 || p2
7d70: 2b 6e 3c 3d 70 31 20 29 3b 0a 20 20 77 68 69 6c  +n<=p1 );.  whil
7d80: 65 28 20 6e 2d 2d 20 29 7b 0a 20 20 20 20 7a 4d  e( n-- ){.    zM
7d90: 61 6c 6c 6f 63 20 3d 20 70 4f 75 74 2d 3e 7a 4d  alloc = pOut->zM
7da0: 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 4f 75 74 2d  alloc;.    pOut-
7db0: 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
7dc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
7dd0: 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29  Move(pOut, pIn1)
7de0: 3b 0a 20 20 20 20 70 49 6e 31 2d 3e 7a 4d 61 6c  ;.    pIn1->zMal
7df0: 6c 6f 63 20 3d 20 7a 4d 61 6c 6c 6f 63 3b 0a 20  loc = zMalloc;. 
7e00: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
7e10: 45 28 70 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20  E(p2++, pOut);. 
7e20: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70     pIn1++;.    p
7e30: 4f 75 74 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65  Out++;.  }.  bre
7e40: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
7e50: 3a 20 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a  : Copy P1 P2 * *
7e60: 20 2a 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20   *.**.** Make a 
7e70: 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65 72  copy of register
7e80: 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65   P1 into registe
7e90: 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P2..**.** This
7ea0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b   instruction mak
7eb0: 65 73 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  es a deep copy o
7ec0: 66 20 74 68 65 20 76 61 6c 75 65 2e 20 20 41 20  f the value.  A 
7ed0: 64 75 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20  duplicate.** is 
7ee0: 6d 61 64 65 20 6f 66 20 61 6e 79 20 73 74 72 69  made of any stri
7ef0: 6e 67 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74  ng or blob const
7f00: 61 6e 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f  ant.  See also O
7f10: 50 5f 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  P_SCopy..*/.case
7f20: 20 4f 50 5f 43 6f 70 79 3a 20 7b 20 20 20 20 20   OP_Copy: {     
7f30: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
7f40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
7f50: 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  >p2>0 );.  asser
7f60: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e  t( pOp->p2<=p->n
7f70: 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  Mem );.  pOut = 
7f80: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
7f90: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75  ];.  assert( pOu
7fa0: 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c  t!=pIn1 );.  sql
7fb0: 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
7fc0: 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e  owCopy(pOut, pIn
7fd0: 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  1, MEM_Ephem);. 
7fe0: 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
7ff0: 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53 54 45  pOut);.  REGISTE
8000: 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
8010: 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
8020: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
8030: 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a  Copy P1 P2 * * *
8040: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68  .**.** Make a sh
8050: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65  allow copy of re
8060: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
8070: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
8080: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
8090: 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c  on makes a shall
80a0: 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76  ow copy of the v
80b0: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 76 61  alue.  If the va
80c0: 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  lue.** is a stri
80d0: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e  ng or blob, then
80e0: 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c   the copy is onl
80f0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
8100: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61  he.** original a
8110: 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68 65 20  nd hence if the 
8120: 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73  original changes
8130: 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70   so will the cop
8140: 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20  y..** Worse, if 
8150: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20  the original is 
8160: 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  deallocated, the
8170: 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e   copy becomes in
8180: 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74  valid..** Thus t
8190: 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20  he program must 
81a0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
81b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c  he original will
81c0: 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64   not change.** d
81d0: 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
81e0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20  me of the copy. 
81f0: 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20   Use OP_Copy to 
8200: 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a  make a complete.
8210: 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  ** copy..*/.case
8220: 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20   OP_SCopy: {    
8230: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
8240: 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  /.  REGISTER_TRA
8250: 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31  CE(pOp->p1, pIn1
8260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
8270: 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65  ->p2>0 );.  asse
8280: 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e  rt( pOp->p2<=p->
8290: 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74 20 3d  nMem );.  pOut =
82a0: 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70   &p->aMem[pOp->p
82b0: 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  2];.  assert( pO
82c0: 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73 71  ut!=pIn1 );.  sq
82d0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
82e0: 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 49  lowCopy(pOut, pI
82f0: 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  n1, MEM_Ephem);.
8300: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
8310: 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b  (pOp->p2, pOut);
8320: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
8330: 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f  Opcode: ResultRo
8340: 77 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  w P1 P2 * * *.**
8350: 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
8360: 73 20 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b  s P1 through P1+
8370: 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73  P2-1 contain a s
8380: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20  ingle row of.** 
8390: 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70  results. This op
83a0: 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 20  code causes the 
83b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
83c0: 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  all to terminate
83d0: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49  .** with an SQLI
83e0: 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f  TE_ROW return co
83f0: 64 65 20 61 6e 64 20 69 74 20 73 65 74 73 20 75  de and it sets u
8400: 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74  p the sqlite3_st
8410: 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  mt.** structure 
8420: 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63 65 73  to provide acces
8430: 73 20 74 6f 20 74 68 65 20 74 6f 70 20 50 31 20  s to the top P1 
8440: 76 61 6c 75 65 73 20 61 73 20 74 68 65 20 72 65  values as the re
8450: 73 75 6c 74 0a 2a 2a 20 72 6f 77 2e 0a 2a 2f 0a  sult.** row..*/.
8460: 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f  case OP_ResultRo
8470: 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  w: {.  Mem *pMem
8480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
8490: 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ert( p->nResColu
84a0: 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b 0a 20  mn==pOp->p2 );. 
84b0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
84c0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
84d0: 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 3c  pOp->p1+pOp->p2<
84e0: 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 0a 20 20 2f  =p->nMem );..  /
84f0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  * Invalidate all
8500: 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f   ephemeral curso
8510: 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f 0a  r row caches */.
8520: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
8530: 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20 32  (p->cacheCtr + 2
8540: 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  )|1;..  /* Make 
8550: 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  sure the results
8560: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
8570: 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65 72  row are \000 ter
8580: 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e 64  minated.  ** and
8590: 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
85a0: 64 20 74 79 70 65 2e 20 20 54 68 65 20 72 65 73  d type.  The res
85b0: 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68 65  ults are de-ephe
85c0: 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20 2a  meralized as.  *
85d0: 2a 20 61 73 20 73 69 64 65 20 65 66 66 65 63 74  * as side effect
85e0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20  ..  */.  pMem = 
85f0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
8600: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  &p->aMem[pOp->p1
8610: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
8620: 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20  pOp->p2; i++){. 
8630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
8640: 6d 4e 75 6c 54 65 72 6d 69 6e 61 74 65 28 26 70  mNulTerminate(&p
8650: 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20 20 73 74 6f  Mem[i]);.    sto
8660: 72 65 54 79 70 65 49 6e 66 6f 28 26 70 4d 65 6d  reTypeInfo(&pMem
8670: 5b 69 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  [i], encoding);.
8680: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
8690: 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70  CE(pOp->p1+i, &p
86a0: 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  Mem[i]);.  }.  i
86b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
86c0: 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  led ) goto no_me
86d0: 6d 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  m;..  /* Return 
86e0: 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a  SQLITE_ROW.  */.
86f0: 20 20 70 2d 3e 6e 43 61 6c 6c 62 61 63 6b 2b 2b    p->nCallback++
8700: 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70 63 20 2b  ;.  p->pc = pc +
8710: 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54   1;.  rc = SQLIT
8720: 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64  E_ROW;.  goto vd
8730: 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  be_return;.}../*
8740: 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20   Opcode: Concat 
8750: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
8760: 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74 20  ** Add the text 
8770: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 6f  in register P1 o
8780: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
8790: 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72 65  he text in.** re
87a0: 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73 74  gister P2 and st
87b0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
87c0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
87d0: 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
87e0: 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61 72  P1 or P2 text ar
87f0: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  e NULL then stor
8800: 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a  e NULL in P3..**
8810: 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c 7c  .**   P3 = P2 ||
8820: 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   P1.**.** It is 
8830: 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20 61  illegal for P1 a
8840: 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65 20  nd P3 to be the 
8850: 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20 53  same register. S
8860: 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66 20  ometimes,.** if 
8870: 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  P3 is the same r
8880: 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20 74  egister as P2, t
8890: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
88a0: 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f 20  n is able.** to 
88b0: 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28 29  avoid a memcpy()
88c0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6e  ..*/.case OP_Con
88d0: 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  cat: {          
88e0: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 43   /* same as TK_C
88f0: 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32 2c  ONCAT, in1, in2,
8900: 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 6e   out3 */.  i64 n
8910: 42 79 74 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Byte;..  assert(
8920: 20 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20   pIn1!=pOut );. 
8930: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
8940: 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29  s | pIn2->flags)
8950: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
8960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
8970: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
8980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
8990: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
89a0: 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70  );.  Stringify(p
89b0: 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  In1, encoding);.
89c0: 20 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e    ExpandBlob(pIn
89d0: 32 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28  2);.  Stringify(
89e0: 70 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pIn2, encoding);
89f0: 0a 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d  .  nByte = pIn1-
8a00: 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20  >n + pIn2->n;.  
8a10: 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c  if( nByte>db->aL
8a20: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8a30: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
8a40: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
8a50: 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46   }.  MemSetTypeF
8a60: 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74  lag(pOut, MEM_St
8a70: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
8a80: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
8a90: 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c  t, (int)nByte+2,
8aa0: 20 70 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a   pOut==pIn2) ){.
8ab0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
8ac0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 21  .  }.  if( pOut!
8ad0: 3d 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d  =pIn2 ){.    mem
8ae0: 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e  cpy(pOut->z, pIn
8af0: 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a  2->z, pIn2->n);.
8b00: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f    }.  memcpy(&pO
8b10: 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20  ut->z[pIn2->n], 
8b20: 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e  pIn1->z, pIn1->n
8b30: 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79  );.  pOut->z[nBy
8b40: 74 65 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d  te] = 0;.  pOut-
8b50: 3e 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b  >z[nByte+1] = 0;
8b60: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c  .  pOut->flags |
8b70: 3d 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f  = MEM_Term;.  pO
8b80: 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79  ut->n = (int)nBy
8b90: 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  te;.  pOut->enc 
8ba0: 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50  = encoding;.  UP
8bb0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
8bc0: 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
8bd0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
8be0: 41 64 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Add P1 P2 P3 * *
8bf0: 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76  .**.** Add the v
8c00: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
8c10: 20 50 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65   P1 to the value
8c20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
8c30: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
8c40: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
8c50: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
8c60: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
8c70: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
8c80: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
8c90: 63 6f 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50  code: Multiply P
8ca0: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
8cb0: 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68  *.** Multiply th
8cc0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
8cd0: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
8ce0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
8cf0: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
8d00: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
8d10: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
8d20: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
8d30: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
8d40: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
8d50: 20 4f 70 63 6f 64 65 3a 20 53 75 62 74 72 61 63   Opcode: Subtrac
8d60: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
8d70: 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74 20 74 68  *.** Subtract th
8d80: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
8d90: 74 65 72 20 50 31 20 66 72 6f 6d 20 74 68 65 20  ter P1 from the 
8da0: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
8db0: 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  r P2.** and stor
8dc0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
8dd0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
8de0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
8df0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
8e00: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
8e10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69 76 69 64  /* Opcode: Divid
8e20: 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
8e30: 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20  *.** Divide the 
8e40: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
8e50: 72 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75  r P1 by the valu
8e60: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
8e70: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
8e80: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
8e90: 73 74 65 72 20 50 33 2e 20 20 49 66 20 74 68 65  ster P3.  If the
8ea0: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
8eb0: 65 72 20 50 32 0a 2a 2a 20 69 73 20 7a 65 72 6f  er P2.** is zero
8ec0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
8ed0: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
8ee0: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
8ef0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c   NULL, the resul
8f00: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a  t is NULL..*/./*
8f10: 20 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64   Opcode: Remaind
8f20: 65 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  er P1 P2 P3 * *.
8f30: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
8f40: 65 20 72 65 6d 61 69 6e 64 65 72 20 61 66 74 65  e remainder afte
8f50: 72 20 69 6e 74 65 67 65 72 20 64 69 76 69 73 69  r integer divisi
8f60: 6f 6e 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  on of the value 
8f70: 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  in.** register P
8f80: 31 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69  1 by the value i
8f90: 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  n register P2 an
8fa0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
8fb0: 6c 74 20 69 6e 20 50 33 2e 20 0a 2a 2a 20 49 66  lt in P3. .** If
8fc0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
8fd0: 67 69 73 74 65 72 20 50 32 20 69 73 20 7a 65 72  gister P2 is zer
8fe0: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  o the result is 
8ff0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68  NULL..** If eith
9000: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
9010: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
9020: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20  s NULL..*/.case 
9030: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20  OP_Add:         
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9050: 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e  e as TK_PLUS, in
9060: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
9070: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
9080: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
9090: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e  * same as TK_MIN
90a0: 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  US, in1, in2, ou
90b0: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75  t3 */.case OP_Mu
90c0: 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20 20 20  ltiply:         
90d0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
90e0: 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e  TK_STAR, in1, in
90f0: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
9100: 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20 20 20  OP_Divide:      
9110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
9120: 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69  e as TK_SLASH, i
9130: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
9140: 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64  .case OP_Remaind
9150: 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  er: {           
9160: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 45  /* same as TK_RE
9170: 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  M, in1, in2, out
9180: 33 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  3 */.  int flags
9190: 3b 0a 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63  ;.  applyNumeric
91a0: 41 66 66 69 6e 69 74 79 28 70 49 6e 31 29 3b 0a  Affinity(pIn1);.
91b0: 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66    applyNumericAf
91c0: 66 69 6e 69 74 79 28 70 49 6e 32 29 3b 0a 20 20  finity(pIn2);.  
91d0: 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e 66 6c  flags = pIn1->fl
91e0: 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67  ags | pIn2->flag
91f0: 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  s;.  if( (flags 
9200: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
9210: 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63   goto arithmetic
9220: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b  _result_is_null;
9230: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
9240: 61 67 73 20 26 20 70 49 6e 32 2d 3e 66 6c 61 67  ags & pIn2->flag
9250: 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 4d 45  s & MEM_Int)==ME
9260: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 69 36 34  M_Int ){.    i64
9270: 20 61 2c 20 62 3b 0a 20 20 20 20 61 20 3d 20 70   a, b;.    a = p
9280: 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 20  In1->u.i;.    b 
9290: 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn2->u.i;.   
92a0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
92b0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
92c0: 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20  se OP_Add:      
92d0: 20 20 20 62 20 2b 3d 20 61 3b 20 20 20 20 20 20     b += a;      
92e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
92f0: 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20  se OP_Subtract: 
9300: 20 20 20 62 20 2d 3d 20 61 3b 20 20 20 20 20 20     b -= a;      
9310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9320: 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20  se OP_Multiply: 
9330: 20 20 20 62 20 2a 3d 20 61 3b 20 20 20 20 20 20     b *= a;      
9340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9350: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
9360: 20 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30          if( a==0
9370: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
9380: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
9390: 6c 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 69  l;.        /* Di
93a0: 76 69 64 69 6e 67 20 74 68 65 20 6c 61 72 67 65  viding the large
93b0: 73 74 20 70 6f 73 73 69 62 6c 65 20 6e 65 67 61  st possible nega
93c0: 74 69 76 65 20 36 34 2d 62 69 74 20 69 6e 74 65  tive 64-bit inte
93d0: 67 65 72 20 28 31 3c 3c 36 33 29 20 62 79 20 0a  ger (1<<63) by .
93e0: 20 20 20 20 20 20 20 20 2a 2a 20 2d 31 20 72 65          ** -1 re
93f0: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
9400: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 74   too large to st
9410: 6f 72 65 20 69 6e 20 61 20 36 34 2d 62 69 74 20  ore in a 64-bit 
9420: 64 61 74 61 2d 74 79 70 65 2e 20 4f 6e 0a 20 20  data-type. On.  
9430: 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 20 61 72        ** some ar
9440: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 65  chitectures, the
9450: 20 76 61 6c 75 65 20 6f 76 65 72 66 6c 6f 77 73   value overflows
9460: 20 74 6f 20 28 31 3c 3c 36 33 29 2e 20 4f 6e 20   to (1<<63). On 
9470: 6f 74 68 65 72 73 2c 0a 20 20 20 20 20 20 20 20  others,.        
9480: 2a 2a 20 61 20 53 49 47 46 50 45 20 69 73 20 69  ** a SIGFPE is i
9490: 73 73 75 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f  ssued. The follo
94a0: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 6e  wing statement n
94b0: 6f 72 6d 61 6c 69 7a 65 73 20 74 68 69 73 0a 20  ormalizes this. 
94c0: 20 20 20 20 20 20 20 2a 2a 20 62 65 68 61 76 69         ** behavi
94d0: 6f 72 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 61  or so that all a
94e0: 72 63 68 69 74 65 63 74 75 72 65 73 20 62 65 68  rchitectures beh
94f0: 61 76 65 20 61 73 20 69 66 20 69 6e 74 65 67 65  ave as if intege
9500: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 76  r .        ** ov
9510: 65 72 66 6c 6f 77 20 6f 63 63 75 72 72 65 64 2e  erflow occurred.
9520: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9530: 20 20 20 20 69 66 28 20 61 3d 3d 2d 31 20 26 26      if( a==-1 &&
9540: 20 62 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54   b==SMALLEST_INT
9550: 36 34 20 29 20 61 20 3d 20 31 3b 0a 20 20 20 20  64 ) a = 1;.    
9560: 20 20 20 20 62 20 2f 3d 20 61 3b 0a 20 20 20 20      b /= a;.    
9570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9580: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
9590: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
95a0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  a==0 ) goto arit
95b0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
95c0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
95d0: 66 28 20 61 3d 3d 2d 31 20 29 20 61 20 3d 20 31  f( a==-1 ) a = 1
95e0: 3b 0a 20 20 20 20 20 20 20 20 62 20 25 3d 20 61  ;.        b %= a
95f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9610: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 62     pOut->u.i = b
9620: 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
9630: 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
9640: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
9650: 20 20 64 6f 75 62 6c 65 20 61 2c 20 62 3b 0a 20    double a, b;. 
9660: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 56 64     a = sqlite3Vd
9670: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31  beRealValue(pIn1
9680: 29 3b 0a 20 20 20 20 62 20 3d 20 73 71 6c 69 74  );.    b = sqlit
9690: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
96a0: 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63  pIn2);.    switc
96b0: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
96c0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
96d0: 41 64 64 3a 20 20 20 20 20 20 20 20 20 62 20 2b  Add:         b +
96e0: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
96f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
9700: 53 75 62 74 72 61 63 74 3a 20 20 20 20 62 20 2d  Subtract:    b -
9710: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
9720: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
9730: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 62 20 2a  Multiply:    b *
9740: 3d 20 61 3b 20 20 20 20 20 20 20 62 72 65 61 6b  = a;       break
9750: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
9760: 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20  Divide: {.      
9770: 20 20 69 66 28 20 61 3d 3d 30 2e 30 20 29 20 67    if( a==0.0 ) g
9780: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
9790: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
97a0: 20 20 20 20 20 20 20 62 20 2f 3d 20 61 3b 0a 20         b /= a;. 
97b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
97c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
97d0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
97e0: 36 34 20 69 61 20 3d 20 28 69 36 34 29 61 3b 0a  64 ia = (i64)a;.
97f0: 20 20 20 20 20 20 20 20 69 36 34 20 69 62 20 3d          i64 ib =
9800: 20 28 69 36 34 29 62 3b 0a 20 20 20 20 20 20 20   (i64)b;.       
9810: 20 69 66 28 20 69 61 3d 3d 30 20 29 20 67 6f 74   if( ia==0 ) got
9820: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
9830: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20  ult_is_null;.   
9840: 20 20 20 20 20 69 66 28 20 69 61 3d 3d 2d 31 20       if( ia==-1 
9850: 29 20 69 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  ) ia = 1;.      
9860: 20 20 62 20 3d 20 28 64 6f 75 62 6c 65 29 28 69    b = (double)(i
9870: 62 20 25 20 69 61 29 3b 0a 20 20 20 20 20 20 20  b % ia);.       
9880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9890: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
98a0: 6c 69 74 65 33 49 73 4e 61 4e 28 62 29 20 29 7b  lite3IsNaN(b) ){
98b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 72 69 74  .      goto arit
98c0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
98d0: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  _null;.    }.   
98e0: 20 70 4f 75 74 2d 3e 72 20 3d 20 62 3b 0a 20 20   pOut->r = b;.  
98f0: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
9900: 28 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29  (pOut, MEM_Real)
9910: 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
9920: 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20   & MEM_Real)==0 
9930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9940: 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e  VdbeIntegerAffin
9950: 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d  ity(pOut);.    }
9960: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61  .  }.  break;..a
9970: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
9980: 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69  _is_null:.  sqli
9990: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
99a0: 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  l(pOut);.  break
99b0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
99c0: 43 6f 6c 6c 53 65 71 20 2a 20 2a 20 50 34 0a 2a  CollSeq * * P4.*
99d0: 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
99e0: 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c 6c 53 65  nter to a CollSe
99f0: 71 20 73 74 72 75 63 74 2e 20 49 66 20 74 68 65  q struct. If the
9a00: 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 20   next call to a 
9a10: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  user function.**
9a20: 20 6f 72 20 61 67 67 72 65 67 61 74 65 20 63 61   or aggregate ca
9a30: 6c 6c 73 20 73 71 6c 69 74 65 33 47 65 74 46 75  lls sqlite3GetFu
9a40: 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20 74 68 69  ncCollSeq(), thi
9a50: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
9a60: 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  ence will.** be 
9a70: 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 69  returned. This i
9a80: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 75  s used by the bu
9a90: 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c 20 6d 61  ilt-in min(), ma
9aa0: 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69 66 28 29  x() and nullif()
9ab0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  .** functions..*
9ac0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
9ad0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ce used by the i
9ae0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
9af0: 20 74 68 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f   the aforementio
9b00: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ned functions.**
9b10: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
9b20: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9b30: 6e 63 65 20 73 65 74 20 62 79 20 74 68 69 73 20  nce set by this 
9b40: 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 76  opcode is not av
9b50: 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69  ailable.** publi
9b60: 63 6c 79 2c 20 6f 6e 6c 79 20 74 6f 20 75 73 65  cly, only to use
9b70: 72 20 66 75 6e 63 74 69 6f 6e 73 20 64 65 66 69  r functions defi
9b80: 6e 65 64 20 69 6e 20 66 75 6e 63 2e 63 2e 0a 2a  ned in func.c..*
9b90: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53 65  /.case OP_CollSe
9ba0: 71 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  q: {.  assert( p
9bb0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
9bc0: 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 62 72 65 61  OLLSEQ );.  brea
9bd0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
9be0: 20 46 75 6e 63 74 69 6f 6e 20 50 31 20 50 32 20   Function P1 P2 
9bf0: 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 49  P3 P4 P5.**.** I
9c00: 6e 76 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e  nvoke a user fun
9c10: 63 74 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70  ction (P4 is a p
9c20: 6f 69 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63  ointer to a Func
9c30: 74 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 74  tion structure t
9c40: 68 61 74 0a 2a 2a 20 64 65 66 69 6e 65 73 20 74  hat.** defines t
9c50: 68 65 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 74  he function) wit
9c60: 68 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 74  h P5 arguments t
9c70: 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74  aken from regist
9c80: 65 72 20 50 32 20 61 6e 64 0a 2a 2a 20 73 75 63  er P2 and.** suc
9c90: 63 65 73 73 6f 72 73 2e 20 20 54 68 65 20 72 65  cessors.  The re
9ca0: 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63  sult of the func
9cb0: 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69  tion is stored i
9cc0: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
9cd0: 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 6d 75  * Register P3 mu
9ce0: 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65 20 6f 66  st not be one of
9cf0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e   the function in
9d00: 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69  puts..**.** P1 i
9d10: 73 20 61 20 33 32 2d 62 69 74 20 62 69 74 6d 61  s a 32-bit bitma
9d20: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
9d30: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 65 61 63  ether or not eac
9d40: 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  h argument to th
9d50: 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  e .** function w
9d60: 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 6f  as determined to
9d70: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 61 74 20   be constant at 
9d80: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e 20 49 66  compile time. If
9d90: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
9da0: 67 75 6d 65 6e 74 20 77 61 73 20 63 6f 6e 73 74  gument was const
9db0: 61 6e 74 20 74 68 65 6e 20 62 69 74 20 30 20 6f  ant then bit 0 o
9dc0: 66 20 50 31 20 69 73 20 73 65 74 2e 20 54 68 69  f P1 is set. Thi
9dd0: 73 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  s is used to det
9de0: 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65  ermine.** whethe
9df0: 72 20 6d 65 74 61 20 64 61 74 61 20 61 73 73 6f  r meta data asso
9e00: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 75 73  ciated with a us
9e10: 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  er function argu
9e20: 6d 65 6e 74 20 75 73 69 6e 67 20 74 68 65 0a 2a  ment using the.*
9e30: 2a 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75  * sqlite3_set_au
9e40: 78 64 61 74 61 28 29 20 41 50 49 20 6d 61 79 20  xdata() API may 
9e50: 62 65 20 73 61 66 65 6c 79 20 72 65 74 61 69 6e  be safely retain
9e60: 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  ed until the nex
9e70: 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 20  t.** invocation 
9e80: 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  of this opcode..
9e90: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
9ea0: 41 67 67 53 74 65 70 20 61 6e 64 20 41 67 67 46  AggStep and AggF
9eb0: 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  inal.*/.case OP_
9ec0: 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20 69 6e  Function: {.  in
9ed0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67  t i;.  Mem *pArg
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ;.  sqlite3_cont
9ef0: 65 78 74 20 63 74 78 3b 0a 20 20 73 71 6c 69 74  ext ctx;.  sqlit
9f00: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
9f10: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 4f 70 2d  ;.  int n = pOp-
9f20: 3e 70 35 3b 0a 0a 20 20 61 70 56 61 6c 20 3d 20  >p5;..  apVal = 
9f30: 70 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65  p->apArg;.  asse
9f40: 72 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d  rt( apVal || n==
9f50: 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
9f60: 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32  n==0 || (pOp->p2
9f70: 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c  >0 && pOp->p2+n<
9f80: 3d 70 2d 3e 6e 4d 65 6d 29 20 29 3b 0a 20 20 61  =p->nMem) );.  a
9f90: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70  ssert( pOp->p3<p
9fa0: 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70  Op->p2 || pOp->p
9fb0: 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a  3>=pOp->p2+n );.
9fc0: 20 20 70 41 72 67 20 3d 20 26 70 2d 3e 61 4d 65    pArg = &p->aMe
9fd0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 66 6f  m[pOp->p2];.  fo
9fe0: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  r(i=0; i<n; i++,
9ff0: 20 70 41 72 67 2b 2b 29 7b 0a 20 20 20 20 61 70   pArg++){.    ap
a000: 56 61 6c 5b 69 5d 20 3d 20 70 41 72 67 3b 0a 20  Val[i] = pArg;. 
a010: 20 20 20 73 74 6f 72 65 54 79 70 65 49 6e 66 6f     storeTypeInfo
a020: 28 70 41 72 67 2c 20 65 6e 63 6f 64 69 6e 67 29  (pArg, encoding)
a030: 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
a040: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 41  RACE(pOp->p2, pA
a050: 72 67 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rg);.  }..  asse
a060: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
a070: 3d 50 34 5f 46 55 4e 43 44 45 46 20 7c 7c 20 70  =P4_FUNCDEF || p
a080: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 56  Op->p4type==P4_V
a090: 44 42 45 46 55 4e 43 20 29 3b 0a 20 20 69 66 28  DBEFUNC );.  if(
a0a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
a0b0: 5f 46 55 4e 43 44 45 46 20 29 7b 0a 20 20 20 20  _FUNCDEF ){.    
a0c0: 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d  ctx.pFunc = pOp-
a0d0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 63  >p4.pFunc;.    c
a0e0: 74 78 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 30  tx.pVdbeFunc = 0
a0f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
a100: 74 78 2e 70 56 64 62 65 46 75 6e 63 20 3d 20 28  tx.pVdbeFunc = (
a110: 56 64 62 65 46 75 6e 63 2a 29 70 4f 70 2d 3e 70  VdbeFunc*)pOp->p
a120: 34 2e 70 56 64 62 65 46 75 6e 63 3b 0a 20 20 20  4.pVdbeFunc;.   
a130: 20 63 74 78 2e 70 46 75 6e 63 20 3d 20 63 74 78   ctx.pFunc = ctx
a140: 2e 70 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e  .pVdbeFunc->pFun
a150: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
a160: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
a170: 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
a180: 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  );.  pOut = &p->
a190: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
a1a0: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d   ctx.s.flags = M
a1b0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 63 74 78 2e 73  EM_Null;.  ctx.s
a1c0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78 2e  .db = db;.  ctx.
a1d0: 73 2e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74  s.xDel = 0;.  ct
a1e0: 78 2e 73 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  x.s.zMalloc = 0;
a1f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75  ..  /* The outpu
a200: 74 20 63 65 6c 6c 20 6d 61 79 20 61 6c 72 65 61  t cell may alrea
a210: 64 79 20 68 61 76 65 20 61 20 62 75 66 66 65 72  dy have a buffer
a220: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 4d 6f 76 65   allocated. Move
a230: 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
a240: 72 20 74 6f 20 63 74 78 2e 73 20 73 6f 20 69 6e  r to ctx.s so in
a250: 20 63 61 73 65 20 74 68 65 20 75 73 65 72 2d 66   case the user-f
a260: 75 6e 63 74 69 6f 6e 20 63 61 6e 20 75 73 65 0a  unction can use.
a270: 20 20 2a 2a 20 74 68 65 20 61 6c 72 65 61 64 79    ** the already
a280: 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
a290: 72 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6c 6c  r instead of all
a2a0: 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  ocating a new on
a2b0: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
a2c0: 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 26 63 74  3VdbeMemMove(&ct
a2d0: 78 2e 73 2c 20 70 4f 75 74 29 3b 0a 20 20 4d 65  x.s, pOut);.  Me
a2e0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 63 74  mSetTypeFlag(&ct
a2f0: 78 2e 73 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  x.s, MEM_Null);.
a300: 0a 20 20 63 74 78 2e 69 73 45 72 72 6f 72 20 3d  .  ctx.isError =
a310: 20 30 3b 0a 20 20 69 66 28 20 63 74 78 2e 70 46   0;.  if( ctx.pF
a320: 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  unc->flags & SQL
a330: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
a340: 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  L ){.    assert(
a350: 20 70 4f 70 3e 70 2d 3e 61 4f 70 20 29 3b 0a 20   pOp>p->aOp );. 
a360: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
a370: 31 5d 2e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f  1].p4type==P4_CO
a380: 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 61 73 73  LLSEQ );.    ass
a390: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
a3a0: 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20  ode==OP_CollSeq 
a3b0: 29 3b 0a 20 20 20 20 63 74 78 2e 70 43 6f 6c 6c  );.    ctx.pColl
a3c0: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 70 43   = pOp[-1].p4.pC
a3d0: 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  oll;.  }.  if( s
a3e0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
a3f0: 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  db) ) goto abort
a400: 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a  _due_to_misuse;.
a410: 20 20 28 2a 63 74 78 2e 70 46 75 6e 63 2d 3e 78    (*ctx.pFunc->x
a420: 46 75 6e 63 29 28 26 63 74 78 2c 20 6e 2c 20 61  Func)(&ctx, n, a
a430: 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  pVal);.  if( sql
a440: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29  ite3SafetyOn(db)
a450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a460: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
a470: 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  tx.s);.    goto 
a480: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
a490: 75 73 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  use;.  }.  if( d
a4a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a4b0: 29 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  ){.    /* Even t
a4c0: 68 6f 75 67 68 20 61 20 6d 61 6c 6c 6f 63 28 29  hough a malloc()
a4d0: 20 68 61 73 20 66 61 69 6c 65 64 2c 20 74 68 65   has failed, the
a4e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
a4f0: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 75 73  of the.    ** us
a500: 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  er function may 
a510: 68 61 76 65 20 63 61 6c 6c 65 64 20 61 6e 20 73  have called an s
a520: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 58 58  qlite3_result_XX
a530: 58 28 29 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  X() function.   
a540: 20 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 20   ** to return a 
a550: 76 61 6c 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  value. The follo
a560: 77 69 6e 67 20 63 61 6c 6c 20 72 65 6c 65 61 73  wing call releas
a570: 65 73 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73  es any resources
a580: 0a 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 74  .    ** associat
a590: 65 64 20 77 69 74 68 20 73 75 63 68 20 61 20 76  ed with such a v
a5a0: 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  alue..    **.   
a5b0: 20 2a 2a 20 4e 6f 74 65 3a 20 4d 61 79 62 65 20   ** Note: Maybe 
a5c0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 73 68 6f  MemRelease() sho
a5d0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 66  uld be called if
a5e0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e   sqlite3SafetyOn
a5f0: 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73 20  ().    ** fails 
a600: 61 6c 73 6f 20 28 74 68 65 20 69 66 28 2e 2e 2e  also (the if(...
a610: 29 20 73 74 61 74 65 6d 65 6e 74 20 61 62 6f 76  ) statement abov
a620: 65 29 2e 20 42 75 74 20 69 66 20 70 65 6f 70 6c  e). But if peopl
a630: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6d 69 73  e are.    ** mis
a640: 75 73 69 6e 67 20 73 71 6c 69 74 65 2c 20 74 68  using sqlite, th
a650: 65 79 20 68 61 76 65 20 62 69 67 67 65 72 20 70  ey have bigger p
a660: 72 6f 62 6c 65 6d 73 20 74 68 61 6e 20 61 20 6c  roblems than a l
a670: 65 61 6b 65 64 20 76 61 6c 75 65 2e 0a 20 20 20  eaked value..   
a680: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
a690: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
a6a0: 74 78 2e 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  tx.s);.    goto 
a6b0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f  no_mem;.  }..  /
a6c0: 2a 20 49 66 20 61 6e 79 20 61 75 78 69 6c 69 61  * If any auxilia
a6d0: 72 79 20 64 61 74 61 20 66 75 6e 63 74 69 6f 6e  ry data function
a6e0: 73 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c  s have been call
a6f0: 65 64 20 62 79 20 74 68 69 73 20 75 73 65 72 20  ed by this user 
a700: 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 69  function,.  ** i
a710: 6d 6d 65 64 69 61 74 65 6c 79 20 63 61 6c 6c 20  mmediately call 
a720: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
a730: 6f 72 20 61 6e 79 20 6e 6f 6e 2d 73 74 61 74 69  or any non-stati
a740: 63 20 76 61 6c 75 65 73 2e 0a 20 20 2a 2f 0a 20  c values..  */. 
a750: 20 69 66 28 20 63 74 78 2e 70 56 64 62 65 46 75   if( ctx.pVdbeFu
a760: 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
a770: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
a780: 74 61 28 63 74 78 2e 70 56 64 62 65 46 75 6e 63  ta(ctx.pVdbeFunc
a790: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
a7a0: 70 4f 70 2d 3e 70 34 2e 70 56 64 62 65 46 75 6e  pOp->p4.pVdbeFun
a7b0: 63 20 3d 20 63 74 78 2e 70 56 64 62 65 46 75 6e  c = ctx.pVdbeFun
a7c0: 63 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  c;.    pOp->p4ty
a7d0: 70 65 20 3d 20 50 34 5f 56 44 42 45 46 55 4e 43  pe = P4_VDBEFUNC
a7e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
a7f0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
a800: 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 74  rned an error, t
a810: 68 72 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f  hrow an exceptio
a820: 6e 20 2a 2f 0a 20 20 69 66 28 20 63 74 78 2e 69  n */.  if( ctx.i
a830: 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 73 71  sError ){.    sq
a840: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
a850: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
a860: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  "%s", sqlite3_va
a870: 6c 75 65 5f 74 65 78 74 28 26 63 74 78 2e 73 29  lue_text(&ctx.s)
a880: 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 74 78 2e  );.    rc = ctx.
a890: 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  isError;.  }..  
a8a0: 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 65 73 75  /* Copy the resu
a8b0: 6c 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  lt of the functi
a8c0: 6f 6e 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  on into register
a8d0: 20 50 33 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   P3 */.  sqlite3
a8e0: 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
a8f0: 6e 67 28 26 63 74 78 2e 73 2c 20 65 6e 63 6f 64  ng(&ctx.s, encod
a900: 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ing);.  sqlite3V
a910: 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c  dbeMemMove(pOut,
a920: 20 26 63 74 78 2e 73 29 3b 0a 20 20 69 66 28 20   &ctx.s);.  if( 
a930: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f  sqlite3VdbeMemTo
a940: 6f 42 69 67 28 70 4f 75 74 29 20 29 7b 0a 20 20  oBig(pOut) ){.  
a950: 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
a960: 20 20 7d 0a 20 20 52 45 47 49 53 54 45 52 5f 54    }.  REGISTER_T
a970: 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f  RACE(pOp->p3, pO
a980: 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ut);.  UPDATE_MA
a990: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
a9a0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
a9b0: 20 4f 70 63 6f 64 65 3a 20 42 69 74 41 6e 64 20   Opcode: BitAnd 
a9c0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
a9d0: 2a 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d  ** Take the bit-
a9e0: 77 69 73 65 20 41 4e 44 20 6f 66 20 74 68 65 20  wise AND of the 
a9f0: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
aa00: 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64  er P1 and P2 and
aa10: 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65  .** store the re
aa20: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
aa30: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
aa40: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
aa50: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
aa60: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
aa70: 65 3a 20 42 69 74 4f 72 20 50 31 20 50 32 20 50  e: BitOr P1 P2 P
aa80: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 61 6b 65  3 * *.**.** Take
aa90: 20 74 68 65 20 62 69 74 2d 77 69 73 65 20 4f 52   the bit-wise OR
aaa0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
aab0: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e  n register P1 an
aac0: 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72  d P2 and.** stor
aad0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
aae0: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
aaf0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
ab00: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
ab10: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
ab20: 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74  /* Opcode: Shift
ab30: 4c 65 66 74 20 50 31 20 50 32 20 50 33 20 2a 20  Left P1 P2 P3 * 
ab40: 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68  *.**.** Shift th
ab50: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
ab60: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74  in register P2 t
ab70: 6f 20 74 68 65 20 6c 65 66 74 20 62 79 20 74 68  o the left by th
ab80: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62  e.** number of b
ab90: 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62 79  its specified by
aba0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e 20   the integer in 
abb0: 72 65 67 69 73 65 72 20 50 31 2e 0a 2a 2a 20 53  regiser P1..** S
abc0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
abd0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
abe0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
abf0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
ac00: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
ac10: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
ac20: 69 66 74 52 69 67 68 74 20 50 31 20 50 32 20 50  iftRight P1 P2 P
ac30: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 68 69 66  3 * *.**.** Shif
ac40: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  t the integer va
ac50: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
ac60: 50 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  P2 to the right 
ac70: 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  by the.** number
ac80: 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66 69   of bits specifi
ac90: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67 65  ed by the intege
aca0: 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  r in register P1
acb0: 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72  ..** Store the r
acc0: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
acd0: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
ace0: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
acf0: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
ad00: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
ad10: 5f 42 69 74 41 6e 64 3a 20 20 20 20 20 20 20 20  _BitAnd:        
ad20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ad30: 20 61 73 20 54 4b 5f 42 49 54 41 4e 44 2c 20 69   as TK_BITAND, i
ad40: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ad50: 0a 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20  .case OP_BitOr: 
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
ad80: 49 54 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  ITOR, in1, in2, 
ad90: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
ada0: 53 68 69 66 74 4c 65 66 74 3a 20 20 20 20 20 20  ShiftLeft:      
adb0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
adc0: 61 73 20 54 4b 5f 4c 53 48 49 46 54 2c 20 69 6e  as TK_LSHIFT, in
add0: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
ade0: 63 61 73 65 20 4f 50 5f 53 68 69 66 74 52 69 67  case OP_ShiftRig
adf0: 68 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ht: {           
ae00: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 52 53  /* same as TK_RS
ae10: 48 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  HIFT, in1, in2, 
ae20: 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20 61 2c  out3 */.  i64 a,
ae30: 20 62 3b 0a 0a 20 20 69 66 28 20 28 70 49 6e 31   b;..  if( (pIn1
ae40: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
ae50: 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c  flags) & MEM_Nul
ae60: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
ae70: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
ae80: 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Out);.    break;
ae90: 0a 20 20 7d 0a 20 20 61 20 3d 20 73 71 6c 69 74  .  }.  a = sqlit
aea0: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
aeb0: 49 6e 32 29 3b 0a 20 20 62 20 3d 20 73 71 6c 69  In2);.  b = sqli
aec0: 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
aed0: 70 49 6e 31 29 3b 0a 20 20 73 77 69 74 63 68 28  pIn1);.  switch(
aee0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
aef0: 20 20 20 20 63 61 73 65 20 4f 50 5f 42 69 74 41      case OP_BitA
af00: 6e 64 3a 20 20 20 20 20 20 61 20 26 3d 20 62 3b  nd:      a &= b;
af10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af20: 63 61 73 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20  case OP_BitOr:  
af30: 20 20 20 20 20 61 20 7c 3d 20 62 3b 20 20 20 20       a |= b;    
af40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
af50: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20   OP_ShiftLeft:  
af60: 20 61 20 3c 3c 3d 20 62 3b 20 20 20 20 62 72 65   a <<= b;    bre
af70: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
af80: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
af90: 70 63 6f 64 65 3d 3d 4f 50 5f 53 68 69 66 74 52  pcode==OP_ShiftR
afa0: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ight );.        
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 61 20 3e 3e 3d 20 62 3b 20 20 20 20 62 72 65   a >>= b;    bre
afd0: 61 6b 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e  ak;.  }.  pOut->
afe0: 75 2e 69 20 3d 20 61 3b 0a 20 20 4d 65 6d 53 65  u.i = a;.  MemSe
aff0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
b000: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61  MEM_Int);.  brea
b010: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
b020: 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a   AddImm  P1 P2 *
b030: 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20   * *.** .** Add 
b040: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20  the constant P2 
b050: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
b060: 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20  register P1..** 
b070: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c  The result is al
b080: 77 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  ways an integer.
b090: 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20  .**.** To force 
b0a0: 61 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20  any register to 
b0b0: 62 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a  be an integer, j
b0c0: 75 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61  ust add 0..*/.ca
b0d0: 73 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20  se OP_AddImm: { 
b0e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
b0f0: 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  1 */.  sqlite3Vd
b100: 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79 28  beMemIntegerify(
b110: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 75  pIn1);.  pIn1->u
b120: 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  .i += pOp->p2;. 
b130: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b140: 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e 74 20  code: MustBeInt 
b150: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 0a  P1 P2 * * *.** .
b160: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
b170: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b180: 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  1 to be an integ
b190: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
b1a0: 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20 6e 6f  e.** in P1 is no
b1b0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64  t an integer and
b1c0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
b1d0: 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74  rted into an int
b1e0: 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75 74 20  eger.** without 
b1f0: 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65 6e 20  data loss, then 
b200: 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
b210: 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20 50 32   to P2, or if P2
b220: 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61 6e 20  ==0.** raise an 
b230: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
b240: 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  exception..*/.ca
b250: 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 3a  se OP_MustBeInt:
b260: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
b270: 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
b280: 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49  applyAffinity(pI
b290: 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  n1, SQLITE_AFF_N
b2a0: 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e 67  UMERIC, encoding
b2b0: 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
b2c0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
b2d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
b2e0: 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20  Op->p2==0 ){.   
b2f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4d     rc = SQLITE_M
b300: 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 67  ISMATCH;.      g
b310: 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
b320: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  _error;.    }els
b330: 65 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  e{.      pc = pO
b340: 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d  p->p2 - 1;.    }
b350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65  .  }else{.    Me
b360: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e  mSetTypeFlag(pIn
b370: 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  1, MEM_Int);.  }
b380: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
b390: 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69  Opcode: RealAffi
b3a0: 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  nity P1 * * * *.
b3b0: 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65  **.** If registe
b3c0: 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e  r P1 holds an in
b3d0: 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74  teger convert it
b3e0: 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65   to a real value
b3f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
b400: 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  ode is used when
b410: 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f   extracting info
b420: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63  rmation from a c
b430: 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61  olumn that.** ha
b440: 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e  s REAL affinity.
b450: 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61    Such column va
b460: 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  lues may still b
b470: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69  e stored as.** i
b480: 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61  ntegers, for spa
b490: 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62  ce efficiency, b
b4a0: 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63 74  ut after extract
b4b0: 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d  ion we want them
b4c0: 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79  .** to have only
b4d0: 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a   a real value..*
b4e0: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66  /.case OP_RealAf
b4f0: 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20  finity: {       
b500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
b510: 31 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e 31 2d  1 */.  if( pIn1-
b520: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
b530: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
b540: 64 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49  dbeMemRealify(pI
b550: 6e 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  n1);.  }.  break
b560: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
b570: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a  ITE_OMIT_CAST./*
b580: 20 4f 70 63 6f 64 65 3a 20 54 6f 54 65 78 74 20   Opcode: ToText 
b590: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
b5a0: 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c 75 65   Force the value
b5b0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b5c0: 74 6f 20 62 65 20 74 65 78 74 2e 0a 2a 2a 20 49  to be text..** I
b5d0: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
b5e0: 75 6d 65 72 69 63 2c 20 63 6f 6e 76 65 72 74 20  umeric, convert 
b5f0: 69 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 75  it to a string u
b600: 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71 75 69  sing the.** equi
b610: 76 61 6c 65 6e 74 20 6f 66 20 70 72 69 6e 74 66  valent of printf
b620: 28 29 2e 20 20 42 6c 6f 62 20 76 61 6c 75 65 73  ().  Blob values
b630: 20 61 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61   are unchanged a
b640: 6e 64 0a 2a 2a 20 61 72 65 20 61 66 74 65 72 77  nd.** are afterw
b650: 61 72 64 73 20 73 69 6d 70 6c 79 20 69 6e 74 65  ards simply inte
b660: 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74 2e  rpreted as text.
b670: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76 61  .**.** A NULL va
b680: 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  lue is not chang
b690: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
b6a0: 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73 20  ne.  It remains 
b6b0: 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  NULL..*/.case OP
b6c0: 5f 54 6f 54 65 78 74 3a 20 7b 20 20 20 20 20 20  _ToText: {      
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b6e0: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 54 45 58  ame as TK_TO_TEX
b6f0: 54 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20  T, in1 */.  if( 
b700: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
b710: 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61 6b 3b 0a  M_Null ) break;.
b720: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 5f 53 74    assert( MEM_St
b730: 72 3d 3d 28 4d 45 4d 5f 42 6c 6f 62 3e 3e 33 29  r==(MEM_Blob>>3)
b740: 20 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67   );.  pIn1->flag
b750: 73 20 7c 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67  s |= (pIn1->flag
b760: 73 26 4d 45 4d 5f 42 6c 6f 62 29 3e 3e 33 3b 0a  s&MEM_Blob)>>3;.
b770: 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
b780: 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46  pIn1, SQLITE_AFF
b790: 5f 54 45 58 54 2c 20 65 6e 63 6f 64 69 6e 67 29  _TEXT, encoding)
b7a0: 3b 0a 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42  ;.  rc = ExpandB
b7b0: 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 61 73 73  lob(pIn1);.  ass
b7c0: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
b7d0: 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c 20 64 62   & MEM_Str || db
b7e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b7f0: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
b800: 26 3d 20 7e 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  &= ~(MEM_Int|MEM
b810: 5f 52 65 61 6c 7c 4d 45 4d 5f 42 6c 6f 62 7c 4d  _Real|MEM_Blob|M
b820: 45 4d 5f 5a 65 72 6f 29 3b 0a 20 20 55 50 44 41  EM_Zero);.  UPDA
b830: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
b840: 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pIn1);.  break;.
b850: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 6f  }../* Opcode: To
b860: 42 6c 6f 62 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  Blob P1 * * * *.
b870: 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20  **.** Force the 
b880: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b890: 72 20 50 31 20 74 6f 20 62 65 20 61 20 42 4c 4f  r P1 to be a BLO
b8a0: 42 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  B..** If the val
b8b0: 75 65 20 69 73 20 6e 75 6d 65 72 69 63 2c 20 63  ue is numeric, c
b8c0: 6f 6e 76 65 72 74 20 69 74 20 74 6f 20 61 20 73  onvert it to a s
b8d0: 74 72 69 6e 67 20 66 69 72 73 74 2e 0a 2a 2a 20  tring first..** 
b8e0: 53 74 72 69 6e 67 73 20 61 72 65 20 73 69 6d 70  Strings are simp
b8f0: 6c 79 20 72 65 69 6e 74 65 72 70 72 65 74 65 64  ly reinterpreted
b900: 20 61 73 20 62 6c 6f 62 73 20 77 69 74 68 20 6e   as blobs with n
b910: 6f 20 63 68 61 6e 67 65 0a 2a 2a 20 74 6f 20 74  o change.** to t
b920: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
b930: 74 61 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  ta..**.** A NULL
b940: 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68   value is not ch
b950: 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72 6f  anged by this ro
b960: 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69  utine.  It remai
b970: 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65  ns NULL..*/.case
b980: 20 4f 50 5f 54 6f 42 6c 6f 62 3a 20 7b 20 20 20   OP_ToBlob: {   
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b9a0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f  * same as TK_TO_
b9b0: 42 4c 4f 42 2c 20 69 6e 31 20 2a 2f 0a 20 20 69  BLOB, in1 */.  i
b9c0: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
b9d0: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 20 62 72 65 61   MEM_Null ) brea
b9e0: 6b 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  k;.  if( (pIn1->
b9f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
ba00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 6c  )==0 ){.    appl
ba10: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
ba20: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c  SQLITE_AFF_TEXT,
ba30: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
ba40: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
ba50: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 7c 7c  ags & MEM_Str ||
ba60: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ba70: 64 20 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 53 65  d );.  }.  MemSe
ba80: 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31 2c 20  tTypeFlag(pIn1, 
ba90: 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20 20 55 50 44  MEM_Blob);.  UPD
baa0: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
bab0: 28 70 49 6e 31 29 3b 0a 20 20 62 72 65 61 6b 3b  (pIn1);.  break;
bac0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54  .}../* Opcode: T
bad0: 6f 4e 75 6d 65 72 69 63 20 50 31 20 2a 20 2a 20  oNumeric P1 * * 
bae0: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65 20  * *.**.** Force 
baf0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
bb00: 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20 6e  ister P1 to be n
bb10: 75 6d 65 72 69 63 20 28 65 69 74 68 65 72 20 61  umeric (either a
bb20: 6e 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6f 72 20  n.** integer or 
bb30: 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  a floating-point
bb40: 20 6e 75 6d 62 65 72 2e 29 0a 2a 2a 20 49 66 20   number.).** If 
bb50: 74 68 65 20 76 61 6c 75 65 20 69 73 20 74 65 78  the value is tex
bb60: 74 20 6f 72 20 62 6c 6f 62 2c 20 74 72 79 20 74  t or blob, try t
bb70: 6f 20 63 6f 6e 76 65 72 74 20 69 74 20 74 6f 20  o convert it to 
bb80: 61 6e 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  an using the.** 
bb90: 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74  equivalent of at
bba0: 6f 69 28 29 20 6f 72 20 61 74 6f 66 28 29 20 61  oi() or atof() a
bbb0: 6e 64 20 73 74 6f 72 65 20 30 20 69 66 20 6e 6f  nd store 0 if no
bbc0: 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f 6e   such conversion
bbd0: 20 0a 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65   .** is possible
bbe0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
bbf0: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
bc00: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
bc10: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
bc20: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
bc30: 50 5f 54 6f 4e 75 6d 65 72 69 63 3a 20 7b 20 20  P_ToNumeric: {  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f  /* same as TK_TO
bc60: 5f 4e 55 4d 45 52 49 43 2c 20 69 6e 31 20 2a 2f  _NUMERIC, in1 */
bc70: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
bc80: 61 67 73 20 26 20 28 4d 45 4d 5f 4e 75 6c 6c 7c  ags & (MEM_Null|
bc90: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
bca0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))==0 ){.    sql
bcb0: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6d 65 72  ite3VdbeMemNumer
bcc0: 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  ify(pIn1);.  }. 
bcd0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
bce0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
bcf0: 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  CAST */../* Opco
bd00: 64 65 3a 20 54 6f 49 6e 74 20 50 31 20 2a 20 2a  de: ToInt P1 * *
bd10: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65   * *.**.** Force
bd20: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
bd30: 67 69 73 74 65 72 20 50 31 20 62 65 20 61 6e 20  gister P1 be an 
bd40: 69 6e 74 65 67 65 72 2e 20 20 49 66 0a 2a 2a 20  integer.  If.** 
bd50: 54 68 65 20 76 61 6c 75 65 20 69 73 20 63 75 72  The value is cur
bd60: 72 65 6e 74 6c 79 20 61 20 72 65 61 6c 20 6e 75  rently a real nu
bd70: 6d 62 65 72 2c 20 64 72 6f 70 20 69 74 73 20 66  mber, drop its f
bd80: 72 61 63 74 69 6f 6e 61 6c 20 70 61 72 74 2e 0a  ractional part..
bd90: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
bda0: 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 2c  is text or blob,
bdb0: 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   try to convert 
bdc0: 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  it to an integer
bdd0: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65 71   using the.** eq
bde0: 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f 69  uivalent of atoi
bdf0: 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 20 69  () and store 0 i
be00: 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e 76 65 72  f no such conver
be10: 73 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65  sion is possible
be20: 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  ..**.** A NULL v
be30: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
be40: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
be50: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
be60: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
be70: 50 5f 54 6f 49 6e 74 3a 20 7b 20 20 20 20 20 20  P_ToInt: {      
be80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
be90: 61 6d 65 20 61 73 20 54 4b 5f 54 4f 5f 49 4e 54  ame as TK_TO_INT
bea0: 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 66 28 20 28  , in1 */.  if( (
beb0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
bec0: 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Null)==0 ){.  
bed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
bee0: 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29  Integerify(pIn1)
bef0: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
bf00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
bf10: 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f 70  _OMIT_CAST./* Op
bf20: 63 6f 64 65 3a 20 54 6f 52 65 61 6c 20 50 31 20  code: ToReal P1 
bf30: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 6f  * * * *.**.** Fo
bf40: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
bf50: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
bf60: 62 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  be a floating po
bf70: 69 6e 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 49  int number..** I
bf80: 66 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 63  f The value is c
bf90: 75 72 72 65 6e 74 6c 79 20 61 6e 20 69 6e 74 65  urrently an inte
bfa0: 67 65 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 2e  ger, convert it.
bfb0: 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
bfc0: 20 69 73 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   is text or blob
bfd0: 2c 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 72 74  , try to convert
bfe0: 20 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65   it to an intege
bff0: 72 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 65  r using the.** e
c000: 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 61 74 6f  quivalent of ato
c010: 69 28 29 20 61 6e 64 20 73 74 6f 72 65 20 30 2e  i() and store 0.
c020: 30 20 69 66 20 6e 6f 20 73 75 63 68 20 63 6f 6e  0 if no such con
c030: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 73 73 69  version is possi
c040: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  ble..**.** A NUL
c050: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
c060: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
c070: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
c080: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
c090: 65 20 4f 50 5f 54 6f 52 65 61 6c 3a 20 7b 20 20  e OP_ToReal: {  
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 54 4f  /* same as TK_TO
c0c0: 5f 52 45 41 4c 2c 20 69 6e 31 20 2a 2f 0a 20 20  _REAL, in1 */.  
c0d0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
c0e0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20   & MEM_Null)==0 
c0f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c100: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e  beMemRealify(pIn
c110: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
c120: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c130: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
c140: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20  ../* Opcode: Lt 
c150: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
c160: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
c170: 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
c180: 74 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20  ter P1 and P3.  
c190: 49 66 20 72 65 67 28 50 33 29 3c 72 65 67 28 50  If reg(P3)<reg(P
c1a0: 31 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  1) then.** jump 
c1b0: 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20 20  to address P2.  
c1c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
c1d0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
c1e0: 62 69 74 20 6f 66 20 50 35 20 69 73 20 73 65 74  bit of P5 is set
c1f0: 20 61 6e 64 20 65 69 74 68 65 72 20 72 65 67 28   and either reg(
c200: 50 31 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50 33  P1) or.** reg(P3
c210: 29 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  ) is NULL then t
c220: 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20 49  ake the jump.  I
c230: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d  f the SQLITE_JUM
c240: 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20  PIFNULL .** bit 
c250: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66 61  is clear then fa
c260: 6c 6c 20 74 68 72 75 20 69 66 20 65 69 74 68 65  ll thru if eithe
c270: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
c280: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  L..**.** The SQL
c290: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72  ITE_AFF_MASK por
c2a0: 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20  tion of P5 must 
c2b0: 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  be an affinity c
c2c0: 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51  haracter -.** SQ
c2d0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53  LITE_AFF_TEXT, S
c2e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c2f0: 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  R, and so forth.
c300: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
c310: 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63  ade .** to coerc
c320: 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63  e both inputs ac
c330: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
c340: 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
c350: 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  the.** compariso
c360: 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68  n is made. If th
c370: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
c380: 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20  K is 0x00, then 
c390: 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e  numeric.** affin
c3a0: 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74  ity is used. Not
c3b0: 65 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  e that the affin
c3c0: 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ity conversions 
c3d0: 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61  are stored.** ba
c3e0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75  ck into the inpu
c3f0: 74 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  t registers P1 a
c400: 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20  nd P3.  So this 
c410: 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65  opcode can cause
c420: 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63  .** persistent c
c430: 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74  hanges to regist
c440: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a  ers P1 and P3..*
c450: 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f  *.** Once any co
c460: 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74  nversions have t
c470: 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20  aken place, and 
c480: 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73  neither value is
c490: 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76   NULL, .** the v
c4a0: 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72  alues are compar
c4b0: 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  ed. If both valu
c4c0: 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65  es are blobs the
c4d0: 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a  n memcmp() is.**
c4e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c4f0: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ne the results o
c500: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
c510: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
c520: 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74  s.** are text, t
c530: 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  hen the appropri
c540: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ate collating fu
c550: 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  nction specified
c560: 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73   in.** P4 is  us
c570: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  ed to do the com
c580: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20  parison.  If P4 
c590: 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  is not specified
c5a0: 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28   then.** memcmp(
c5b0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ) is used to com
c5c0: 70 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67  pare text string
c5d0: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
c5e0: 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63  s are.** numeric
c5f0: 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63  , then a numeric
c600: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75   comparison is u
c610: 73 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20  sed. If the two 
c620: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66  values.** are of
c630: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
c640: 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61  , then numbers a
c650: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
c660: 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e  ss than.** strin
c670: 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  gs and strings a
c680: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
c690: 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
c6a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
c6b0: 54 45 5f 53 54 4f 52 45 50 32 20 62 69 74 20 6f  TE_STOREP2 bit o
c6c0: 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
c6d0: 6e 20 64 6f 20 6e 6f 74 20 6a 75 6d 70 2e 20 20  n do not jump.  
c6e0: 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 74 6f 72  Instead,.** stor
c6f0: 65 20 61 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  e a boolean resu
c700: 6c 74 20 28 65 69 74 68 65 72 20 30 2c 20 6f 72  lt (either 0, or
c710: 20 31 2c 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 20   1, or NULL) in 
c720: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
c730: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31  /* Opcode: Ne P1
c740: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
c750: 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
c760: 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f  st like the Lt o
c770: 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61  pcode except tha
c780: 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
c790: 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70  ken if.** the op
c7a0: 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74  erands in regist
c7b0: 65 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72  ers P1 and P3 ar
c7c0: 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65  e not equal.  Se
c7d0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
c7e0: 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  for.** additiona
c7f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
c800: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20  /./* Opcode: Eq 
c810: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
c820: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
c830: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
c840: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
c850: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
c860: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
c870: 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69  operands in regi
c880: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 20  sters P1 and P3 
c890: 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 20 53 65  are equal..** Se
c8a0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
c8b0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
c8c0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f  nformation..*/./
c8d0: 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20  * Opcode: Le P1 
c8e0: 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
c8f0: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
c900: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
c910: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
c920: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
c930: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
c940: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
c950: 20 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P3 is less than
c960: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
c970: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
c980: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
c990: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
c9a0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
c9b0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
c9c0: 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50   Opcode: Gt P1 P
c9d0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
c9e0: 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
c9f0: 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63   like the Lt opc
ca00: 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20  ode except that 
ca10: 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
ca20: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  n if.** the cont
ca30: 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20  ent of register 
ca40: 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
ca50: 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  an the content o
ca60: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
ca70: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
ca80: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
ca90: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
caa0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47  .*/./* Opcode: G
cab0: 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
cac0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
cad0: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
cae0: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
caf0: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
cb00: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
cb10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
cb20: 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65 61  ister P3 is grea
cb30: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
cb40: 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  l to the content
cb50: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   of.** register 
cb60: 50 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20  P1.  See the Lt 
cb70: 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74  opcode for addit
cb80: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
cb90: 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71  n..*/.case OP_Eq
cba0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
cbb0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 51  /* same as TK_EQ
cbc0: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
cbd0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20   */.case OP_Ne: 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbf0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20   same as TK_NE, 
cc00: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
cc10: 2f 0a 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20  /.case OP_Lt:   
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
cc30: 61 6d 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75  ame as TK_LT, ju
cc40: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
cc50: 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20  case OP_Le:     
cc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
cc70: 65 20 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70  e as TK_LE, jump
cc80: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
cc90: 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 20 20 20  se OP_Gt:       
cca0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
ccb0: 61 73 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20  as TK_GT, jump, 
ccc0: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
ccd0: 20 4f 50 5f 47 65 3a 20 7b 20 20 20 20 20 20 20   OP_Ge: {       
cce0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ccf0: 20 54 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e   TK_GE, jump, in
cd00: 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  1, in3 */.  int 
cd10: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 65 73  flags;.  int res
cd20: 3b 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74  ;.  char affinit
cd30: 79 3b 0a 0a 20 20 66 6c 61 67 73 20 3d 20 70 49  y;..  flags = pI
cd40: 6e 31 2d 3e 66 6c 61 67 73 7c 70 49 6e 33 2d 3e  n1->flags|pIn3->
cd50: 66 6c 61 67 73 3b 0a 0a 20 20 69 66 28 20 66 6c  flags;..  if( fl
cd60: 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
cd70: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
cd80: 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c   operand is NULL
cd90: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
cda0: 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e   is always NULL.
cdb0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70  .    ** The jump
cdc0: 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65   is taken if the
cdd0: 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
cde0: 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20  LL bit is set.. 
cdf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f     */.    if( pO
ce00: 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53  p->p5 & SQLITE_S
ce10: 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20  TOREP2 ){.      
ce20: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
ce30: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20  pOp->p2];.      
ce40: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
ce50: 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
ce60: 20 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54        REGISTER_T
ce70: 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
ce80: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
ce90: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  f( pOp->p5 & SQL
cea0: 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 29  ITE_JUMPIFNULL )
ceb0: 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f 70  {.      pc = pOp
cec0: 2d 3e 70 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  ->p2-1;.    }.  
ced0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
cee0: 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e  affinity = pOp->
cef0: 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f  p5 & SQLITE_AFF_
cf00: 4d 41 53 4b 3b 0a 20 20 69 66 28 20 61 66 66 69  MASK;.  if( affi
cf10: 6e 69 74 79 20 29 7b 0a 20 20 20 20 61 70 70 6c  nity ){.    appl
cf20: 79 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20  yAffinity(pIn1, 
cf30: 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69  affinity, encodi
cf40: 6e 67 29 3b 0a 20 20 20 20 61 70 70 6c 79 41 66  ng);.    applyAf
cf50: 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 61 66 66  finity(pIn3, aff
cf60: 69 6e 69 74 79 2c 20 65 6e 63 6f 64 69 6e 67 29  inity, encoding)
cf70: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
cf80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
cf90: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 0a 20  o no_mem;.  }.. 
cfa0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
cfb0: 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
cfc0: 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c   || pOp->p4.pCol
cfd0: 6c 3d 3d 30 20 29 3b 0a 20 20 45 78 70 61 6e 64  l==0 );.  Expand
cfe0: 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20 20 45 78  Blob(pIn1);.  Ex
cff0: 70 61 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a  pandBlob(pIn3);.
d000: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d    res = sqlite3M
d010: 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20  emCompare(pIn3, 
d020: 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43  pIn1, pOp->p4.pC
d030: 6f 6c 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  oll);.  switch( 
d040: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20  pOp->opcode ){. 
d050: 20 20 20 63 61 73 65 20 4f 50 5f 45 71 3a 20 20     case OP_Eq:  
d060: 20 20 72 65 73 20 3d 20 72 65 73 3d 3d 30 3b 20    res = res==0; 
d070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
d080: 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65  ase OP_Ne:    re
d090: 73 20 3d 20 72 65 73 21 3d 30 3b 20 20 20 20 20  s = res!=0;     
d0a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
d0b0: 4f 50 5f 4c 74 3a 20 20 20 20 72 65 73 20 3d 20  OP_Lt:    res = 
d0c0: 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
d0d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
d0e0: 65 3a 20 20 20 20 72 65 73 20 3d 20 72 65 73 3c  e:    res = res<
d0f0: 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  =0;     break;. 
d100: 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 20     case OP_Gt:  
d110: 20 20 72 65 73 20 3d 20 72 65 73 3e 30 3b 20 20    res = res>0;  
d120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
d130: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 72 65  efault:       re
d140: 73 20 3d 20 72 65 73 3e 3d 30 3b 20 20 20 20 20  s = res>=0;     
d150: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  break;.  }..  if
d160: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
d170: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
d180: 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65    pOut = &p->aMe
d190: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
d1a0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
d1b0: 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
d1c0: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72     pOut->u.i = r
d1d0: 65 73 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52  es;.    REGISTER
d1e0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
d1f0: 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pOut);.  }else i
d200: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 70 63  f( res ){.    pc
d210: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
d220: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
d230: 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75 74 61   Opcode: Permuta
d240: 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a  tion * * * P4 *.
d250: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 65  **.** Set the pe
d260: 72 6d 75 61 74 69 6f 6e 20 75 73 65 64 20 62 79  rmuation used by
d270: 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20   the OP_Compare 
d280: 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 74  operator to be t
d290: 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 20 69  he array.** of i
d2a0: 6e 74 65 67 65 72 73 20 69 6e 20 50 34 2e 0a 2a  ntegers in P4..*
d2b0: 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61  *.** The permuta
d2c0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tion is only val
d2d0: 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78  id until the nex
d2e0: 74 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  t OP_Permutation
d2f0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 0a 2a 2a  , OP_Compare,.**
d300: 20 4f 50 5f 48 61 6c 74 2c 20 6f 72 20 4f 50 5f   OP_Halt, or OP_
d310: 52 65 73 75 6c 74 52 6f 77 2e 20 20 54 79 70 69  ResultRow.  Typi
d320: 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72  cally the OP_Per
d330: 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mutation should 
d340: 6f 63 63 75 72 0a 2a 2a 20 69 6d 6d 65 64 69 61  occur.** immedia
d350: 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68  tely prior to th
d360: 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2f  e OP_Compare..*/
d370: 0a 63 61 73 65 20 4f 50 5f 50 65 72 6d 75 74 61  .case OP_Permuta
d380: 74 69 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74  tion: {.  assert
d390: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
d3a0: 34 5f 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20  4_INTARRAY );.  
d3b0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
d3c0: 61 69 20 29 3b 0a 20 20 61 50 65 72 6d 75 74 65  ai );.  aPermute
d3d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
d3e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
d3f0: 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50 31  code: Compare P1
d400: 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
d410: 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 76 65 63  * Compare to vec
d420: 74 6f 72 73 20 6f 66 20 72 65 67 69 73 74 65 72  tors of register
d430: 73 20 69 6e 20 72 65 67 28 50 31 29 2e 2e 72 65  s in reg(P1)..re
d440: 67 28 50 31 2b 50 33 2d 31 29 20 28 61 6c 6c 20  g(P1+P3-1) (all 
d450: 74 68 69 73 0a 2a 2a 20 6f 6e 65 20 22 41 22 29  this.** one "A")
d460: 20 61 6e 64 20 69 6e 20 72 65 67 28 50 32 29 2e   and in reg(P2).
d470: 2e 72 65 67 28 50 32 2b 50 33 2d 31 29 20 28 22  .reg(P2+P3-1) ("
d480: 42 22 29 2e 20 20 53 61 76 65 20 74 68 65 20 72  B").  Save the r
d490: 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 74 68 65 20  esult of.** the 
d4a0: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 6f 72 20 75  comparison for u
d4b0: 73 65 20 62 79 20 74 68 65 20 6e 65 78 74 20 4f  se by the next O
d4c0: 50 5f 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 2e  P_Jump instruct.
d4d0: 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 4b  .**.** P4 is a K
d4e0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
d4f0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 63 6f   that defines co
d500: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d510: 73 20 61 6e 64 20 73 6f 72 74 0a 2a 2a 20 6f 72  s and sort.** or
d520: 64 65 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6d  ders for the com
d530: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 70 65  parison.  The pe
d540: 72 6d 75 74 61 74 69 6f 6e 20 61 70 70 6c 69 65  rmutation applie
d550: 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a 2a  s to registers.*
d560: 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 20 4b 65 79  * only.  The Key
d570: 49 6e 66 6f 20 65 6c 65 6d 65 6e 74 73 20 61 72  Info elements ar
d580: 65 20 75 73 65 64 20 73 65 71 75 65 6e 74 69 61  e used sequentia
d590: 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  lly..**.** The c
d5a0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 73  omparison is a s
d5b0: 6f 72 74 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ort comparison, 
d5c0: 73 6f 20 4e 55 4c 4c 73 20 63 6f 6d 70 61 72 65  so NULLs compare
d5d0: 20 65 71 75 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73   equal,.** NULLs
d5e0: 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e   are less than n
d5f0: 75 6d 62 65 72 73 2c 20 6e 75 6d 62 65 72 73 20  umbers, numbers 
d600: 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 73 74  are less than st
d610: 72 69 6e 67 73 2c 0a 2a 2a 20 61 6e 64 20 73 74  rings,.** and st
d620: 72 69 6e 67 73 20 61 72 65 20 6c 65 73 73 20 74  rings are less t
d630: 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61  han blobs..*/.ca
d640: 73 65 20 4f 50 5f 43 6f 6d 70 61 72 65 3a 20 7b  se OP_Compare: {
d650: 0a 20 20 69 6e 74 20 6e 20 3d 20 70 4f 70 2d 3e  .  int n = pOp->
d660: 70 33 3b 0a 20 20 69 6e 74 20 69 2c 20 70 31 2c  p3;.  int i, p1,
d670: 20 70 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79   p2;.  const Key
d680: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
d690: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
d6a0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30  o;.  assert( n>0
d6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
d6c0: 65 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70  eyInfo!=0 );.  p
d6d0: 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61  1 = pOp->p1;.  a
d6e0: 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20 70  ssert( p1>0 && p
d6f0: 31 2b 6e 2d 31 3c 70 2d 3e 6e 4d 65 6d 20 29 3b  1+n-1<p->nMem );
d700: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
d710: 0a 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20  .  assert( p2>0 
d720: 26 26 20 70 32 2b 6e 2d 31 3c 70 2d 3e 6e 4d 65  && p2+n-1<p->nMe
d730: 6d 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m );.  for(i=0; 
d740: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
d750: 6e 74 20 69 64 78 20 3d 20 61 50 65 72 6d 75 74  nt idx = aPermut
d760: 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d 20  e ? aPermute[i] 
d770: 3a 20 69 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  : i;.    CollSeq
d780: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43   *pColl;    /* C
d790: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
d7a0: 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73  e to use on this
d7b0: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74   term */.    int
d7c0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
d7d0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43  /* True for DESC
d7e0: 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65  ENDING sort orde
d7f0: 72 20 2a 2f 0a 20 20 20 20 52 45 47 49 53 54 45  r */.    REGISTE
d800: 52 5f 54 52 41 43 45 28 70 31 2b 69 64 78 2c 20  R_TRACE(p1+idx, 
d810: 26 70 2d 3e 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  &p->aMem[p1+idx]
d820: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
d830: 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 70  TRACE(p2+idx, &p
d840: 2d 3e 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b  ->aMem[p2+idx]);
d850: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
d860: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
d870: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70  );.    pColl = p
d880: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
d890: 5d 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 70 4b  ];.    bRev = pK
d8a0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
d8b0: 65 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70  er[i];.    iComp
d8c0: 61 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  are = sqlite3Mem
d8d0: 43 6f 6d 70 61 72 65 28 26 70 2d 3e 61 4d 65 6d  Compare(&p->aMem
d8e0: 5b 70 31 2b 69 64 78 5d 2c 20 26 70 2d 3e 61 4d  [p1+idx], &p->aM
d8f0: 65 6d 5b 70 32 2b 69 64 78 5d 2c 20 70 43 6f 6c  em[p2+idx], pCol
d900: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6d  l);.    if( iCom
d910: 70 61 72 65 20 29 7b 0a 20 20 20 20 20 20 69 66  pare ){.      if
d920: 28 20 62 52 65 76 20 29 20 69 43 6f 6d 70 61 72  ( bRev ) iCompar
d930: 65 20 3d 20 2d 69 43 6f 6d 70 61 72 65 3b 0a 20  e = -iCompare;. 
d940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d950: 7d 0a 20 20 7d 0a 20 20 61 50 65 72 6d 75 74 65  }.  }.  aPermute
d960: 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = 0;.  break;.}
d970: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4a 75 6d  ../* Opcode: Jum
d980: 70 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  p P1 P2 P3 * *.*
d990: 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65  *.** Jump to the
d9a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
d9b0: 61 64 64 72 65 73 73 20 50 31 2c 20 50 32 2c 20  address P1, P2, 
d9c0: 6f 72 20 50 33 20 64 65 70 65 6e 64 69 6e 67 20  or P3 depending 
d9d0: 6f 6e 20 77 68 65 74 68 65 72 0a 2a 2a 20 69 6e  on whether.** in
d9e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
d9f0: 20 4f 50 5f 43 6f 6d 70 61 72 65 20 69 6e 73 74   OP_Compare inst
da00: 72 75 63 74 69 6f 6e 20 74 68 65 20 50 31 20 76  ruction the P1 v
da10: 65 63 74 6f 72 20 77 61 73 20 6c 65 73 73 20 74  ector was less t
da20: 68 61 6e 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c  han.** equal to,
da30: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
da40: 20 74 68 65 20 50 32 20 76 65 63 74 6f 72 2c 20   the P2 vector, 
da50: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f  respectively..*/
da60: 0a 63 61 73 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b  .case OP_Jump: {
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da80: 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 69 43  jump */.  if( iC
da90: 6f 6d 70 61 72 65 3c 30 20 29 7b 0a 20 20 20 20  ompare<0 ){.    
daa0: 70 63 20 3d 20 70 4f 70 2d 3e 70 31 20 2d 20 31  pc = pOp->p1 - 1
dab0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43  ;.  }else if( iC
dac0: 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
dad0: 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
dae0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
daf0: 70 63 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31  pc = pOp->p3 - 1
db00: 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
db10: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64  ../* Opcode: And
db20: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
db30: 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c 6f 67  .** Take the log
db40: 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68 65 20  ical AND of the 
db50: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
db60: 65 72 73 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ers P1 and P2 an
db70: 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 72  d.** write the r
db80: 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67 69 73  esult into regis
db90: 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
dba0: 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
dbb0: 20 69 73 20 30 20 28 66 61 6c 73 65 29 20 74 68   is 0 (false) th
dbc0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
dbd0: 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68   0 even if.** th
dbe0: 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73  e other input is
dbf0: 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61   NULL.  A NULL a
dc00: 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f 20 4e  nd true or two N
dc10: 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61 20 4e  ULLs give.** a N
dc20: 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 2f  ULL output..*/./
dc30: 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50 31 20  * Opcode: Or P1 
dc40: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
dc50: 54 61 6b 65 20 74 68 65 20 6c 6f 67 69 63 61 6c  Take the logical
dc60: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
dc70: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
dc80: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
dc90: 74 6f 72 65 20 74 68 65 20 61 6e 73 77 65 72 20  tore the answer 
dca0: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
dcb0: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
dcc0: 50 31 20 6f 72 20 50 32 20 69 73 20 6e 6f 6e 7a  P1 or P2 is nonz
dcd0: 65 72 6f 20 28 74 72 75 65 29 20 74 68 65 6e 20  ero (true) then 
dce0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 31 20  the result is 1 
dcf0: 28 74 72 75 65 29 0a 2a 2a 20 65 76 65 6e 20 69  (true).** even i
dd00: 66 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  f the other inpu
dd10: 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
dd20: 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 6f 72 20  LL and false or 
dd30: 74 77 6f 20 4e 55 4c 4c 73 0a 2a 2a 20 67 69 76  two NULLs.** giv
dd40: 65 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e  e a NULL output.
dd50: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 6e 64 3a  .*/.case OP_And:
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd70: 20 73 61 6d 65 20 61 73 20 54 4b 5f 41 4e 44 2c   same as TK_AND,
dd80: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
dd90: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 72 3a 20 7b  */.case OP_Or: {
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddb0: 73 61 6d 65 20 61 73 20 54 4b 5f 4f 52 2c 20 69  same as TK_OR, i
ddc0: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
ddd0: 0a 20 20 69 6e 74 20 76 31 2c 20 76 32 3b 20 20  .  int v1, v2;  
dde0: 20 20 2f 2a 20 30 3d 3d 46 41 4c 53 45 2c 20 31    /* 0==FALSE, 1
ddf0: 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f  ==TRUE, 2==UNKNO
de00: 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20  WN or NULL */.. 
de10: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
de20: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
de30: 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d 65 6c     v1 = 2;.  }el
de40: 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  se{.    v1 = sql
de50: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
de60: 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d 0a 20  (pIn1)!=0;.  }. 
de70: 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73   if( pIn2->flags
de80: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
de90: 20 20 20 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c     v2 = 2;.  }el
dea0: 73 65 7b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  se{.    v2 = sql
deb0: 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
dec0: 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a 20  (pIn2)!=0;.  }. 
ded0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
dee0: 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20  ==OP_And ){.    
def0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
df00: 69 67 6e 65 64 20 63 68 61 72 20 61 6e 64 5f 6c  igned char and_l
df10: 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c  ogic[] = { 0, 0,
df20: 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   0, 0, 1, 2, 0, 
df30: 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d  2, 2 };.    v1 =
df40: 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b   and_logic[v1*3+
df50: 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  v2];.  }else{.  
df60: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
df70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 72 5f  nsigned char or_
df80: 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31  logic[] = { 0, 1
df90: 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c  , 2, 1, 1, 1, 2,
dfa0: 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20   1, 2 };.    v1 
dfb0: 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b  = or_logic[v1*3+
dfc0: 76 32 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 76  v2];.  }.  if( v
dfd0: 31 3d 3d 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53  1==2 ){.    MemS
dfe0: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
dff0: 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65   MEM_Null);.  }e
e000: 6c 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  lse{.    pOut->u
e010: 2e 69 20 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d  .i = v1;.    Mem
e020: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
e030: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a  , MEM_Int);.  }.
e040: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
e050: 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32  pcode: Not P1 P2
e060: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 6e 74   * * *.**.** Int
e070: 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75 65  erpret the value
e080: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
e090: 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  as a boolean val
e0a0: 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a  ue.  Store the.*
e0b0: 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65  * boolean comple
e0c0: 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65 72  ment in register
e0d0: 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61 6c   P2.  If the val
e0e0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
e0f0: 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  1 is .** NULL, t
e100: 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73 74  hen a NULL is st
e110: 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63  ored in P2..*/.c
e120: 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20  ase OP_Not: {   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e140: 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20  same as TK_NOT, 
e150: 69 6e 31 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20  in1 */.  pOut = 
e160: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
e170: 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
e180: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
e190: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e1a0: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
e1b0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
e1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
e1d0: 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 21 73  etInt64(pOut, !s
e1e0: 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
e1f0: 75 65 28 70 49 6e 31 29 29 3b 0a 20 20 7d 0a 20  ue(pIn1));.  }. 
e200: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
e210: 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20  code: BitNot P1 
e220: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
e230: 6e 74 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e  nterpret the con
e240: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
e250: 20 50 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65   P1 as an intege
e260: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a  r.  Store the.**
e270: 20 6f 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   ones-complement
e280: 20 6f 66 20 74 68 65 20 50 31 20 76 61 6c 75 65   of the P1 value
e290: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
e2a0: 32 2e 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a  2.  If P1 holds.
e2b0: 2a 2a 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73  ** a NULL then s
e2c0: 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50  tore a NULL in P
e2d0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69  2..*/.case OP_Bi
e2e0: 74 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20  tNot: {         
e2f0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
e300: 4b 5f 42 49 54 4e 4f 54 2c 20 69 6e 31 20 2a 2f  K_BITNOT, in1 */
e310: 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d  .  pOut = &p->aM
e320: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69  em[pOp->p2];.  i
e330: 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
e340: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
e350: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
e360: 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20  etNull(pOut);.  
e370: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e380: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
e390: 34 28 70 4f 75 74 2c 20 7e 73 71 6c 69 74 65 33  4(pOut, ~sqlite3
e3a0: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
e3b0: 31 29 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  1));.  }.  break
e3c0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
e3d0: 49 66 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  If P1 P2 P3 * *.
e3e0: 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32  **.** Jump to P2
e3f0: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   if the value in
e400: 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
e410: 74 72 75 65 2e 20 20 54 68 65 20 76 61 6c 75 65  true.  The value
e420: 20 69 73 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64   is.** is consid
e430: 65 72 65 64 20 74 72 75 65 20 69 66 20 69 74 20  ered true if it 
e440: 69 73 20 6e 75 6d 65 72 69 63 20 61 6e 64 20 6e  is numeric and n
e450: 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 74 68 65  on-zero.  If the
e460: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
e470: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b  is NULL then tak
e480: 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50 33  e the jump if P3
e490: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 2f 2a 20   is true..*/./* 
e4a0: 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74 20 50 31  Opcode: IfNot P1
e4b0: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
e4c0: 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
e4d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
e4e0: 73 74 65 72 20 50 31 20 69 73 20 46 61 6c 73 65  ster P1 is False
e4f0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
e500: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
e510: 20 74 72 75 65 20 69 66 20 69 74 20 68 61 73 20   true if it has 
e520: 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20  a numeric value 
e530: 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68 65  of zero.  If the
e540: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
e550: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61 6b  is NULL then tak
e560: 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 50 33  e the jump if P3
e570: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 63 61 73   is true..*/.cas
e580: 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20 20  e OP_If:        
e590: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
e5a0: 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f 50  , in1 */.case OP
e5b0: 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20  _IfNot: {       
e5c0: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
e5d0: 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20 20  1 */.  int c;.  
e5e0: 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  if( pIn1->flags 
e5f0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
e600: 20 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    c = pOp->p3;. 
e610: 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
e620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
e630: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 20  ING_POINT.    c 
e640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74  = sqlite3VdbeInt
e650: 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 23 65 6c  Value(pIn1);.#el
e660: 73 65 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  se.    c = sqlit
e670: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
e680: 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64  pIn1)!=0.0;.#end
e690: 69 66 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  if.    if( pOp->
e6a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74  opcode==OP_IfNot
e6b0: 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20   ) c = !c;.  }. 
e6c0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 70 63   if( c ){.    pc
e6d0: 20 3d 20 70 4f 70 2d 3e 70 32 2d 31 3b 0a 20 20   = pOp->p2-1;.  
e6e0: 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
e6f0: 20 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20   Opcode: IsNull 
e700: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
e710: 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
e720: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e730: 67 69 73 74 65 72 20 50 31 20 69 73 20 4e 55 4c  gister P1 is NUL
e740: 4c 2e 20 20 49 66 20 50 33 20 69 73 20 67 72 65  L.  If P3 is gre
e750: 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 7a 65 72  ater.** than zer
e760: 6f 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 61 6c  o, then check al
e770: 6c 20 76 61 6c 75 65 73 20 72 65 67 28 50 31 29  l values reg(P1)
e780: 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 0a 2a 2a  , reg(P1+1), .**
e790: 20 72 65 67 28 50 31 2b 32 29 2c 20 2e 2e 2e 2c   reg(P1+2), ...,
e7a0: 20 72 65 67 28 50 31 2b 50 33 2d 31 29 2e 0a 2a   reg(P1+P3-1)..*
e7b0: 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c 6c  /.case OP_IsNull
e7c0: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
e7d0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53 4e  * same as TK_ISN
e7e0: 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a  ULL, jump, in1 *
e7f0: 2f 0a 20 20 69 6e 74 20 6e 20 3d 20 70 4f 70 2d  /.  int n = pOp-
e800: 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p3;.  assert( p
e810: 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 70 4f 70  Op->p3==0 || pOp
e820: 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  ->p1>0 );.  do{.
e830: 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
e840: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
e850: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20  !=0 ){.      pc 
e860: 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20  = pOp->p2 - 1;. 
e870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e880: 7d 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20  }.    pIn1++;.  
e890: 7d 77 68 69 6c 65 28 20 2d 2d 6e 20 3e 20 30 20  }while( --n > 0 
e8a0: 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
e8b0: 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
e8c0: 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
e8d0: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
e8e0: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
e8f0: 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f  egister P1 is no
e900: 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73  t NULL.  .*/.cas
e910: 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20  e OP_NotNull: { 
e920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
e930: 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  me as TK_NOTNULL
e940: 2c 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  , jump, in1 */. 
e950: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
e960: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
e970: 20 29 7b 0a 20 20 20 20 70 63 20 3d 20 70 4f 70   ){.    pc = pOp
e980: 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
e990: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
e9a0: 6f 64 65 3a 20 53 65 74 4e 75 6d 43 6f 6c 75 6d  ode: SetNumColum
e9b0: 6e 73 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  ns * P2 * * *.**
e9c0: 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
e9d0: 73 65 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  sets the number 
e9e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74  of columns for t
e9f0: 68 65 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64  he cursor opened
ea00: 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f   by the.** follo
ea10: 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
ea20: 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 6e   to P2..**.** An
ea30: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
ea40: 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 66 75 6c  s is only useful
ea50: 20 69 66 20 69 74 20 6f 63 63 75 72 73 20 69 6d   if it occurs im
ea60: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
ea70: 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20   .** one of the 
ea80: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 63 6f 64 65  following opcode
ea90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4f 70 65  s:.**.**     Ope
eaa0: 6e 52 65 61 64 0a 2a 2a 20 20 20 20 20 4f 70 65  nRead.**     Ope
eab0: 6e 57 72 69 74 65 0a 2a 2a 20 20 20 20 20 4f 70  nWrite.**     Op
eac0: 65 6e 50 73 65 75 64 6f 0a 2a 2a 0a 2a 2a 20 49  enPseudo.**.** I
ead0: 66 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  f the OP_Column 
eae0: 6f 70 63 6f 64 65 20 69 73 20 74 6f 20 62 65 20  opcode is to be 
eaf0: 65 78 65 63 75 74 65 64 20 6f 6e 20 61 20 63 75  executed on a cu
eb00: 72 73 6f 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  rsor, then.** th
eb10: 69 73 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62  is opcode must b
eb20: 65 20 70 72 65 73 65 6e 74 20 69 6d 6d 65 64 69  e present immedi
eb30: 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65  ately before the
eb40: 20 6f 70 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20   opcode that.** 
eb50: 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f 72  opens the cursor
eb60: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74  ..*/.case OP_Set
eb70: 4e 75 6d 43 6f 6c 75 6d 6e 73 3a 20 7b 0a 20 20  NumColumns: {.  
eb80: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
eb90: 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
eba0: 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20  2 P3 P4 *.**.** 
ebb0: 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 64 61  Interpret the da
ebc0: 74 61 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  ta that cursor P
ebd0: 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73 20 61  1 points to as a
ebe0: 20 73 74 72 75 63 74 75 72 65 20 62 75 69 6c 74   structure built
ebf0: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 4d 61   using.** the Ma
ec00: 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63  keRecord instruc
ec10: 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68 65 20  tion.  (See the 
ec20: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
ec30: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
ec40: 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
ec50: 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d 61 74  about the format
ec60: 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29 20 20   of the data.)  
ec70: 45 78 74 72 61 63 74 20 74 68 65 20 50 32 2d 74  Extract the P2-t
ec80: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72 6f 6d  h column.** from
ec90: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20 20 49   this record.  I
eca0: 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73  f there are less
ecb0: 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a 2a 2a   that (P2+1) .**
ecc0: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 72   values in the r
ecd0: 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74 20 61  ecord, extract a
ece0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
ecf0: 20 76 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   value extracted
ed00: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
ed10: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
ed20: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
ed30: 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
ed40: 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20 74 68  an P2 fields, th
ed50: 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e 55 4c  en extract a NUL
ed60: 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  L.  Or,.** if th
ed70: 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20 69 73  e P4 argument is
ed80: 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20 74 68   a P4_MEM use th
ed90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
eda0: 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a  4 argument as.**
edb0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a   the result..*/.
edc0: 63 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20  case OP_Column: 
edd0: 7b 0a 20 20 69 6e 74 20 70 61 79 6c 6f 61 64 53  {.  int payloadS
ede0: 69 7a 65 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ize;   /* Number
edf0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
ee00: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
ee10: 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20   p1 = pOp->p1;  
ee20: 2f 2a 20 50 31 20 76 61 6c 75 65 20 6f 66 20 74  /* P1 value of t
ee30: 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  he opcode */.  i
ee40: 6e 74 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  nt p2 = pOp->p2;
ee50: 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    /* column numb
ee60: 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  er to retrieve *
ee70: 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
ee80: 70 43 20 3d 20 30 3b 2f 2a 20 54 68 65 20 56 44  pC = 0;/* The VD
ee90: 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63  BE cursor */.  c
eea0: 68 61 72 20 2a 7a 52 65 63 3b 20 20 20 20 20 20  har *zRec;      
eeb0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
eec0: 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 2d  complete record-
eed0: 64 61 74 61 20 2a 2f 0a 20 20 42 74 43 75 72 73  data */.  BtCurs
eee0: 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a 20  or *pCrsr;   /* 
eef0: 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f 72  The BTree cursor
ef00: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 54 79 70 65   */.  u32 *aType
ef10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 54 79 70  ;        /* aTyp
ef20: 65 5b 69 5d 20 68 6f 6c 64 73 20 74 68 65 20 6e  e[i] holds the n
ef30: 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 74  umeric type of t
ef40: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 2a  he i-th column *
ef50: 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66 73 65 74  /.  u32 *aOffset
ef60: 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66 66 73 65  ;      /* aOffse
ef70: 74 5b 69 5d 20 69 73 20 6f 66 66 73 65 74 20 74  t[i] is offset t
ef80: 6f 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  o start of data 
ef90: 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  for i-th column 
efa0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
efb0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
efc0: 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
efd0: 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
efe0: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
eff0: 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20    /* The length 
f000: 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  of the serialize
f010: 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  d data for the c
f020: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
f030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f040: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
f050: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 20  .  char *zData; 
f060: 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20 6f 66        /* Part of
f070: 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
f080: 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 4d  g decoded */.  M
f090: 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20 20 20  em *pDest;      
f0a0: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
f0b0: 69 74 65 20 74 68 65 20 65 78 74 72 61 63 74 65  ite the extracte
f0c0: 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  d value */.  Mem
f0d0: 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   sMem;          
f0e0: 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74  /* For storing t
f0f0: 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
f100: 64 65 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 6d 65  decoded */..  me
f110: 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73  mset(&sMem, 0, s
f120: 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20  izeof(sMem));.  
f130: 61 73 73 65 72 74 28 20 70 31 3c 70 2d 3e 6e 43  assert( p1<p->nC
f140: 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
f150: 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
f160: 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p3<=p->nMem
f170: 20 29 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 70   );.  pDest = &p
f180: 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b  ->aMem[pOp->p3];
f190: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
f1a0: 67 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c  g(pDest, MEM_Nul
f1b0: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  l);..  /* This b
f1c0: 6c 6f 63 6b 20 73 65 74 73 20 74 68 65 20 76 61  lock sets the va
f1d0: 72 69 61 62 6c 65 20 70 61 79 6c 6f 61 64 53 69  riable payloadSi
f1e0: 7a 65 20 74 6f 20 62 65 20 74 68 65 20 74 6f 74  ze to be the tot
f1f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a  al number of.  *
f200: 2a 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72  * bytes in the r
f210: 65 63 6f 72 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ecord..  **.  **
f220: 20 7a 52 65 63 20 69 73 20 73 65 74 20 74 6f 20   zRec is set to 
f230: 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  be the complete 
f240: 74 65 78 74 20 6f 66 20 74 68 65 20 72 65 63 6f  text of the reco
f250: 72 64 20 69 66 20 69 74 20 69 73 20 61 76 61 69  rd if it is avai
f260: 6c 61 62 6c 65 2e 0a 20 20 2a 2a 20 54 68 65 20  lable..  ** The 
f270: 63 6f 6d 70 6c 65 74 65 20 72 65 63 6f 72 64 20  complete record 
f280: 74 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 61  text is always a
f290: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 73 65  vailable for pse
f2a0: 75 64 6f 2d 74 61 62 6c 65 73 0a 20 20 2a 2a 20  udo-tables.  ** 
f2b0: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
f2c0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 63 75 72   stored in a cur
f2d0: 73 6f 72 2c 20 74 68 65 20 63 6f 6d 70 6c 65 74  sor, the complet
f2e0: 65 20 72 65 63 6f 72 64 20 74 65 78 74 0a 20 20  e record text.  
f2f0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 76 61 69  ** might be avai
f300: 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 20 70 43  lable in the  pC
f310: 2d 3e 61 52 6f 77 20 63 61 63 68 65 2e 20 20 4f  ->aRow cache.  O
f320: 72 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  r it might not b
f330: 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 64  e..  ** If the d
f340: 61 74 61 20 69 73 20 75 6e 61 76 61 69 6c 61 62  ata is unavailab
f350: 6c 65 2c 20 20 7a 52 65 63 20 69 73 20 73 65 74  le,  zRec is set
f360: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20   to NULL..  **. 
f370: 20 2a 2a 20 57 65 20 61 6c 73 6f 20 63 6f 6d 70   ** We also comp
f380: 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
f390: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
f3a0: 20 72 65 63 6f 72 64 2e 20 20 46 6f 72 20 63 75   record.  For cu
f3b0: 72 73 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 20  rsors,.  ** the 
f3c0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
f3d0: 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  s is stored in t
f3e0: 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 6e 46  he VdbeCursor.nF
f3f0: 69 65 6c 64 20 65 6c 65 6d 65 6e 74 2e 0a 20 20  ield element..  
f400: 2a 2f 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  */.  pC = p->apC
f410: 73 72 5b 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  sr[p1];.  assert
f420: 28 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 6e 64  ( pC!=0 );.#ifnd
f430: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
f440: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 61 73  IRTUALTABLE.  as
f450: 73 65 72 74 28 20 70 43 2d 3e 70 56 74 61 62 43  sert( pC->pVtabC
f460: 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 23 65 6e 64  ursor==0 );.#end
f470: 69 66 0a 20 20 69 66 28 20 70 43 2d 3e 70 43 75  if.  if( pC->pCu
f480: 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20 20 20 2f  rsor!=0 ){.    /
f490: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69 73 20  * The record is 
f4a0: 73 74 6f 72 65 64 20 69 6e 20 61 20 42 2d 54 72  stored in a B-Tr
f4b0: 65 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ee */.    rc = s
f4c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
f4d0: 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 20 20  Moveto(pC);.    
f4e0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
f4f0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
f500: 3b 0a 20 20 20 20 7a 52 65 63 20 3d 20 30 3b 0a  ;.    zRec = 0;.
f510: 20 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e      pCrsr = pC->
f520: 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28  pCursor;.    if(
f530: 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
f540: 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a        payloadSiz
f550: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
f560: 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53 74   if( pC->cacheSt
f570: 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43 74  atus==p->cacheCt
f580: 72 20 29 7b 0a 20 20 20 20 20 20 70 61 79 6c 6f  r ){.      paylo
f590: 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 70 61 79  adSize = pC->pay
f5a0: 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20 20 20  loadSize;.      
f5b0: 7a 52 65 63 20 3d 20 28 63 68 61 72 2a 29 70 43  zRec = (char*)pC
f5c0: 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73  ->aRow;.    }els
f5d0: 65 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65  e if( pC->isInde
f5e0: 78 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 70  x ){.      i64 p
f5f0: 61 79 6c 6f 61 64 53 69 7a 65 36 34 3b 0a 20 20  ayloadSize64;.  
f600: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f610: 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c 20 26  KeySize(pCrsr, &
f620: 70 61 79 6c 6f 61 64 53 69 7a 65 36 34 29 3b 0a  payloadSize64);.
f630: 20 20 20 20 20 20 70 61 79 6c 6f 61 64 53 69 7a        payloadSiz
f640: 65 20 3d 20 28 69 6e 74 29 70 61 79 6c 6f 61 64  e = (int)payload
f650: 53 69 7a 65 36 34 3b 0a 20 20 20 20 7d 65 6c 73  Size64;.    }els
f660: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f670: 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 70 43  BtreeDataSize(pC
f680: 72 73 72 2c 20 28 75 33 32 20 2a 29 26 70 61 79  rsr, (u32 *)&pay
f690: 6c 6f 61 64 53 69 7a 65 29 3b 0a 20 20 20 20 7d  loadSize);.    }
f6a0: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 43  .    nField = pC
f6b0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 7d 65 6c 73  ->nField;.  }els
f6c0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
f6d0: 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29  C->pseudoTable )
f6e0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63  ;.    /* The rec
f6f0: 6f 72 64 20 69 73 20 74 68 65 20 73 6f 6c 65 20  ord is the sole 
f700: 65 6e 74 72 79 20 6f 66 20 61 20 70 73 65 75 64  entry of a pseud
f710: 6f 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 70  o-table */.    p
f720: 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d  ayloadSize = pC-
f730: 3e 6e 44 61 74 61 3b 0a 20 20 20 20 7a 52 65 63  >nData;.    zRec
f740: 20 3d 20 70 43 2d 3e 70 44 61 74 61 3b 0a 20 20   = pC->pData;.  
f750: 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
f760: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
f770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 79  .    assert( pay
f780: 6c 6f 61 64 53 69 7a 65 3d 3d 30 20 7c 7c 20 7a  loadSize==0 || z
f790: 52 65 63 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  Rec!=0 );.    nF
f7a0: 69 65 6c 64 20 3d 20 70 43 2d 3e 6e 46 69 65 6c  ield = pC->nFiel
f7b0: 64 3b 0a 20 20 20 20 70 43 72 73 72 20 3d 20 30  d;.    pCrsr = 0
f7c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  ;.  }..  /* If p
f7d0: 61 79 6c 6f 61 64 53 69 7a 65 20 69 73 20 30 2c  ayloadSize is 0,
f7e0: 20 74 68 65 6e 20 6a 75 73 74 20 73 74 6f 72 65   then just store
f7f0: 20 61 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28   a NULL */.  if(
f800: 20 70 61 79 6c 6f 61 64 53 69 7a 65 3d 3d 30 20   payloadSize==0 
f810: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
f820: 44 65 73 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Dest->flags&MEM_
f830: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 67 6f 74 6f  Null );.    goto
f840: 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a   op_column_out;.
f850: 20 20 7d 0a 20 20 69 66 28 20 70 61 79 6c 6f 61    }.  if( payloa
f860: 64 53 69 7a 65 3e 64 62 2d 3e 61 4c 69 6d 69 74  dSize>db->aLimit
f870: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
f880: 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74  NGTH] ){.    got
f890: 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a  o too_big;.  }..
f8a0: 20 20 61 73 73 65 72 74 28 20 70 32 3c 6e 46 69    assert( p2<nFi
f8b0: 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  eld );..  /* Rea
f8c0: 64 20 61 6e 64 20 70 61 72 73 65 20 74 68 65 20  d and parse the 
f8d0: 74 61 62 6c 65 20 68 65 61 64 65 72 2e 20 20 53  table header.  S
f8e0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
f8f0: 20 6f 66 20 74 68 65 20 70 61 72 73 65 0a 20 20   of the parse.  
f900: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f  ** into the reco
f910: 72 64 20 68 65 61 64 65 72 20 63 61 63 68 65 20  rd header cache 
f920: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 63 75  fields of the cu
f930: 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 54 79  rsor..  */.  aTy
f940: 70 65 20 3d 20 70 43 2d 3e 61 54 79 70 65 3b 0a  pe = pC->aType;.
f950: 20 20 69 66 28 20 70 43 2d 3e 63 61 63 68 65 53    if( pC->cacheS
f960: 74 61 74 75 73 3d 3d 70 2d 3e 63 61 63 68 65 43  tatus==p->cacheC
f970: 74 72 20 29 7b 0a 20 20 20 20 61 4f 66 66 73 65  tr ){.    aOffse
f980: 74 20 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b  t = pC->aOffset;
f990: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
f9a0: 20 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 2f   *zIdx;        /
f9b0: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 68 65 61  * Index into hea
f9c0: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 7a  der */.    u8 *z
f9d0: 45 6e 64 48 64 72 3b 20 20 20 20 20 2f 2a 20 50  EndHdr;     /* P
f9e0: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
f9f0: 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 68  byte after the h
fa00: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  eader */.    int
fa10: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a   offset;      /*
fa20: 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
fa30: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 6e 74   data */.    int
fa40: 20 73 7a 48 64 72 53 7a 3b 20 20 20 20 20 2f 2a   szHdrSz;     /*
fa50: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
fa60: 64 65 72 20 73 69 7a 65 20 66 69 65 6c 64 20 61  der size field a
fa70: 74 20 73 74 61 72 74 20 6f 66 20 72 65 63 6f 72  t start of recor
fa80: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 76 61  d */.    int ava
fa90: 69 6c 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  il = 0;   /* Num
faa0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
fab0: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 20 2a  available data *
fac0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 61 54  /..    assert(aT
fad0: 79 70 65 29 3b 0a 20 20 20 20 70 43 2d 3e 61 4f  ype);.    pC->aO
fae0: 66 66 73 65 74 20 3d 20 61 4f 66 66 73 65 74 20  ffset = aOffset 
faf0: 3d 20 26 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d  = &aType[nField]
fb00: 3b 0a 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61  ;.    pC->payloa
fb10: 64 53 69 7a 65 20 3d 20 70 61 79 6c 6f 61 64 53  dSize = payloadS
fb20: 69 7a 65 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  ize;.    pC->cac
fb30: 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61  heStatus = p->ca
fb40: 63 68 65 43 74 72 3b 0a 0a 20 20 20 20 2f 2a 20  cheCtr;..    /* 
fb50: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
fb60: 61 6e 79 20 62 79 74 65 73 20 61 72 65 20 69 6e  any bytes are in
fb70: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
fb80: 20 20 20 69 66 28 20 7a 52 65 63 20 29 7b 0a 20     if( zRec ){. 
fb90: 20 20 20 20 20 7a 44 61 74 61 20 3d 20 7a 52 65       zData = zRe
fba0: 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  c;.    }else{.  
fbb0: 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 49 6e      if( pC->isIn
fbc0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  dex ){.        z
fbd0: 44 61 74 61 20 3d 20 28 63 68 61 72 2a 29 73 71  Data = (char*)sq
fbe0: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
fbf0: 63 68 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c  ch(pCrsr, &avail
fc00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fc10: 20 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20          zData = 
fc20: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 42 74  (char*)sqlite3Bt
fc30: 72 65 65 44 61 74 61 46 65 74 63 68 28 70 43 72  reeDataFetch(pCr
fc40: 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20  sr, &avail);.   
fc50: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66     }.      /* If
fc60: 20 4b 65 79 46 65 74 63 68 28 29 2f 44 61 74 61   KeyFetch()/Data
fc70: 46 65 74 63 68 28 29 20 6d 61 6e 61 67 65 64 20  Fetch() managed 
fc80: 74 6f 20 67 65 74 20 74 68 65 20 65 6e 74 69 72  to get the entir
fc90: 65 20 70 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20  e payload,.     
fca0: 20 2a 2a 20 73 61 76 65 20 74 68 65 20 70 61 79   ** save the pay
fcb0: 6c 6f 61 64 20 69 6e 20 74 68 65 20 70 43 2d 3e  load in the pC->
fcc0: 61 52 6f 77 20 63 61 63 68 65 2e 20 20 54 68 61  aRow cache.  Tha
fcd0: 74 20 77 69 6c 6c 20 73 61 76 65 20 75 73 20 66  t will save us f
fce0: 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 76  rom.      ** hav
fcf0: 69 6e 67 20 74 6f 20 6d 61 6b 65 20 61 64 64 69  ing to make addi
fd00: 74 69 6f 6e 61 6c 20 63 61 6c 6c 73 20 74 6f 20  tional calls to 
fd10: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
fd20: 74 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 20 20 20  t portion of.   
fd30: 20 20 20 2a 2a 20 74 68 65 20 72 65 63 6f 72 64     ** the record
fd40: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fd50: 20 69 66 28 20 61 76 61 69 6c 3e 3d 70 61 79 6c   if( avail>=payl
fd60: 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  oadSize ){.     
fd70: 20 20 20 7a 52 65 63 20 3d 20 7a 44 61 74 61 3b     zRec = zData;
fd80: 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  .        pC->aRo
fd90: 77 20 3d 20 28 75 38 2a 29 7a 44 61 74 61 3b 0a  w = (u8*)zData;.
fda0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fdb0: 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20       pC->aRow = 
fdc0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
fdd0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
fde0: 6f 77 69 6e 67 20 61 73 73 65 72 74 20 69 73 20  owing assert is 
fdf0: 74 72 75 65 20 69 6e 20 61 6c 6c 20 63 61 73 65  true in all case
fe00: 73 20 61 63 63 65 70 74 20 77 68 65 6e 0a 20 20  s accept when.  
fe10: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
fe20: 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
fe30: 63 6f 72 72 75 70 74 65 64 20 65 78 74 65 72 6e  corrupted extern
fe40: 61 6c 6c 79 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ally..    **    
fe50: 61 73 73 65 72 74 28 20 7a 52 65 63 21 3d 30 20  assert( zRec!=0 
fe60: 7c 7c 20 61 76 61 69 6c 3e 3d 70 61 79 6c 6f 61  || avail>=payloa
fe70: 64 53 69 7a 65 20 7c 7c 20 61 76 61 69 6c 3e 3d  dSize || avail>=
fe80: 39 20 29 3b 20 2a 2f 0a 20 20 20 20 73 7a 48 64  9 ); */.    szHd
fe90: 72 53 7a 20 3d 20 67 65 74 56 61 72 69 6e 74 33  rSz = getVarint3
fea0: 32 28 28 75 38 2a 29 7a 44 61 74 61 2c 20 6f 66  2((u8*)zData, of
feb0: 66 73 65 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  fset);..    /* T
fec0: 68 65 20 4b 65 79 46 65 74 63 68 28 29 20 6f 72  he KeyFetch() or
fed0: 20 44 61 74 61 46 65 74 63 68 28 29 20 61 62 6f   DataFetch() abo
fee0: 76 65 20 61 72 65 20 66 61 73 74 20 61 6e 64 20  ve are fast and 
fef0: 77 69 6c 6c 20 67 65 74 20 74 68 65 20 65 6e 74  will get the ent
ff00: 69 72 65 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  ire.    ** recor
ff10: 64 20 68 65 61 64 65 72 20 69 6e 20 6d 6f 73 74  d header in most
ff20: 20 63 61 73 65 73 2e 20 20 42 75 74 20 74 68 65   cases.  But the
ff30: 79 20 77 69 6c 6c 20 66 61 69 6c 20 74 6f 20 67  y will fail to g
ff40: 65 74 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a  et the complete.
ff50: 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 20 68 65      ** record he
ff60: 61 64 65 72 20 69 66 20 74 68 65 20 72 65 63 6f  ader if the reco
ff70: 72 64 20 68 65 61 64 65 72 20 64 6f 65 73 20 6e  rd header does n
ff80: 6f 74 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ot fit on a sing
ff90: 6c 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  le page.    ** i
ffa0: 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 20 57  n the B-Tree.  W
ffb0: 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73  hen that happens
ffc0: 2c 20 75 73 65 20 73 71 6c 69 74 65 33 56 64 62  , use sqlite3Vdb
ffd0: 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 29 20  eMemFromBtree() 
ffe0: 74 6f 0a 20 20 20 20 2a 2a 20 61 63 71 75 69 72  to.    ** acquir
fff0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 68  e the complete h
10000 65 61 64 65 72 20 74 65 78 74 2e 0a 20 20 20 20  eader text..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 21 7a 52 65 63  */.    if( !zRec
10020 20 26 26 20 61 76 61 69 6c 3c 6f 66 66 73 65 74   && avail<offset
10030 20 29 7b 0a 20 20 20 20 20 20 73 4d 65 6d 2e 66   ){.      sMem.f
10040 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
10050 73 4d 65 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 20  sMem.db = 0;.   
10060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10070 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
10080 70 43 72 73 72 2c 20 30 2c 20 6f 66 66 73 65 74  pCrsr, 0, offset
10090 2c 20 70 43 2d 3e 69 73 49 6e 64 65 78 2c 20 26  , pC->isIndex, &
100a0 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  sMem);.      if(
100b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
100c0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f  {.        goto o
100d0 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b 0a 20 20  p_column_out;.  
100e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 44 61 74      }.      zDat
100f0 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20  a = sMem.z;.    
10100 7d 0a 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20  }.    zEndHdr = 
10110 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 6f 66 66  (u8 *)&zData[off
10120 73 65 74 5d 3b 0a 20 20 20 20 7a 49 64 78 20 3d  set];.    zIdx =
10130 20 28 75 38 20 2a 29 26 7a 44 61 74 61 5b 73 7a   (u8 *)&zData[sz
10140 48 64 72 53 7a 5d 3b 0a 0a 20 20 20 20 2f 2a 20  HdrSz];..    /* 
10150 53 63 61 6e 20 74 68 65 20 68 65 61 64 65 72 20  Scan the header 
10160 61 6e 64 20 75 73 65 20 69 74 20 74 6f 20 66 69  and use it to fi
10170 6c 6c 20 69 6e 20 74 68 65 20 61 54 79 70 65 5b  ll in the aType[
10180 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 5d 0a  ] and aOffset[].
10190 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 20      ** arrays.  
101a0 61 54 79 70 65 5b 69 5d 20 77 69 6c 6c 20 63 6f  aType[i] will co
101b0 6e 74 61 69 6e 20 74 68 65 20 74 79 70 65 20 69  ntain the type i
101c0 6e 74 65 67 65 72 20 66 6f 72 20 74 68 65 20 69  nteger for the i
101d0 2d 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  -th.    ** colum
101e0 6e 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d  n and aOffset[i]
101f0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68   will contain th
10200 65 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68  e offset from th
10210 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
10220 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ** of the record
10230 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10240 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
10250 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20  e i-th column.  
10260 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
10270 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
10280 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 64 78  {.      if( zIdx
10290 3c 7a 45 6e 64 48 64 72 20 29 7b 0a 20 20 20 20  <zEndHdr ){.    
102a0 20 20 20 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d      aOffset[i] =
102b0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
102c0 20 7a 49 64 78 20 2b 3d 20 67 65 74 56 61 72 69   zIdx += getVari
102d0 6e 74 33 32 28 7a 49 64 78 2c 20 61 54 79 70 65  nt32(zIdx, aType
102e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  [i]);.        of
102f0 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 56  fset += sqlite3V
10300 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
10310 28 61 54 79 70 65 5b 69 5d 29 3b 0a 20 20 20 20  (aType[i]);.    
10320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10330 20 2f 2a 20 49 66 20 69 20 69 73 20 6c 65 73 73   /* If i is less
10340 20 74 68 61 74 20 6e 46 69 65 6c 64 2c 20 74 68   that nField, th
10350 65 6e 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  en there are les
10360 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68 69 73  s fields in this
10370 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 63 6f  .        ** reco
10380 72 64 20 74 68 61 6e 20 53 65 74 4e 75 6d 43 6f  rd than SetNumCo
10390 6c 75 6d 6e 73 20 69 6e 64 69 63 61 74 65 64 20  lumns indicated 
103a0 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e  there are column
103b0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
103c0 20 2a 2a 20 74 61 62 6c 65 2e 20 53 65 74 20 74   ** table. Set t
103d0 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 61 6e  he offset for an
103e0 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
103f0 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 0a 20  not present in. 
10400 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
10410 63 6f 72 64 20 74 6f 20 30 2e 20 54 68 69 73 20  cord to 0. This 
10420 74 65 6c 6c 73 20 63 6f 64 65 20 62 65 6c 6f 77  tells code below
10430 20 74 6f 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c   to store a NULL
10440 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
10450 65 61 64 20 6f 66 20 64 65 73 65 72 69 61 6c 69  ead of deseriali
10460 7a 69 6e 67 20 61 20 76 61 6c 75 65 20 66 72 6f  zing a value fro
10470 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20 20  m the record..  
10480 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10490 20 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 30 3b   aOffset[i] = 0;
104a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
104b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
104c0 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b  mRelease(&sMem);
104d0 0a 20 20 20 20 73 4d 65 6d 2e 66 6c 61 67 73 20  .    sMem.flags 
104e0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 0a 20 20 20  = MEM_Null;..   
104f0 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 72   /* If we have r
10500 65 61 64 20 6d 6f 72 65 20 68 65 61 64 65 72 20  ead more header 
10510 64 61 74 61 20 74 68 61 6e 20 77 61 73 20 63 6f  data than was co
10520 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 68  ntained in the h
10530 65 61 64 65 72 2c 0a 20 20 20 20 2a 2a 20 6f 72  eader,.    ** or
10540 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   if the end of t
10550 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61 70  he last field ap
10560 70 65 61 72 73 20 74 6f 20 62 65 20 70 61 73 74  pears to be past
10570 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
10580 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2c 20 6f      ** record, o
10590 72 20 69 66 20 74 68 65 20 65 6e 64 20 6f 66 20  r if the end of 
105a0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 61  the last field a
105b0 70 70 65 61 72 73 20 74 6f 20 62 65 20 62 65 66  ppears to be bef
105c0 6f 72 65 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ore the end.    
105d0 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  ** of the record
105e0 20 28 77 68 65 6e 20 61 6c 6c 20 66 69 65 6c 64   (when all field
105f0 73 20 70 72 65 73 65 6e 74 29 2c 20 74 68 65 6e  s present), then
10600 20 77 65 20 6d 75 73 74 20 62 65 20 64 65 61 6c   we must be deal
10610 69 6e 67 20 0a 20 20 20 20 2a 2a 20 77 69 74 68  ing .    ** with
10620 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
10630 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
10640 69 66 28 20 7a 49 64 78 3e 7a 45 6e 64 48 64 72  if( zIdx>zEndHdr
10650 20 7c 7c 20 6f 66 66 73 65 74 3e 70 61 79 6c 6f   || offset>paylo
10660 61 64 53 69 7a 65 20 0a 20 20 20 20 20 7c 7c 20  adSize .     || 
10670 28 7a 49 64 78 3d 3d 7a 45 6e 64 48 64 72 20 26  (zIdx==zEndHdr &
10680 26 20 6f 66 66 73 65 74 21 3d 70 61 79 6c 6f 61  & offset!=payloa
10690 64 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  dSize) ){.      
106a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
106b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
106c0 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f  goto op_column_o
106d0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
106e0 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
106f0 6d 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  mn information. 
10700 49 66 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 69  If aOffset[p2] i
10710 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
10720 20 0a 20 20 2a 2a 20 64 65 73 65 72 69 61 6c 69   .  ** deseriali
10730 7a 65 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ze the value fro
10740 6d 20 74 68 65 20 72 65 63 6f 72 64 2e 20 49 66  m the record. If
10750 20 61 4f 66 66 73 65 74 5b 70 32 5d 20 69 73 20   aOffset[p2] is 
10760 7a 65 72 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  zero,.  ** then 
10770 74 68 65 72 65 20 61 72 65 20 6e 6f 74 20 65 6e  there are not en
10780 6f 75 67 68 20 66 69 65 6c 64 73 20 69 6e 20 74  ough fields in t
10790 68 65 20 72 65 63 6f 72 64 20 74 6f 20 73 61 74  he record to sat
107a0 69 73 66 79 20 74 68 65 0a 20 20 2a 2a 20 72 65  isfy the.  ** re
107b0 71 75 65 73 74 2e 20 20 49 6e 20 74 68 69 73 20  quest.  In this 
107c0 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 76 61  case, set the va
107d0 6c 75 65 20 4e 55 4c 4c 20 6f 72 20 74 6f 20 50  lue NULL or to P
107e0 34 20 69 66 20 50 34 20 69 73 0a 20 20 2a 2a 20  4 if P4 is.  ** 
107f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
10800 65 6d 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a  em object..  */.
10810 20 20 69 66 28 20 61 4f 66 66 73 65 74 5b 70 32    if( aOffset[p2
10820 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
10830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10840 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 63 20 29  ;.    if( zRec )
10850 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10860 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74  dbeMemReleaseExt
10870 65 72 6e 61 6c 28 70 44 65 73 74 29 3b 0a 20 20  ernal(pDest);.  
10880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
10890 65 72 69 61 6c 47 65 74 28 28 75 38 20 2a 29 26  erialGet((u8 *)&
108a0 7a 52 65 63 5b 61 4f 66 66 73 65 74 5b 70 32 5d  zRec[aOffset[p2]
108b0 5d 2c 20 61 54 79 70 65 5b 70 32 5d 2c 20 70 44  ], aType[p2], pD
108c0 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  est);.    }else{
108d0 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  .      len = sql
108e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
108f0 70 65 4c 65 6e 28 61 54 79 70 65 5b 70 32 5d 29  peLen(aType[p2])
10900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10910 64 62 65 4d 65 6d 4d 6f 76 65 28 26 73 4d 65 6d  dbeMemMove(&sMem
10920 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  , pDest);.      
10930 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10940 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72  MemFromBtree(pCr
10950 73 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c  sr, aOffset[p2],
10960 20 6c 65 6e 2c 20 70 43 2d 3e 69 73 49 6e 64 65   len, pC->isInde
10970 78 2c 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20  x, &sMem);.     
10980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
109a0 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
109b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
109c0 7a 44 61 74 61 20 3d 20 73 4d 65 6d 2e 7a 3b 0a  zData = sMem.z;.
109d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109e0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
109f0 7a 44 61 74 61 2c 20 61 54 79 70 65 5b 70 32 5d  zData, aType[p2]
10a00 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 0a  , pDest);.    }.
10a10 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d      pDest->enc =
10a20 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 7d 65 6c   encoding;.  }el
10a30 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  se{.    if( pOp-
10a40 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4d 45 4d 20  >p4type==P4_MEM 
10a50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10a60 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
10a70 70 79 28 70 44 65 73 74 2c 20 70 4f 70 2d 3e 70  py(pDest, pOp->p
10a80 34 2e 70 4d 65 6d 2c 20 4d 45 4d 5f 53 74 61 74  4.pMem, MEM_Stat
10a90 69 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ic);.    }else{.
10aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
10ab0 65 73 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e  est->flags&MEM_N
10ac0 75 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ull );.    }.  }
10ad0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 64 79 6e  ..  /* If we dyn
10ae0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
10af0 65 64 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ed space to hold
10b00 20 74 68 65 20 64 61 74 61 20 28 69 6e 20 74 68   the data (in th
10b10 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64  e.  ** sqlite3Vd
10b20 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 29  beMemFromBtree()
10b30 20 63 61 6c 6c 20 61 62 6f 76 65 29 20 74 68 65   call above) the
10b40 6e 20 74 72 61 6e 73 66 65 72 20 63 6f 6e 74 72  n transfer contr
10b50 6f 6c 20 6f 66 20 74 68 61 74 0a 20 20 2a 2a 20  ol of that.  ** 
10b60 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
10b70 63 61 74 65 64 20 73 70 61 63 65 20 6f 76 65 72  cated space over
10b80 20 74 6f 20 74 68 65 20 70 44 65 73 74 20 73 74   to the pDest st
10b90 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
10ba0 69 73 20 70 72 65 76 65 6e 74 73 20 61 20 6d 65  is prevents a me
10bb0 6d 6f 72 79 20 63 6f 70 79 2e 0a 20 20 2a 2f 0a  mory copy..  */.
10bc0 20 20 69 66 28 20 73 4d 65 6d 2e 7a 4d 61 6c 6c    if( sMem.zMall
10bd0 6f 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  oc ){.    assert
10be0 28 20 73 4d 65 6d 2e 7a 3d 3d 73 4d 65 6d 2e 7a  ( sMem.z==sMem.z
10bf0 4d 61 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 61 73  Malloc );.    as
10c00 73 65 72 74 28 20 21 28 70 44 65 73 74 2d 3e 66  sert( !(pDest->f
10c10 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20  lags & MEM_Dyn) 
10c20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
10c30 28 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 20  (pDest->flags & 
10c40 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74  (MEM_Blob|MEM_St
10c50 72 29 29 20 7c 7c 20 70 44 65 73 74 2d 3e 7a 3d  r)) || pDest->z=
10c60 3d 73 4d 65 6d 2e 7a 20 29 3b 0a 20 20 20 20 70  =sMem.z );.    p
10c70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  Dest->flags &= ~
10c80 28 4d 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53  (MEM_Ephem|MEM_S
10c90 74 61 74 69 63 29 3b 0a 20 20 20 20 70 44 65 73  tatic);.    pDes
10ca0 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  t->flags |= MEM_
10cb0 54 65 72 6d 3b 0a 20 20 20 20 70 44 65 73 74 2d  Term;.    pDest-
10cc0 3e 7a 20 3d 20 73 4d 65 6d 2e 7a 3b 0a 20 20 20  >z = sMem.z;.   
10cd0 20 70 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 20   pDest->zMalloc 
10ce0 3d 20 73 4d 65 6d 2e 7a 4d 61 6c 6c 6f 63 3b 0a  = sMem.zMalloc;.
10cf0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
10d00 74 65 33 56 64 62 65 4d 65 6d 4d 61 6b 65 57 72  te3VdbeMemMakeWr
10d10 69 74 65 61 62 6c 65 28 70 44 65 73 74 29 3b 0a  iteable(pDest);.
10d20 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a  .op_column_out:.
10d30 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
10d40 42 53 49 5a 45 28 70 44 65 73 74 29 3b 0a 20 20  BSIZE(pDest);.  
10d50 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
10d60 4f 70 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a  Op->p3, pDest);.
10d70 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
10d80 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74 79 20  pcode: Affinity 
10d90 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 0a  P1 P2 * P4 *.**.
10da0 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74  ** Apply affinit
10db0 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65 20 6f  ies to a range o
10dc0 66 20 50 32 20 72 65 67 69 73 74 65 72 73 20 73  f P2 registers s
10dd0 74 61 72 74 69 6e 67 20 77 69 74 68 20 50 31 2e  tarting with P1.
10de0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 73  .**.** P4 is a s
10df0 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 50 32  tring that is P2
10e00 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67   characters long
10e10 2e 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63  . The nth charac
10e20 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  ter of the.** st
10e30 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74  ring indicates t
10e40 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
10e50 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
10e60 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e  e used for the n
10e70 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c  th.** memory cel
10e80 6c 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a  l in the range..
10e90 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 66 66 69 6e  */.case OP_Affin
10ea0 69 74 79 3a 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ity: {.  char *z
10eb0 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e  Affinity = pOp->
10ec0 70 34 2e 7a 3b 0a 20 20 4d 65 6d 20 2a 70 44 61  p4.z;.  Mem *pDa
10ed0 74 61 30 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  ta0 = &p->aMem[p
10ee0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 4d 65 6d 20 2a  Op->p1];.  Mem *
10ef0 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b  pLast = &pData0[
10f00 70 4f 70 2d 3e 70 32 2d 31 5d 3b 0a 20 20 4d 65  pOp->p2-1];.  Me
10f10 6d 20 2a 70 52 65 63 3b 0a 0a 20 20 66 6f 72 28  m *pRec;..  for(
10f20 70 52 65 63 3d 70 44 61 74 61 30 3b 20 70 52 65  pRec=pData0; pRe
10f30 63 3c 3d 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b  c<=pLast; pRec++
10f40 29 7b 0a 20 20 20 20 45 78 70 61 6e 64 42 6c 6f  ){.    ExpandBlo
10f50 62 28 70 52 65 63 29 3b 0a 20 20 20 20 61 70 70  b(pRec);.    app
10f60 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 63 2c  lyAffinity(pRec,
10f70 20 7a 41 66 66 69 6e 69 74 79 5b 70 52 65 63 2d   zAffinity[pRec-
10f80 70 44 61 74 61 30 5d 2c 20 65 6e 63 6f 64 69 6e  pData0], encodin
10f90 67 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  g);.  }.  break;
10fa0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d  .}../* Opcode: M
10fb0 61 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20  akeRecord P1 P2 
10fc0 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 43 6f  P3 P4 *.**.** Co
10fd0 6e 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65  nvert P2 registe
10fe0 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  rs beginning wit
10ff0 68 20 50 31 20 69 6e 74 6f 20 61 20 73 69 6e 67  h P1 into a sing
11000 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 73 75 69 74  le entry.** suit
11010 61 62 6c 65 20 66 6f 72 20 75 73 65 20 61 73 20  able for use as 
11020 61 20 64 61 74 61 20 72 65 63 6f 72 64 20 69 6e  a data record in
11030 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
11040 65 20 6f 72 20 61 73 20 61 20 6b 65 79 0a 2a 2a  e or as a key.**
11050 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 20 54   in an index.  T
11060 68 65 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68  he details of th
11070 65 20 66 6f 72 6d 61 74 20 61 72 65 20 69 72 72  e format are irr
11080 65 6c 65 76 61 6e 74 20 61 73 20 6c 6f 6e 67 20  elevant as long 
11090 61 73 0a 2a 2a 20 74 68 65 20 4f 50 5f 43 6f 6c  as.** the OP_Col
110a0 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64  umn opcode can d
110b0 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64  ecode the record
110c0 20 6c 61 74 65 72 2e 0a 2a 2a 20 52 65 66 65 72   later..** Refer
110d0 20 74 6f 20 73 6f 75 72 63 65 20 63 6f 64 65 20   to source code 
110e0 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  comments for the
110f0 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20   details of the 
11100 72 65 63 6f 72 64 0a 2a 2a 20 66 6f 72 6d 61 74  record.** format
11110 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62  ..**.** P4 may b
11120 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
11130 69 73 20 50 32 20 63 68 61 72 61 63 74 65 72 73  is P2 characters
11140 20 6c 6f 6e 67 2e 20 20 54 68 65 20 6e 74 68 20   long.  The nth 
11150 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
11160 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69 63  .** string indic
11170 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ates the column 
11180 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
11190 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
111a0 20 74 68 65 20 6e 74 68 0a 2a 2a 20 66 69 65 6c   the nth.** fiel
111b0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
111c0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  ey..**.** The ma
111d0 70 70 69 6e 67 20 66 72 6f 6d 20 63 68 61 72 61  pping from chara
111e0 63 74 65 72 20 74 6f 20 61 66 66 69 6e 69 74 79  cter to affinity
111f0 20 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65   is given by the
11200 20 53 51 4c 49 54 45 5f 41 46 46 5f 0a 2a 2a 20   SQLITE_AFF_.** 
11210 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 64 20 69  macros defined i
11220 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 2e 0a 2a  n sqliteInt.h..*
11230 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20 4e 55  *.** If P4 is NU
11240 4c 4c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 64 65  LL then all inde
11250 78 20 66 69 65 6c 64 73 20 68 61 76 65 20 74 68  x fields have th
11260 65 20 61 66 66 69 6e 69 74 79 20 4e 4f 4e 45 2e  e affinity NONE.
11270 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61 6b 65  .*/.case OP_Make
11280 52 65 63 6f 72 64 3a 20 7b 0a 20 20 2f 2a 20 41  Record: {.  /* A
11290 73 73 75 6d 69 6e 67 20 74 68 65 20 72 65 63 6f  ssuming the reco
112a0 72 64 20 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69  rd contains N fi
112b0 65 6c 64 73 2c 20 74 68 65 20 72 65 63 6f 72 64  elds, the record
112c0 20 66 6f 72 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20   format looks.  
112d0 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  ** like this:.  
112e0 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  **.  ** --------
112f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11330 0a 20 20 2a 2a 20 7c 20 68 64 72 2d 73 69 7a 65  .  ** | hdr-size
11340 20 7c 20 74 79 70 65 20 30 20 7c 20 74 79 70 65   | type 0 | type
11350 20 31 20 7c 20 2e 2e 2e 20 7c 20 74 79 70 65 20   1 | ... | type 
11360 4e 2d 31 20 7c 20 64 61 74 61 30 20 7c 20 2e 2e  N-1 | data0 | ..
11370 2e 20 7c 20 64 61 74 61 20 4e 2d 31 20 7c 20 0a  . | data N-1 | .
11380 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    ** -----------
11390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
113c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
113d0 2a 2a 0a 20 20 2a 2a 20 44 61 74 61 28 30 29 20  **.  ** Data(0) 
113e0 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  is taken from re
113f0 67 69 73 74 65 72 20 50 31 2e 20 20 44 61 74 61  gister P1.  Data
11400 28 31 29 20 63 6f 6d 65 73 20 66 72 6f 6d 20 72  (1) comes from r
11410 65 67 69 73 74 65 72 20 50 31 2b 31 0a 20 20 2a  egister P1+1.  *
11420 2a 20 61 6e 64 20 73 6f 20 66 72 6f 74 68 2e 0a  * and so froth..
11430 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 74    **.  ** Each t
11440 79 70 65 20 66 69 65 6c 64 20 69 73 20 61 20 76  ype field is a v
11450 61 72 69 6e 74 20 72 65 70 72 65 73 65 6e 74 69  arint representi
11460 6e 67 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ng the serial ty
11470 70 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  pe of the .  ** 
11480 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
11490 74 61 20 65 6c 65 6d 65 6e 74 20 28 73 65 65 20  ta element (see 
114a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
114b0 6c 54 79 70 65 28 29 29 2e 20 54 68 65 0a 20 20  lType()). The.  
114c0 2a 2a 20 68 64 72 2d 73 69 7a 65 20 66 69 65 6c  ** hdr-size fiel
114d0 64 20 69 73 20 61 6c 73 6f 20 61 20 76 61 72 69  d is also a vari
114e0 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
114f0 6f 66 66 73 65 74 20 66 72 6f 6d 20 74 68 65 20  offset from the 
11500 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f  beginning.  ** o
11510 66 20 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20  f the record to 
11520 64 61 74 61 30 2e 0a 20 20 2a 2f 0a 20 20 75 38  data0..  */.  u8
11530 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 20 20 20   *zNewRecord;   
11540 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
11550 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64 61 74   to hold the dat
11560 61 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65  a for the new re
11570 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  cord */.  Mem *p
11580 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
11590 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65 63 6f   /* The new reco
115a0 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44 61 74  rd */.  u64 nDat
115b0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
115c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
115d0 73 20 6f 66 20 64 61 74 61 20 73 70 61 63 65 20  s of data space 
115e0 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 20 3d 20  */.  int nHdr = 
115f0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  0;          /* N
11600 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
11610 66 20 68 65 61 64 65 72 20 73 70 61 63 65 20 2a  f header space *
11620 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20  /.  i64 nByte = 
11630 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  0;         /* Da
11640 74 61 20 73 70 61 63 65 20 72 65 71 75 69 72 65  ta space require
11650 64 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f 72  d for this recor
11660 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  d */.  int nZero
11670 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
11680 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20   Number of zero 
11690 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
116a0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
116b0 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e 74 3b  /.  int nVarint;
116c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
116d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
116e0 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
116f0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 20  32 serial_type; 
11700 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 66 69        /* Type fi
11710 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 44  eld */.  Mem *pD
11720 61 74 61 30 3b 20 20 20 20 20 20 20 20 20 20 20  ata0;           
11730 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64 20 74  /* First field t
11740 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20 69 6e  o be combined in
11750 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  to the record */
11760 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b 20 20  .  Mem *pLast;  
11770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
11780 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 72  t field of the r
11790 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
117a0 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Field;          
117b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
117c0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65 63  ields in the rec
117d0 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ord */.  char *z
117e0 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  Affinity;       
117f0 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20  /* The affinity 
11800 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 72  string for the r
11810 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 66  ecord */.  int f
11820 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20 20 20  ile_format;     
11830 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d 61 74    /* File format
11840 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e 63 6f   to use for enco
11850 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ding */.  int i;
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 69   /* Space used i
11880 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d 20 2a  n zNewRecord[] *
11890 2f 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  /..  nField = pO
118a0 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69  p->p1;.  zAffini
118b0 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  ty = pOp->p4.z;.
118c0 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
118d0 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20  >0 && pOp->p2>0 
118e0 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c  && pOp->p2+nFiel
118f0 64 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  d<=p->nMem );.  
11900 70 44 61 74 61 30 20 3d 20 26 70 2d 3e 61 4d 65  pData0 = &p->aMe
11910 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69  m[nField];.  nFi
11920 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  eld = pOp->p2;. 
11930 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30   pLast = &pData0
11940 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69  [nField-1];.  fi
11950 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d  le_format = p->m
11960 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
11970 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  t;..  /* Loop th
11980 72 6f 75 67 68 20 74 68 65 20 65 6c 65 6d 65 6e  rough the elemen
11990 74 73 20 74 68 61 74 20 77 69 6c 6c 20 6d 61 6b  ts that will mak
119a0 65 20 75 70 20 74 68 65 20 72 65 63 6f 72 64 20  e up the record 
119b0 74 6f 20 66 69 67 75 72 65 0a 20 20 2a 2a 20 6f  to figure.  ** o
119c0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
119d0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
119e0 72 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  r the new record
119f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 52 65  ..  */.  for(pRe
11a00 63 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d  c=pData0; pRec<=
11a10 70 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 0a  pLast; pRec++){.
11a20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
11a30 20 69 66 28 20 7a 41 66 66 69 6e 69 74 79 20 29   if( zAffinity )
11a40 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  {.      applyAff
11a50 69 6e 69 74 79 28 70 52 65 63 2c 20 7a 41 66 66  inity(pRec, zAff
11a60 69 6e 69 74 79 5b 70 52 65 63 2d 70 44 61 74 61  inity[pRec-pData
11a70 30 5d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  0], encoding);. 
11a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 65     }.    if( pRe
11a90 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 5a 65 72  c->flags&MEM_Zer
11aa0 6f 20 26 26 20 70 52 65 63 2d 3e 6e 3e 30 20 29  o && pRec->n>0 )
11ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
11ac0 64 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62  dbeMemExpandBlob
11ad0 28 70 52 65 63 29 3b 0a 20 20 20 20 7d 0a 20 20  (pRec);.    }.  
11ae0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
11af0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11b00 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65  lType(pRec, file
11b10 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 20 20 6c 65  _format);.    le
11b20 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  n = sqlite3VdbeS
11b30 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
11b40 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 6e  ial_type);.    n
11b50 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20  Data += len;.   
11b60 20 6e 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   nHdr += sqlite3
11b70 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
11b80 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  _type);.    if( 
11b90 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRec->flags & ME
11ba0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
11bb0 2f 2a 20 4f 6e 6c 79 20 70 75 72 65 20 7a 65 72  /* Only pure zer
11bc0 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 73 20 63  o-filled BLOBs c
11bd0 61 6e 20 62 65 20 69 6e 70 75 74 20 74 6f 20 74  an be input to t
11be0 68 69 73 20 4f 70 63 6f 64 65 2e 0a 20 20 20 20  his Opcode..    
11bf0 20 20 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 61    ** We do not a
11c00 6c 6c 6f 77 20 62 6c 6f 62 73 20 77 69 74 68 20  llow blobs with 
11c10 61 20 70 72 65 66 69 78 20 61 6e 64 20 61 20 7a  a prefix and a z
11c20 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
11c30 20 2a 2f 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20   */.      nZero 
11c40 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
11c50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11c60 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65  len ){.      nZe
11c70 72 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ro = 0;.    }.  
11c80 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
11c90 69 6e 69 74 69 61 6c 20 68 65 61 64 65 72 20 76  initial header v
11ca0 61 72 69 6e 74 20 61 6e 64 20 74 6f 74 61 6c 20  arint and total 
11cb0 74 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 6e 48  the size */.  nH
11cc0 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 20 3d 20  dr += nVarint = 
11cd0 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
11ce0 28 6e 48 64 72 29 3b 0a 20 20 69 66 28 20 6e 56  (nHdr);.  if( nV
11cf0 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72  arint<sqlite3Var
11d00 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 7b 0a  intLen(nHdr) ){.
11d10 20 20 20 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a      nHdr++;.  }.
11d20 20 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e    nByte = nHdr+n
11d30 44 61 74 61 2d 6e 5a 65 72 6f 3b 0a 20 20 69 66  Data-nZero;.  if
11d40 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
11d50 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11d60 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
11d70 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
11d80 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11d90 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69   the output regi
11da0 73 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65  ster has a buffe
11db0 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  r large enough t
11dc0 6f 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68  o store .  ** th
11dd0 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68  e new record. Th
11de0 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65  e output registe
11df0 72 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e  r (pOp->p3) is n
11e00 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
11e10 2a 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ** be one of the
11e20 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
11e30 20 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f   (because the fo
11e40 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a  llowing call to.
11e50 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
11e60 4d 65 6d 47 72 6f 77 28 29 20 63 6f 75 6c 64 20  MemGrow() could 
11e70 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75  clobber the valu
11e80 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
11e90 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sed)..  */.  ass
11ea0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
11eb0 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p1 || pOp->p3>
11ec0 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32  =pOp->p1+pOp->p2
11ed0 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d   );.  pOut = &p-
11ee0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
11ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
11f00 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20 28  eMemGrow(pOut, (
11f10 69 6e 74 29 6e 42 79 74 65 2c 20 30 29 20 29 7b  int)nByte, 0) ){
11f20 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
11f30 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65 63 6f  ;.  }.  zNewReco
11f40 72 64 20 3d 20 28 75 38 20 2a 29 70 4f 75 74 2d  rd = (u8 *)pOut-
11f50 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  >z;..  /* Write 
11f60 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
11f70 69 20 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28  i = putVarint32(
11f80 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e 48 64 72  zNewRecord, nHdr
11f90 29 3b 0a 20 20 66 6f 72 28 70 52 65 63 3d 70 44  );.  for(pRec=pD
11fa0 61 74 61 30 3b 20 70 52 65 63 3c 3d 70 4c 61 73  ata0; pRec<=pLas
11fb0 74 3b 20 70 52 65 63 2b 2b 29 7b 0a 20 20 20 20  t; pRec++){.    
11fc0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
11fd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
11fe0 79 70 65 28 70 52 65 63 2c 20 66 69 6c 65 5f 66  ype(pRec, file_f
11ff0 6f 72 6d 61 74 29 3b 0a 20 20 20 20 69 20 2b 3d  ormat);.    i +=
12000 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 7a 4e   putVarint32(&zN
12010 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72  ewRecord[i], ser
12020 69 61 6c 5f 74 79 70 65 29 3b 20 20 20 20 20 20  ial_type);      
12030 2f 2a 20 73 65 72 69 61 6c 20 74 79 70 65 20 2a  /* serial type *
12040 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 70 52 65 63  /.  }.  for(pRec
12050 3d 70 44 61 74 61 30 3b 20 70 52 65 63 3c 3d 70  =pData0; pRec<=p
12060 4c 61 73 74 3b 20 70 52 65 63 2b 2b 29 7b 20 20  Last; pRec++){  
12070 2f 2a 20 73 65 72 69 61 6c 20 64 61 74 61 20 2a  /* serial data *
12080 2f 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  /.    i += sqlit
12090 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
120a0 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c 20  &zNewRecord[i], 
120b0 28 69 6e 74 29 28 6e 42 79 74 65 2d 69 29 2c 20  (int)(nByte-i), 
120c0 70 52 65 63 2c 66 69 6c 65 5f 66 6f 72 6d 61 74  pRec,file_format
120d0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
120e0 20 69 3d 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20   i==nByte );..  
120f0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
12100 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d  0 && pOp->p3<=p-
12110 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 4f 75 74 2d  >nMem );.  pOut-
12120 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b  >n = (int)nByte;
12130 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
12140 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f   MEM_Blob | MEM_
12150 44 79 6e 3b 0a 20 20 70 4f 75 74 2d 3e 78 44 65  Dyn;.  pOut->xDe
12160 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 5a 65  l = 0;.  if( nZe
12170 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  ro ){.    pOut->
12180 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b  u.nZero = nZero;
12190 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
121a0 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20   |= MEM_Zero;.  
121b0 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  }.  pOut->enc = 
121c0 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a  SQLITE_UTF8;  /*
121d0 20 49 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f   In case the blo
121e0 62 20 69 73 20 65 76 65 72 20 63 6f 6e 76 65 72  b is ever conver
121f0 74 65 64 20 74 6f 20 74 65 78 74 20 2a 2f 0a 20  ted to text */. 
12200 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
12210 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29 3b 0a  pOp->p3, pOut);.
12220 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
12230 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62  BSIZE(pOut);.  b
12240 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12250 64 65 3a 20 53 74 61 74 65 6d 65 6e 74 20 50 31  de: Statement P1
12260 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42   * * * *.**.** B
12270 65 67 69 6e 20 61 6e 20 69 6e 64 69 76 69 64 75  egin an individu
12280 61 6c 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  al statement tra
12290 6e 73 61 63 74 69 6f 6e 20 77 68 69 63 68 20 69  nsaction which i
122a0 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
122b0 65 72 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  er.** transactio
122c0 6e 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  n.  This is need
122d0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  ed so that the s
122e0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
122f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
12300 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69  fter an error wi
12310 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
12320 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
12330 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
12340 69 6f 6e 2e 20 20 54 68 65 20 73 74 61 74 65 6d  ion.  The statem
12350 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12360 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
12370 6c 79 0a 2a 2a 20 63 6f 6d 6d 69 74 20 77 68 65  ly.** commit whe
12380 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73  n the VDBE halts
12390 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
123a0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
123b0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
123c0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
123d0 64 65 20 28 74 68 61 74 20 0a 2a 2a 20 69 73 20  de (that .** is 
123e0 74 6f 20 73 61 79 2c 20 69 66 20 69 74 20 69 73  to say, if it is
123f0 20 69 6e 20 62 65 74 77 65 65 6e 20 42 45 47 49   in between BEGI
12400 4e 20 61 6e 64 20 43 4f 4d 4d 49 54 29 0a 2a 2a  N and COMMIT).**
12410 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 61 72   and if there ar
12420 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76  e no other activ
12430 65 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  e statements on 
12440 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12450 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c  e.** connection,
12460 20 74 68 65 6e 20 74 68 69 73 20 6f 70 65 72 61   then this opera
12470 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
12480 20 20 4e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74    No statement t
12490 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
124a0 20 6e 65 65 64 65 64 20 73 69 6e 63 65 20 61 6e   needed since an
124b0 79 20 65 72 72 6f 72 20 63 61 6e 20 75 73 65 20  y error can use 
124c0 74 68 65 20 6e 6f 72 6d 61 6c 20 52 4f 4c 4c 42  the normal ROLLB
124d0 41 43 4b 20 70 72 6f 63 65 73 73 20 74 6f 0a 2a  ACK process to.*
124e0 2a 20 75 6e 64 6f 20 63 68 61 6e 67 65 73 2e 0a  * undo changes..
124f0 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 74 61 74 65  **.** If a state
12500 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12510 20 69 73 20 73 74 61 72 74 65 64 2c 20 74 68 65   is started, the
12520 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  n a statement jo
12530 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 77 69  urnal file.** wi
12540 6c 6c 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ll be allocated 
12550 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  and initialized.
12560 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  .**.** The state
12570 6d 65 6e 74 20 69 73 20 62 65 67 75 6e 20 6f 6e  ment is begun on
12580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12590 6c 65 20 77 69 74 68 20 69 6e 64 65 78 20 50 31  le with index P1
125a0 2e 20 20 54 68 65 20 6d 61 69 6e 0a 2a 2a 20 64  .  The main.** d
125b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
125c0 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 30 20 61   an index of 0 a
125d0 6e 64 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  nd the file used
125e0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74   for temporary t
125f0 61 62 6c 65 73 0a 2a 2a 20 68 61 73 20 61 6e 20  ables.** has an 
12600 69 6e 64 65 78 20 6f 66 20 31 2e 0a 2a 2f 0a 63  index of 1..*/.c
12610 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ase OP_Statement
12620 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  : {.  if( db->au
12630 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
12640 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
12650 3e 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >1 ){.    int i 
12660 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 42  = pOp->p1;.    B
12670 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 61  tree *pBt;.    a
12680 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
12690 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
126a0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
126b0 69 5d 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 20  i].pBt!=0 );.   
126c0 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
126d0 5d 2e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ].pBt;.    asser
126e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  t( sqlite3BtreeI
126f0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b  sInTrans(pBt) );
12700 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
12710 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31 3c  >btreeMask & (1<
12720 3c 69 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  <i))!=0 );.    i
12730 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  f( !sqlite3Btree
12740 49 73 49 6e 53 74 6d 74 28 70 42 74 29 20 29 7b  IsInStmt(pBt) ){
12750 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12760 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
12770 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 2d  t(pBt);.      p-
12780 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
12790 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
127a0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
127b0 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74  pcode: Savepoint
127c0 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
127d0 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65  ** Open, release
127e0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   or rollback the
127f0 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64   savepoint named
12800 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50 34   by parameter P4
12810 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f  , depending.** o
12820 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
12830 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77  1. To open a new
12840 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d   savepoint, P1==
12850 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63  0. To release (c
12860 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69  ommit) an.** exi
12870 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c  sting savepoint,
12880 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f   P1==1, or to ro
12890 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69  llback an existi
128a0 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d  ng savepoint P1=
128b0 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  =2..*/.case OP_S
128c0 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e  avepoint: {.  in
128d0 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  t p1 = pOp->p1;.
128e0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
128f0 70 4f 70 2d 3e 70 34 2e 7a 3b 20 20 20 20 20 20  pOp->p4.z;      
12900 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61     /* Name of sa
12910 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  vepoint */..  /*
12920 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
12930 20 70 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   p1 parameter is
12940 20 76 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61   valid. Also tha
12950 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  t if there is no
12960 20 6f 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73   open.  ** trans
12970 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  action, then the
12980 72 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79  re cannot be any
12990 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20   savepoints. .  
129a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  */.  assert( db-
129b0 3e 70 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >pSavepoint==0 |
129c0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
129d0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
129e0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
129f0 45 47 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f  EGIN||p1==SAVEPO
12a00 49 4e 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d  INT_RELEASE||p1=
12a10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12a20 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ACK );.  assert(
12a30 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
12a40 7c 7c 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  || db->isTransac
12a50 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  tionSavepoint==0
12a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68   );.  assert( ch
12a70 65 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e  eckSavepointCoun
12a80 74 28 64 62 29 20 29 3b 0a 0a 20 20 69 66 28 20  t(db) );..  if( 
12a90 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
12aa0 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64  GIN ){.    if( d
12ab0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3e  b->writeVdbeCnt>
12ac0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
12ad0 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61  new savepoint ca
12ae0 6e 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20  nnot be created 
12af0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  if there are act
12b00 69 76 65 20 77 72 69 74 65 20 0a 20 20 20 20 20  ive write .     
12b10 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28   ** statements (
12b20 69 2e 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77  i.e. open read/w
12b30 72 69 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  rite incremental
12b40 20 62 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a   blob handles)..
12b50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
12b60 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
12b70 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
12b80 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61   "cannot open sa
12b90 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20  vepoint - ".    
12ba0 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
12bb0 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
12bc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
12bd0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
12be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
12bf0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
12c00 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
12c10 20 20 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20        Savepoint 
12c20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 20 20 2f 2a  *pNew;..      /*
12c30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 61   Create a new sa
12c40 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
12c50 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  e. */.      pNew
12c60 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
12c70 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
12c80 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d  (Savepoint)+nNam
12c90 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e+1);.      if( 
12ca0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
12cb0 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
12cc0 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
12cd0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
12ce0 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
12cf0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
12d00 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
12d10 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
12d20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
12d30 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20  en mark this as 
12d40 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
12d50 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f    ** "transactio
12d60 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f  n savepoint". */
12d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
12d80 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
12d90 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
12da0 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
12db0 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
12dc0 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
12dd0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
12de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12df0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b  db->nSavepoint++
12e00 3b 0a 09 7d 0a 20 20 20 20 0a 20 20 20 20 20 20  ;..}.    .      
12e10 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
12e20 77 20 73 61 76 65 70 6f 69 6e 74 20 69 6e 74 6f  w savepoint into
12e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12e40 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20 2a 2f 0a  ndle's list. */.
12e50 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e          pNew->pN
12e60 65 78 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  ext = db->pSavep
12e70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20 64 62  oint;.        db
12e80 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
12e90 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
12ea0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
12eb0 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
12ec0 70 6f 69 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69  point;.    int i
12ed0 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a  Savepoint = 0;..
12ee0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
12ef0 6e 61 6d 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  named savepoint.
12f00 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
12f10 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 2c 20  such savepoint, 
12f20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a 2a 20 61  then an.    ** a
12f30 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
12f40 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
12f50 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 0a 20 20    */.    for(.  
12f60 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 3d 64      pSavepoint=d
12f70 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a  b->pSavepoint; .
12f80 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74        pSavepoint
12f90 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
12fa0 6d 70 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a  mp(pSavepoint->z
12fb0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
12fc0 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 3d 70      pSavepoint=p
12fd0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
12fe0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53  .    ){.      iS
12ff0 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
13000 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65  }.    if( !pSave
13010 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  point ){.      s
13020 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
13030 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
13040 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f   "no such savepo
13050 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  int: %s", zName)
13060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
13070 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
13080 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20 20  else if( .      
13090 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43    db->writeVdbeC
130a0 6e 74 3e 30 20 7c 7c 20 28 70 31 3d 3d 53 41 56  nt>0 || (p1==SAV
130b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
130c0 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  && db->activeVdb
130d0 65 43 6e 74 3e 31 29 20 0a 20 20 20 20 29 7b 0a  eCnt>1) .    ){.
130e0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
130f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
13100 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
13110 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74  a savepoint if t
13120 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20  here are .      
13130 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20  ** active write 
13140 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
13150 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13160 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 61 76  o rollback a sav
13170 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
13180 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
13190 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
131a0 74 73 20 61 74 20 61 6c 6c 2e 0a 20 20 20 20 20  ts at all..     
131b0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
131c0 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
131d0 45 72 72 4d 73 67 2c 20 64 62 2c 20 0a 20 20 20  ErrMsg, db, .   
131e0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 25 73 20       "cannot %s 
131f0 73 61 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20  savepoint - SQL 
13200 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
13210 6f 67 72 65 73 73 22 2c 0a 20 20 20 20 20 20 20  ogress",.       
13220 20 28 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (p1==SAVEPOINT_
13230 52 4f 4c 4c 42 41 43 4b 20 3f 20 22 72 6f 6c 6c  ROLLBACK ? "roll
13240 62 61 63 6b 22 3a 20 22 72 65 6c 65 61 73 65 22  back": "release"
13250 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
13260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
13270 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 0a 20  Y;.    }else{.. 
13280 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e       /* Determin
13290 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
132a0 20 74 68 69 73 20 69 73 20 61 20 74 72 61 6e 73   this is a trans
132b0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
132c0 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 2a  . If so,.      *
132d0 2a 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  * and this is a 
132e0 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61 6e 64 2c  RELEASE command,
132f0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
13300 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  t transaction . 
13310 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 6d 6d 69       ** is commi
13320 74 74 65 64 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  tted. .      */.
13330 20 20 20 20 20 20 69 6e 74 20 69 73 54 72 61 6e        int isTran
13340 73 61 63 74 69 6f 6e 20 3d 20 70 53 61 76 65 70  saction = pSavep
13350 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d 30 20 26  oint->pNext==0 &
13360 26 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74  & db->isTransact
13370 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ionSavepoint;.  
13380 20 20 20 20 69 66 28 20 69 73 54 72 61 6e 73 61      if( isTransa
13390 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41 56  ction && p1==SAV
133a0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
133b0 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  {.        db->au
133c0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
133d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
133e0 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d 53 51  3VdbeHalt(p)==SQ
133f0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
13400 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 70         p->pc = p
13410 63 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  c;.          db-
13420 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b  >autoCommit = 0;
13430 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
13440 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42   = rc = SQLITE_B
13450 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  USY;.          g
13460 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b  oto vdbe_return;
13470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13480 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63     db->isTransac
13490 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
134a0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
134b0 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  p->rc;.      }el
134c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
134d0 69 69 3b 0a 20 20 20 20 20 20 20 20 69 53 61 76  ii;.        iSav
134e0 65 70 6f 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61  epoint = db->nSa
134f0 76 65 70 6f 69 6e 74 20 2d 20 69 53 61 76 65 70  vepoint - iSavep
13500 6f 69 6e 74 20 2d 20 31 3b 0a 20 20 20 20 20 20  oint - 1;.      
13510 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
13520 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
13530 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
13540 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
13550 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  int(db->aDb[ii].
13560 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  pBt, p1, iSavepo
13570 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
13580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13590 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
135a0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
135b0 74 6f 5f 65 72 72 6f 72 3b 0a 09 20 20 7d 0a 20  to_error;..  }. 
135c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
135d0 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49   if( p1==SAVEPOI
135e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 28  NT_ROLLBACK && (
135f0 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
13600 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
13610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13620 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
13630 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
13640 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
13650 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
13660 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29  nalSchema(db, 0)
13670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13680 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
13690 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
136a0 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 20  ether this is a 
136b0 52 45 4c 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42  RELEASE or ROLLB
136c0 41 43 4b 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c  ACK, destroy all
136d0 20 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 70   .      ** savep
136e0 6f 69 6e 74 73 20 6e 65 73 74 65 64 20 69 6e 73  oints nested ins
136f0 69 64 65 20 6f 66 20 74 68 65 20 73 61 76 65 70  ide of the savep
13700 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61  oint being opera
13710 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ted on. */.     
13720 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76   while( db->pSav
13730 65 70 6f 69 6e 74 21 3d 70 53 61 76 65 70 6f 69  epoint!=pSavepoi
13740 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 61  nt ){.        Sa
13750 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20  vepoint *pTmp = 
13760 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
13770 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
13780 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
13790 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
137a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
137b0 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 64  pTmp);.        d
137c0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d 3b  b->nSavepoint--;
137d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
137e0 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52 45  /* If it is a RE
137f0 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73 74  LEASE, then dest
13800 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
13810 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
13820 20 6f 6e 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20   on too */.     
13830 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49   if( p1==SAVEPOI
13840 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
13850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
13860 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70 53  avepoint==db->pS
13870 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20 20  avepoint );.    
13880 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69      db->pSavepoi
13890 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt = pSavepoint-
138a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
138b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
138c0 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
138d0 20 20 20 20 20 20 20 69 66 28 20 21 69 73 54 72         if( !isTr
138e0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
138f0 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
13900 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 20  point--;.       
13910 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
13920 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  .  }..  break;.}
13930 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75 74  ../* Opcode: Aut
13940 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 2a 20  oCommit P1 P2 * 
13950 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  * *.**.** Set th
13960 65 20 64 61 74 61 62 61 73 65 20 61 75 74 6f 2d  e database auto-
13970 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 50  commit flag to P
13980 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66 20 50  1 (1 or 0). If P
13990 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c 6c 0a  2 is true, roll.
139a0 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75 72 72  ** back any curr
139b0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62 74 72  ently active btr
139c0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  ee transactions.
139d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
139e0 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d 73 20  y active.** VMs 
139f0 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68 69 73  (apart from this
13a00 20 6f 6e 65 29 2c 20 74 68 65 6e 20 74 68 65 20   one), then the 
13a10 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
13a20 43 4b 20 73 74 61 74 65 6d 65 6e 74 20 66 61 69  CK statement fai
13a30 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ls..**.** This i
13a40 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73 65  nstruction cause
13a50 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c 74  s the VM to halt
13a60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74  ..*/.case OP_Aut
13a70 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74  oCommit: {.  int
13a80 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d   desiredAutoComm
13a90 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  it = pOp->p1;.  
13aa0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 3d 20 70  int rollback = p
13ab0 4f 70 2d 3e 70 32 3b 0a 20 20 69 6e 74 20 74 75  Op->p2;.  int tu
13ac0 72 6e 4f 6e 41 43 20 3d 20 64 65 73 69 72 65 64  rnOnAC = desired
13ad0 41 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 21 64  AutoCommit && !d
13ae0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 0a  b->autoCommit;..
13af0 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
13b00 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c  dAutoCommit==1 |
13b10 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  | desiredAutoCom
13b20 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
13b30 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
13b40 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 72 6f 6c 6c  ommit==1 || roll
13b50 62 61 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 61 73  back==0 );..  as
13b60 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65  sert( db->active
13b70 56 64 62 65 43 6e 74 3e 30 20 29 3b 20 20 2f 2a  VdbeCnt>0 );  /*
13b80 20 41 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f   At least this o
13b90 6e 65 20 56 4d 20 69 73 20 61 63 74 69 76 65 20  ne VM is active 
13ba0 2a 2f 0a 0a 20 20 69 66 28 20 74 75 72 6e 4f 6e  */..  if( turnOn
13bb0 41 43 20 26 26 20 72 6f 6c 6c 62 61 63 6b 20 26  AC && rollback &
13bc0 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  & db->activeVdbe
13bd0 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Cnt>1 ){.    /* 
13be0 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  If this instruct
13bf0 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ion implements a
13c00 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 6f 74   ROLLBACK and ot
13c10 68 65 72 20 56 4d 73 20 61 72 65 0a 20 20 20 20  her VMs are.    
13c20 2a 2a 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67  ** still running
13c30 2c 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63 74  , and a transact
13c40 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 72  ion is active, r
13c50 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
13c60 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a  ndicating.    **
13c70 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20   that the other 
13c80 56 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  VMs must complet
13c90 65 20 66 69 72 73 74 2e 20 0a 20 20 20 20 2a 2f  e first. .    */
13ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
13cb0 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
13cc0 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74 20 72  g, db, "cannot r
13cd0 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
13ce0 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20 20 20  ion - ".        
13cf0 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20  "SQL statements 
13d00 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20  in progress");. 
13d10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
13d20 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  USY;.  }else if(
13d30 20 74 75 72 6e 4f 6e 41 43 20 26 26 20 21 72 6f   turnOnAC && !ro
13d40 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 77 72  llback && db->wr
13d50 69 74 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a  iteVdbeCnt>1 ){.
13d60 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
13d70 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70 6c 65  nstruction imple
13d80 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54 20 61  ments a COMMIT a
13d90 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61 72 65  nd other VMs are
13da0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
13db0 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
13dc0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
13dd0 74 68 65 20 6f 74 68 65 72 20 56 4d 73 20 6d 75  the other VMs mu
13de0 73 74 20 63 6f 6d 70 6c 65 74 65 20 66 69 72 73  st complete firs
13df0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  t. .    */.    s
13e00 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
13e10 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
13e20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20   "cannot commit 
13e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20 22 0a  transaction - ".
13e40 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61          "SQL sta
13e50 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
13e60 65 73 73 22 29 3b 0a 20 20 20 20 72 63 20 3d 20  ess");.    rc = 
13e70 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
13e80 65 6c 73 65 20 69 66 28 20 64 65 73 69 72 65 64  else if( desired
13e90 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d 3e  AutoCommit!=db->
13ea0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
13eb0 20 20 69 66 28 20 72 6f 6c 6c 62 61 63 6b 20 29    if( rollback )
13ec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13ed0 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
13ee0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t==1 );.      sq
13ef0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13f00 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  (db);.      db->
13f10 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
13f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f30 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
13f40 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74  = (u8)desiredAut
13f50 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 20 20 69  oCommit;.      i
13f60 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  f( sqlite3VdbeHa
13f70 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42 55  lt(p)==SQLITE_BU
13f80 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  SY ){.        p-
13f90 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20  >pc = pc;.      
13fa0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13fb0 20 3d 20 28 75 38 29 28 31 2d 64 65 73 69 72 65   = (u8)(1-desire
13fc0 64 41 75 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20  dAutoCommit);.  
13fd0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13fe0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
13ff0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
14000 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
14010 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
14020 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14030 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  ts(db);.    if( 
14040 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14050 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14060 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
14070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
14080 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
14090 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76      }.    goto v
140a0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65  dbe_return;.  }e
140b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
140c0 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
140d0 72 72 4d 73 67 2c 20 64 62 2c 0a 20 20 20 20 20  rrMsg, db,.     
140e0 20 20 20 28 21 64 65 73 69 72 65 64 41 75 74 6f     (!desiredAuto
140f0 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20  Commit)?"cannot 
14100 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
14110 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61  ion within a tra
14120 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20  nsaction":(.    
14130 20 20 20 20 28 72 6f 6c 6c 62 61 63 6b 29 3f 22      (rollback)?"
14140 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  cannot rollback 
14150 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  - no transaction
14160 20 69 73 20 61 63 74 69 76 65 22 3a 0a 20 20 20   is active":.   
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d  "cannot commit -
14190 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
141a0 69 73 20 61 63 74 69 76 65 22 29 29 3b 0a 20 20  is active"));.  
141b0 20 20 20 20 20 20 20 0a 20 20 20 20 72 63 20 3d         .    rc =
141c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
141d0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
141e0 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73 61  * Opcode: Transa
141f0 63 74 69 6f 6e 20 50 31 20 50 32 20 2a 20 2a 20  ction P1 P2 * * 
14200 2a 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  *.**.** Begin a 
14210 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68  transaction.  Th
14220 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 6e  e transaction en
14230 64 73 20 77 68 65 6e 20 61 20 43 6f 6d 6d 69 74  ds when a Commit
14240 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   or Rollback.** 
14250 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
14260 74 65 72 65 64 2e 20 20 44 65 70 65 6e 64 69 6e  tered.  Dependin
14270 67 20 6f 6e 20 74 68 65 20 4f 4e 20 43 4f 4e 46  g on the ON CONF
14280 4c 49 43 54 20 73 65 74 74 69 6e 67 2c 20 74 68  LICT setting, th
14290 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
142a0 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 72   might also be r
142b0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20 61 6e  olled back if an
142c0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
142d0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20  tered..**.** P1 
142e0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
142f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14300 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 74  e on which the t
14310 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
14320 20 73 74 61 72 74 65 64 2e 20 20 49 6e 64 65 78   started.  Index
14330 20 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64   0 is the main d
14340 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
14350 20 69 6e 64 65 78 20 31 20 69 73 20 74 68 65 0a   index 1 is the.
14360 2a 2a 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  ** file used for
14370 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14380 73 2e 20 20 49 6e 64 69 63 65 73 20 6f 66 20 32  s.  Indices of 2
14390 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 75 73 65   or more are use
143a0 64 20 66 6f 72 0a 2a 2a 20 61 74 74 61 63 68 65  d for.** attache
143b0 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  d databases..**.
143c0 2a 2a 20 49 66 20 50 32 20 69 73 20 6e 6f 6e 2d  ** If P2 is non-
143d0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 77 72 69  zero, then a wri
143e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
143f0 73 20 73 74 61 72 74 65 64 2e 20 20 41 20 52 45  s started.  A RE
14400 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 0a 2a  SERVED lock is.*
14410 2a 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  * obtained on th
14420 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14430 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  when a write-tra
14440 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14450 74 65 64 2e 20 20 4e 6f 0a 2a 2a 20 6f 74 68 65  ted.  No.** othe
14460 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 73 74  r process can st
14470 61 72 74 20 61 6e 6f 74 68 65 72 20 77 72 69 74  art another writ
14480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 68  e transaction wh
14490 69 6c 65 20 74 68 69 73 20 74 72 61 6e 73 61 63  ile this transac
144a0 74 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 64 65 72  tion is.** under
144b0 77 61 79 2e 20 20 53 74 61 72 74 69 6e 67 20 61  way.  Starting a
144c0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
144d0 6f 6e 20 61 6c 73 6f 20 63 72 65 61 74 65 73 20  on also creates 
144e0 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
144f0 61 6c 2e 20 41 0a 2a 2a 20 77 72 69 74 65 20 74  al. A.** write t
14500 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
14510 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
14520 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 63 61  e any changes ca
14530 6e 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65  n be made to the
14540 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 49  .** database.  I
14550 66 20 50 32 20 69 73 20 32 20 6f 72 20 67 72 65  f P2 is 2 or gre
14560 61 74 65 72 20 74 68 65 6e 20 61 6e 20 45 58 43  ater then an EXC
14570 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61  LUSIVE lock is a
14580 6c 73 6f 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  lso obtained.** 
14590 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  on the file..**.
145a0 2a 2a 20 49 66 20 50 32 20 69 73 20 7a 65 72 6f  ** If P2 is zero
145b0 2c 20 74 68 65 6e 20 61 20 72 65 61 64 2d 6c 6f  , then a read-lo
145c0 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
145d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
145e0 69 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ile..*/.case OP_
145f0 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
14600 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31   int i = pOp->p1
14610 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  ;.  Btree *pBt;.
14620 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
14630 26 26 20 69 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  && i<db->nDb );.
14640 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74    assert( (p->bt
14650 72 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 69 29  reeMask & (1<<i)
14660 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d 20  )!=0 );.  pBt = 
14670 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
14680 0a 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20  .  if( pBt ){.  
14690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
146a0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
146b0 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20  t, pOp->p2);.   
146c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
146d0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d  BUSY ){.      p-
146e0 3e 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20  >pc = pc;.      
146f0 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c  p->rc = rc = SQL
14700 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
14710 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
14720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
14740 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44   rc!=SQLITE_READ
14750 4f 4e 4c 59 20 2f 2a 20 26 26 20 72 63 21 3d 53  ONLY /* && rc!=S
14760 51 4c 49 54 45 5f 42 55 53 59 20 2a 2f 20 29 7b  QLITE_BUSY */ ){
14770 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  .      goto abor
14780 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
14790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
147a0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
147b0 20 52 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50   ReadCookie P1 P
147c0 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52  2 P3 * *.**.** R
147d0 65 61 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65  ead cookie numbe
147e0 72 20 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61  r P3 from databa
147f0 73 65 20 50 31 20 61 6e 64 20 77 72 69 74 65 20  se P1 and write 
14800 69 74 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  it into register
14810 20 50 32 2e 0a 2a 2a 20 50 33 3d 3d 30 20 69 73   P2..** P3==0 is
14820 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
14830 69 6f 6e 2e 20 20 50 33 3d 3d 31 20 69 73 20 74  ion.  P3==1 is t
14840 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  he database form
14850 61 74 2e 0a 2a 2a 20 50 33 3d 3d 32 20 69 73 20  at..** P3==2 is 
14860 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  the recommended 
14870 70 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65  pager cache size
14880 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
14890 20 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65   P1==0 is.** the
148a0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
148b0 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73  ile and P1==1 is
148c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
148d0 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
148e0 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61  .** temporary ta
148f0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  bles..**.** If P
14900 31 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  1 is negative, t
14910 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 72 65  hen this is a re
14920 71 75 65 73 74 20 74 6f 20 72 65 61 64 20 74 68  quest to read th
14930 65 20 73 69 7a 65 20 6f 66 20 61 0a 2a 2a 20 64  e size of a.** d
14940 61 74 61 62 61 73 65 73 20 66 72 65 65 2d 6c 69  atabases free-li
14950 73 74 2e 20 50 33 20 6d 75 73 74 20 62 65 20 73  st. P3 must be s
14960 65 74 20 74 6f 20 31 20 69 6e 20 74 68 69 73 20  et to 1 in this 
14970 63 61 73 65 2e 20 54 68 65 20 61 63 74 75 61 6c  case. The actual
14980 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 63  .** database acc
14990 65 73 73 65 64 20 69 73 20 28 28 50 31 2b 31 29  essed is ((P1+1)
149a0 2a 2d 31 29 2e 20 46 6f 72 20 65 78 61 6d 70 6c  *-1). For exampl
149b0 65 2c 20 61 20 50 31 20 70 61 72 61 6d 65 74 65  e, a P1 paramete
149c0 72 20 6f 66 20 2d 31 0a 2a 2a 20 63 6f 72 72 65  r of -1.** corre
149d0 73 70 6f 6e 64 73 20 74 6f 20 64 61 74 61 62 61  sponds to databa
149e0 73 65 20 30 20 28 22 6d 61 69 6e 22 29 2c 20 61  se 0 ("main"), a
149f0 20 50 31 20 6f 66 20 2d 32 20 69 73 20 64 61 74   P1 of -2 is dat
14a00 61 62 61 73 65 20 31 20 28 22 74 65 6d 70 22 29  abase 1 ("temp")
14a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
14a20 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f 63  st be a read-loc
14a30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14a40 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61 6e  e (either a tran
14a50 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
14a60 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74 68  be started or th
14a70 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f  ere must be an o
14a80 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66 6f  pen cursor) befo
14a90 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  re.** executing 
14aa0 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
14ab0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61  ..*/.case OP_Rea
14ac0 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20  dCookie: {      
14ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
14ae0 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
14af0 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
14b00 74 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b  t iDb = pOp->p1;
14b10 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 20 3d  .  int iCookie =
14b20 20 70 4f 70 2d 3e 70 33 3b 0a 0a 20 20 61 73 73   pOp->p3;..  ass
14b30 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c  ert( pOp->p3<SQL
14b40 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
14b50 20 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20   );.  if( iDb<0 
14b60 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 28 2d 31  ){.    iDb = (-1
14b70 2a 28 69 44 62 2b 31 29 29 3b 0a 20 20 20 20 69  *(iDb+1));.    i
14b80 43 6f 6f 6b 69 65 20 2a 3d 20 2d 31 3b 0a 20 20  Cookie *= -1;.  
14b90 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  }.  assert( iDb>
14ba0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
14bb0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
14bc0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
14bd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14be0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
14bf0 28 31 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a  (1<<iDb))!=0 );.
14c00 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 69 6e    /* The indexin
14c10 67 20 6f 66 20 6d 65 74 61 20 76 61 6c 75 65 73  g of meta values
14c20 20 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 6c   at the schema l
14c30 61 79 65 72 20 69 73 20 6f 66 66 20 62 79 20 6f  ayer is off by o
14c40 6e 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ne from.  ** the
14c50 20 69 6e 64 65 78 69 6e 67 20 69 6e 20 74 68 65   indexing in the
14c60 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20 54   btree layer.  T
14c70 68 65 20 62 74 72 65 65 20 63 6f 6e 73 69 64 65  he btree conside
14c80 72 73 20 6d 65 74 61 5b 30 5d 20 74 6f 0a 20 20  rs meta[0] to.  
14c90 2a 2a 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  ** be the number
14ca0 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 69   of free pages i
14cb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
14cc0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 76 61 6c 75  a read-only valu
14cd0 65 29 0a 20 20 2a 2a 20 61 6e 64 20 6d 65 74 61  e).  ** and meta
14ce0 5b 31 5d 20 74 6f 20 62 65 20 74 68 65 20 73 63  [1] to be the sc
14cf0 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20 54 68  hema cookie.  Th
14d00 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 63  e schema layer c
14d10 6f 6e 73 69 64 65 72 73 0a 20 20 2a 2a 20 6d 65  onsiders.  ** me
14d20 74 61 5b 31 5d 20 74 6f 20 62 65 20 74 68 65 20  ta[1] to be the 
14d30 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 20 20  schema cookie.  
14d40 53 6f 20 77 65 20 68 61 76 65 20 74 6f 20 73 68  So we have to sh
14d50 69 66 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20  ift the index.  
14d60 2a 2a 20 62 79 20 6f 6e 65 20 69 6e 20 74 68 65  ** by one in the
14d70 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
14d80 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ment..  */.  rc 
14d90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
14da0 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44  tMeta(db->aDb[iD
14db0 62 5d 2e 70 42 74 2c 20 31 20 2b 20 69 43 6f 6f  b].pBt, 1 + iCoo
14dc0 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69 4d 65  kie, (u32 *)&iMe
14dd0 74 61 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  ta);.  pOut->u.i
14de0 20 3d 20 69 4d 65 74 61 3b 0a 20 20 4d 65 6d 53   = iMeta;.  MemS
14df0 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
14e00 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65   MEM_Int);.  bre
14e10 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
14e20 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31 20 50  : SetCookie P1 P
14e30 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57  2 P3 * *.**.** W
14e40 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
14e50 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20   of register P3 
14e60 28 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20  (interpreted as 
14e70 61 6e 20 69 6e 74 65 67 65 72 29 0a 2a 2a 20 69  an integer).** i
14e80 6e 74 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65  nto cookie numbe
14e90 72 20 50 32 20 6f 66 20 64 61 74 61 62 61 73 65  r P2 of database
14ea0 20 50 31 2e 0a 2a 2a 20 50 32 3d 3d 30 20 69 73   P1..** P2==0 is
14eb0 20 74 68 65 20 73 63 68 65 6d 61 20 76 65 72 73   the schema vers
14ec0 69 6f 6e 2e 20 20 50 32 3d 3d 31 20 69 73 20 74  ion.  P2==1 is t
14ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  he database form
14ee0 61 74 2e 0a 2a 2a 20 50 32 3d 3d 32 20 69 73 20  at..** P2==2 is 
14ef0 74 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  the recommended 
14f00 70 61 67 65 72 20 63 61 63 68 65 20 73 69 7a 65  pager cache size
14f10 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
14f20 20 50 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65   P1==0 is.** the
14f30 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
14f40 69 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73  ile and P1==1 is
14f50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f60 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  le used to store
14f70 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61  .** temporary ta
14f80 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  bles..**.** A tr
14f90 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
14fa0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
14fb0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
14fc0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20  opcode..*/.case 
14fd0 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 20  OP_SetCookie: { 
14fe0 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f 0a        /* in3 */.
14ff0 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
15000 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c  ert( pOp->p2<SQL
15010 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
15020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
15030 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
15040 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
15050 20 61 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72   assert( (p->btr
15060 65 65 4d 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70  eeMask & (1<<pOp
15070 2d 3e 70 31 29 29 21 3d 30 20 29 3b 0a 20 20 70  ->p1))!=0 );.  p
15080 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f  Db = &db->aDb[pO
15090 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
150a0 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b  ( pDb->pBt!=0 );
150b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
150c0 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33  mIntegerify(pIn3
150d0 29 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65  );.  /* See note
150e0 20 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69   about index shi
150f0 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64  fting on OP_Read
15100 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d  Cookie */.  rc =
15110 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
15120 61 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74  ateMeta(pDb->pBt
15130 2c 20 31 2b 70 4f 70 2d 3e 70 32 2c 20 28 69 6e  , 1+pOp->p2, (in
15140 74 29 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  t)pIn3->u.i);.  
15150 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29  if( pOp->p2==0 )
15160 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  {.    /* When th
15170 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
15180 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20  changes, record 
15190 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69  the new cookie i
151a0 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20  nternally */.   
151b0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73   pDb->pSchema->s
151c0 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 28  chema_cookie = (
151d0 69 6e 74 29 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20  int)pIn3->u.i;. 
151e0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
151f0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
15200 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nges;.  }else if
15210 28 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a  ( pOp->p2==1 ){.
15220 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 63 68      /* Record ch
15230 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  anges in the fil
15240 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e format */.    
15250 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69  pDb->pSchema->fi
15260 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 28 75 38 29  le_format = (u8)
15270 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20  pIn3->u.i;.  }. 
15280 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31 20   if( pOp->p1==1 
15290 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c 69  ){.    /* Invali
152a0 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72 65  date all prepare
152b0 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65  d statements whe
152c0 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50 20 64  never the TEMP d
152d0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 73  atabase.    ** s
152e0 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65 64  chema is changed
152f0 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34 34 20  .  Ticket #1644 
15300 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
15310 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
15320 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 0a  ements(db);.  }.
15330 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
15340 70 63 6f 64 65 3a 20 56 65 72 69 66 79 43 6f 6f  pcode: VerifyCoo
15350 6b 69 65 20 50 31 20 50 32 20 2a 0a 2a 2a 0a 2a  kie P1 P2 *.**.*
15360 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75  * Check the valu
15370 65 20 6f 66 20 67 6c 6f 62 61 6c 20 64 61 74 61  e of global data
15380 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 20 6e  base parameter n
15390 75 6d 62 65 72 20 30 20 28 74 68 65 0a 2a 2a 20  umber 0 (the.** 
153a0 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 29 20  schema version) 
153b0 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74  and make sure it
153c0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50 32 2e   is equal to P2.
153d0 20 20 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20    .** P1 is the 
153e0 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
153f0 77 68 69 63 68 20 69 73 20 30 20 66 6f 72 20 74  which is 0 for t
15400 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15410 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 31 20 66   file.** and 1 f
15420 6f 72 20 74 68 65 20 66 69 6c 65 20 68 6f 6c 64  or the file hold
15430 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
15440 62 6c 65 73 20 61 6e 64 20 73 6f 6d 65 20 68 69  bles and some hi
15450 67 68 65 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 66  gher number.** f
15460 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  or auxiliary dat
15470 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
15480 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  e cookie changes
15490 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e 65   its value whene
154a0 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ver the database
154b0 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e   schema changes.
154c0 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
154d0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  on is used to de
154e0 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20 74  tect when that t
154f0 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63 68  he cookie has ch
15500 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61  anged.** and tha
15510 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  t the current pr
15520 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20 72  ocess needs to r
15530 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d 61  eread the schema
15540 2e 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 61  ..**.** Either a
15550 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
15560 64 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  ds to have been 
15570 73 74 61 72 74 65 64 20 6f 72 20 61 6e 20 4f 50  started or an OP
15580 5f 4f 70 65 6e 20 6e 65 65 64 73 0a 2a 2a 20 74  _Open needs.** t
15590 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 28 74  o be executed (t
155a0 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
155b0 61 64 20 6c 6f 63 6b 29 20 62 65 66 6f 72 65 20  ad lock) before 
155c0 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 0a 2a  this opcode is.*
155d0 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 63 61  * invoked..*/.ca
155e0 73 65 20 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b  se OP_VerifyCook
155f0 69 65 3a 20 7b 0a 20 20 69 6e 74 20 69 4d 65 74  ie: {.  int iMet
15600 61 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  a;.  Btree *pBt;
15610 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
15620 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
15630 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
15640 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
15650 61 73 6b 20 26 20 28 31 3c 3c 70 4f 70 2d 3e 70  ask & (1<<pOp->p
15660 31 29 29 21 3d 30 20 29 3b 0a 20 20 70 42 74 20  1))!=0 );.  pBt 
15670 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
15680 31 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  1].pBt;.  if( pB
15690 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
156a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
156b0 61 28 70 42 74 2c 20 31 2c 20 28 75 33 32 20 2a  a(pBt, 1, (u32 *
156c0 29 26 69 4d 65 74 61 29 3b 0a 20 20 7d 65 6c 73  )&iMeta);.  }els
156d0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
156e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 4d 65 74 61  TE_OK;.    iMeta
156f0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
15700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15710 20 69 4d 65 74 61 21 3d 70 4f 70 2d 3e 70 32 20   iMeta!=pOp->p2 
15720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
15730 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
15740 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
15750 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
15760 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61  StrDup(db, "data
15770 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
15780 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f  changed");.    /
15790 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d  * If the schema-
157a0 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20  cookie from the 
157b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
157c0 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65  tches the cookie
157d0 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20   .    ** stored 
157e0 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  with the in-memo
157f0 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
15800 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c  n of the schema,
15810 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72   do.    ** not r
15820 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61  eload the schema
15830 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
15840 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  se file..    **.
15850 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61      ** If virtua
15860 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20  l-tables are in 
15870 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  use, this is not
15880 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a   just an optimiz
15890 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66  ation..    ** Of
158a0 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74  ten, v-tables st
158b0 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69  ore their data i
158c0 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74  n other SQLite t
158d0 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20  ables, which.   
158e0 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20   ** are queried 
158f0 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78  from within xNex
15900 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d  t() and other v-
15910 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73  table methods us
15920 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61  ing.    ** prepa
15930 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20  red queries. If 
15940 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20  such a query is 
15950 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20  out-of-date, we 
15960 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20  do not want to. 
15970 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
15980 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
15990 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63  a, as the user c
159a0 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  ode implementing
159b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61   the.    ** v-ta
159c0 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74  ble would have t
159d0 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74  o be ready for t
159e0 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
159f0 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
15a00 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
15a10 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76  validated whenev
15a20 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  er sqlite3_step(
15a30 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
15a40 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
15a50 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64  a v-table method
15a60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15a70 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
15a80 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
15a90 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20  a_cookie!=iMeta 
15aa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15ab0 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
15ac0 65 6d 61 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29  ema(db, pOp->p1)
15ad0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
15ae0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
15af0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
15b00 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
15b10 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20  E_SCHEMA;.  }.  
15b20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
15b30 6f 64 65 3a 20 4f 70 65 6e 52 65 61 64 20 50 31  ode: OpenRead P1
15b40 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a   P2 P3 P4 P5.**.
15b50 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f  ** Open a read-o
15b60 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72 20 74  nly cursor for t
15b70 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
15b80 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  e whose root pag
15b90 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20 61 20  e is.** P2 in a 
15ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
15bb0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
15bc0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
15bd0 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d 3d 30  by P3. .** P3==0
15be0 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
15bf0 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d 31 20  database, P3==1 
15c00 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
15c10 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  se used for .** 
15c20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
15c30 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61 6e 73  , and P3>1 means
15c40 20 75 73 65 64 20 74 68 65 20 63 6f 72 72 65 73   used the corres
15c50 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68 65 64  ponding attached
15c60 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 47  .** database.  G
15c70 69 76 65 20 74 68 65 20 6e 65 77 20 63 75 72 73  ive the new curs
15c80 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  or an identifier
15c90 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50 31 0a   of P1.  The P1.
15ca0 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64 20 6e  ** values need n
15cb0 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f 75 73  ot be contiguous
15cc0 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61 6c 75   but all P1 valu
15cd0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 6d 61  es should be sma
15ce0 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 20  ll integers..** 
15cf0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 66  It is an error f
15d00 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65 67 61  or P1 to be nega
15d10 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tive..**.** If P
15d20 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20 74 68  5!=0 then use th
15d30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
15d40 69 73 74 65 72 20 50 32 20 61 73 20 74 68 65 20  ister P2 as the 
15d50 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74 0a 2a  root page, not.*
15d60 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  * the value of P
15d70 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  2 itself..**.** 
15d80 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20 61 20  There will be a 
15d90 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
15da0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 65 76   database whenev
15db0 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  er there is an.*
15dc0 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e 20 20  * open cursor.  
15dd0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
15de0 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70 72 69  was unlocked pri
15df0 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73 74 72  or to this instr
15e00 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e 20 61  uction.** then a
15e10 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 61 63   read lock is ac
15e20 71 75 69 72 65 64 20 61 73 20 70 61 72 74 20 6f  quired as part o
15e30 66 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  f this instructi
15e40 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a 20 6c  on.  A read.** l
15e50 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68 65 72  ock allows other
15e60 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20 72 65   processes to re
15e70 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
15e80 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a 2a 2a  but prohibits.**
15e90 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
15ea0 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79 69 6e  ss from modifyin
15eb0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
15ec0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 69   The read lock i
15ed0 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20 77 68  s.** released wh
15ee0 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
15ef0 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66 20 74  re closed.  If t
15f00 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
15f10 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 67  attempts.** to g
15f20 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 62  et a read lock b
15f30 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20 73 63  ut fails, the sc
15f40 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65 73 20  ript terminates 
15f50 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
15f60 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63 6f 64  E_BUSY error cod
15f70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
15f80 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
15f90 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
15fa0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
15fb0 65 66 69 6e 65 73 20 74 68 65 0a 2a 2a 20 63 6f  efines the.** co
15fc0 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
15fd0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
15fe0 69 6e 64 69 63 65 73 2e 20 20 50 34 20 69 73 20  indices.  P4 is 
15ff0 4e 55 4c 4c 20 66 6f 72 20 63 75 72 73 6f 72 73  NULL for cursors
16000 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74  .** that are not
16010 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e 64   pointing to ind
16020 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ices..**.** See 
16030 61 6c 73 6f 20 4f 70 65 6e 57 72 69 74 65 2e 0a  also OpenWrite..
16040 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  */./* Opcode: Op
16050 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50 33  enWrite P1 P2 P3
16060 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 4f 70 65   P4 P5.**.** Ope
16070 6e 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63  n a read/write c
16080 75 72 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f  ursor named P1 o
16090 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  n the table or i
160a0 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a  ndex whose root.
160b0 2a 2a 20 70 61 67 65 20 69 73 20 50 32 2e 20 20  ** page is P2.  
160c0 4f 72 20 69 66 20 50 35 21 3d 30 20 75 73 65 20  Or if P5!=0 use 
160d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
160e0 65 67 69 73 74 65 72 20 50 32 20 74 6f 20 66 69  egister P2 to fi
160f0 6e 64 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  nd the.** root p
16100 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  age..**.** The P
16110 34 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  4 value is a poi
16120 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
16130 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
16140 20 64 65 66 69 6e 65 73 20 74 68 65 0a 2a 2a 20   defines the.** 
16150 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c  content and coll
16160 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
16170 66 20 69 6e 64 69 63 65 73 2e 20 20 50 34 20 69  f indices.  P4 i
16180 73 20 4e 55 4c 4c 20 66 6f 72 20 63 75 72 73 6f  s NULL for curso
16190 72 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  rs.** that are n
161a0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69  ot pointing to i
161b0 6e 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndices..**.** Th
161c0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  is instruction w
161d0 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f  orks just like O
161e0 70 65 6e 52 65 61 64 20 65 78 63 65 70 74 20 74  penRead except t
161f0 68 61 74 20 69 74 20 6f 70 65 6e 73 20 74 68 65  hat it opens the
16200 20 63 75 72 73 6f 72 0a 2a 2a 20 69 6e 20 72 65   cursor.** in re
16210 61 64 2f 77 72 69 74 65 20 6d 6f 64 65 2e 20 20  ad/write mode.  
16220 46 6f 72 20 61 20 67 69 76 65 6e 20 74 61 62 6c  For a given tabl
16230 65 2c 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  e, there can be 
16240 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 65 61 64  one or more read
16250 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
16260 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 61   or a single rea
16270 64 2f 77 72 69 74 65 20 63 75 72 73 6f 72 20 62  d/write cursor b
16280 75 74 20 6e 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a  ut not both..**.
16290 2a 2a 20 53 65 65 20 61 6c 73 6f 20 4f 70 65 6e  ** See also Open
162a0 52 65 61 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Read..*/.case OP
162b0 5f 4f 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20  _OpenRead:.case 
162c0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3a 20 7b 0a  OP_OpenWrite: {.
162d0 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
162e0 31 3b 0a 20 20 69 6e 74 20 70 32 20 3d 20 70 4f  1;.  int p2 = pO
162f0 70 2d 3e 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  p->p2;.  int iDb
16300 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 6e   = pOp->p3;.  in
16310 74 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65  t wrFlag;.  Btre
16320 65 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72  e *pX;.  VdbeCur
16330 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20  sor *pCur;.  Db 
16340 2a 70 44 62 3b 0a 20 20 0a 20 20 61 73 73 65 72  *pDb;.  .  asser
16350 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
16360 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
16370 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d  sert( (p->btreeM
16380 61 73 6b 20 26 20 28 31 3c 3c 69 44 62 29 29 21  ask & (1<<iDb))!
16390 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  =0 );.  pDb = &d
163a0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
163b0 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20 20  X = pDb->pBt;.  
163c0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
163d0 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
163e0 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
163f0 20 29 7b 0a 20 20 20 20 77 72 46 6c 61 67 20 3d   ){.    wrFlag =
16400 20 31 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d   1;.    if( pDb-
16410 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
16420 6f 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72  ormat < p->minWr
16430 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b  iteFileFormat ){
16440 0a 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69  .      p->minWri
16450 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70  teFileFormat = p
16460 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
16470 65 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a  e_format;.    }.
16480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46    }else{.    wrF
16490 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  lag = 0;.  }.  i
164a0 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
164b0 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29    assert( p2>0 )
164c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
164d0 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  <=p->nMem );.   
164e0 20 70 49 6e 32 20 3d 20 26 70 2d 3e 61 4d 65 6d   pIn2 = &p->aMem
164f0 5b 70 32 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [p2];.    sqlite
16500 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
16510 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70 32  fy(pIn2);.    p2
16520 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75 2e   = (int)pIn2->u.
16530 69 3b 0a 20 20 20 20 69 66 28 20 70 32 3c 32 20  i;.    if( p2<2 
16540 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ) {.      rc = S
16550 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16560 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  PT;.      goto a
16570 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
16580 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  r;.    }.  }.  a
16590 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20  ssert( i>=0 );. 
165a0 20 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65   pCur = allocate
165b0 43 75 72 73 6f 72 28 70 2c 20 69 2c 20 26 70 4f  Cursor(p, i, &pO
165c0 70 5b 2d 31 5d 2c 20 69 44 62 2c 20 31 29 3b 0a  p[-1], iDb, 1);.
165d0 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
165e0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70  goto no_mem;.  p
165f0 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  Cur->nullRow = 1
16600 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16610 42 74 72 65 65 43 75 72 73 6f 72 28 70 58 2c 20  BtreeCursor(pX, 
16620 70 32 2c 20 77 72 46 6c 61 67 2c 20 70 4f 70 2d  p2, wrFlag, pOp-
16630 3e 70 34 2e 70 2c 20 70 43 75 72 2d 3e 70 43 75  >p4.p, pCur->pCu
16640 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 70 4f 70  rsor);.  if( pOp
16650 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
16660 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 43 75 72  INFO ){.    pCur
16670 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70  ->pKeyInfo = pOp
16680 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
16690 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
166a0 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 2d 3e  o->enc = ENC(p->
166b0 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
166c0 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
166d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 77 69 74   = 0;.  }.  swit
166e0 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
166f0 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
16700 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20  {.      p->pc = 
16710 70 63 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  pc;.      p->rc 
16720 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  = rc = SQLITE_BU
16730 53 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76  SY;.      goto v
16740 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
16750 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
16760 45 5f 4f 4b 3a 20 7b 0a 20 20 20 20 20 20 69 6e  E_OK: {.      in
16770 74 20 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  t flags = sqlite
16780 33 42 74 72 65 65 46 6c 61 67 73 28 70 43 75 72  3BtreeFlags(pCur
16790 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->pCursor);.    
167a0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
167b0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 74 68 65 20  king.  Only the 
167c0 6c 6f 77 65 72 20 66 6f 75 72 20 62 69 74 73 20  lower four bits 
167d0 6f 66 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  of the flags byt
167e0 65 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 2a  e should.      *
167f0 2a 20 62 65 20 75 73 65 64 2e 20 20 42 69 74 20  * be used.  Bit 
16800 33 20 28 6d 61 73 6b 20 30 78 30 38 29 20 69 73  3 (mask 0x08) is
16810 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65 2e 20   unpredictable. 
16820 20 54 68 65 20 6c 6f 77 65 72 20 33 20 62 69 74   The lower 3 bit
16830 73 0a 20 20 20 20 20 20 2a 2a 20 28 6d 61 73 6b  s.      ** (mask
16840 20 30 78 30 37 29 20 73 68 6f 75 6c 64 20 62 65   0x07) should be
16850 20 65 69 74 68 65 72 20 35 20 28 69 6e 74 6b 65   either 5 (intke
16860 79 2b 6c 65 61 66 64 61 74 61 20 66 6f 72 20 74  y+leafdata for t
16870 61 62 6c 65 73 29 20 6f 72 0a 20 20 20 20 20 20  ables) or.      
16880 2a 2a 20 32 20 28 7a 65 72 6f 64 61 74 61 20 66  ** 2 (zerodata f
16890 6f 72 20 69 6e 64 69 63 65 73 29 2e 20 20 49 66  or indices).  If
168a0 20 74 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   these condition
168b0 73 20 61 72 65 20 6e 6f 74 20 6d 65 74 20 69 74  s are not met it
168c0 20 63 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 6e   can.      ** on
168d0 6c 79 20 6d 65 61 6e 20 74 68 61 74 20 77 65 20  ly mean that we 
168e0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
168f0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
16900 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
16910 2f 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  /.      if( (fla
16920 67 73 20 26 20 30 78 66 30 29 21 3d 30 20 7c 7c  gs & 0xf0)!=0 ||
16930 20 28 28 66 6c 61 67 73 20 26 20 30 78 30 37 29   ((flags & 0x07)
16940 21 3d 35 20 26 26 20 28 66 6c 61 67 73 20 26 20  !=5 && (flags & 
16950 30 78 30 37 29 21 3d 32 29 20 29 7b 0a 20 20 20  0x07)!=2) ){.   
16960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
16970 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16980 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
16990 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
169a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
169b0 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 28 66  ur->isTable = (f
169c0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 49 4e 54  lags & BTREE_INT
169d0 4b 45 59 29 21 3d 30 20 3f 31 3a 30 3b 0a 20 20  KEY)!=0 ?1:0;.  
169e0 20 20 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65      pCur->isInde
169f0 78 20 3d 20 28 66 6c 61 67 73 20 26 20 42 54 52  x = (flags & BTR
16a00 45 45 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 20  EE_ZERODATA)!=0 
16a10 3f 31 3a 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49  ?1:0;.      /* I
16a20 66 20 50 34 3d 3d 30 20 69 74 20 6d 65 61 6e 73  f P4==0 it means
16a30 20 77 65 20 61 72 65 20 65 78 70 65 63 74 65 64   we are expected
16a40 20 74 6f 20 6f 70 65 6e 20 61 20 74 61 62 6c 65   to open a table
16a50 2e 20 20 49 66 20 50 34 21 3d 30 20 74 68 65 6e  .  If P4!=0 then
16a60 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 65 78 70  .      ** we exp
16a70 65 63 74 20 74 6f 20 62 65 20 6f 70 65 6e 69 6e  ect to be openin
16a80 67 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20  g an index.  If 
16a90 74 68 69 73 20 69 73 20 6e 6f 74 20 77 68 61 74  this is not what
16aa0 20 68 61 70 70 65 6e 65 64 2c 0a 20 20 20 20 20   happened,.     
16ab0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 61 74   ** then the dat
16ac0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
16ad0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16ae0 69 66 28 20 28 70 43 75 72 2d 3e 69 73 54 61 62  if( (pCur->isTab
16af0 6c 65 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70  le && pOp->p4typ
16b00 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 29 0a 20  e==P4_KEYINFO). 
16b10 20 20 20 20 20 20 7c 7c 20 28 70 43 75 72 2d 3e        || (pCur->
16b20 69 73 49 6e 64 65 78 20 26 26 20 70 4f 70 2d 3e  isIndex && pOp->
16b30 70 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49 4e  p4type!=P4_KEYIN
16b40 46 4f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  FO) ){.        r
16b50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
16b60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
16b70 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
16b80 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
16b90 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
16ba0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
16bb0 4c 49 54 45 5f 45 4d 50 54 59 3a 20 7b 0a 20 20  LITE_EMPTY: {.  
16bc0 20 20 20 20 70 43 75 72 2d 3e 69 73 54 61 62 6c      pCur->isTabl
16bd0 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79 70 65 21  e = pOp->p4type!
16be0 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20  =P4_KEYINFO;.   
16bf0 20 20 20 70 43 75 72 2d 3e 69 73 49 6e 64 65 78     pCur->isIndex
16c00 20 3d 20 21 70 43 75 72 2d 3e 69 73 54 61 62 6c   = !pCur->isTabl
16c10 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  e;.      pCur->p
16c20 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
16c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16c40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16c50 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
16c60 3a 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61  : {.      goto a
16c70 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
16c80 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  r;.    }.  }.  b
16c90 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
16ca0 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  de: OpenEphemera
16cb0 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  l P1 P2 * P4 *.*
16cc0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
16cd0 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 74  cursor P1 to a t
16ce0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a  ransient table..
16cf0 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  ** The cursor is
16d00 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72   always opened r
16d10 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69  ead/write even i
16d20 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  f .** the main d
16d30 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
16d40 6f 6e 6c 79 2e 20 20 54 68 65 20 74 72 61 6e 73  only.  The trans
16d50 69 65 6e 74 20 6f 72 20 76 69 72 74 75 61 6c 0a  ient or virtual.
16d60 2a 2a 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65  ** table is dele
16d70 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
16d80 79 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  y when the curso
16d90 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  r is closed..**.
16da0 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d  ** P2 is the num
16db0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
16dc0 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
16dd0 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73  ble..** The curs
16de0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42  or points to a B
16df0 54 72 65 65 20 74 61 62 6c 65 20 69 66 20 50 34  Tree table if P4
16e00 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72  ==0 and to a BTr
16e10 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50  ee index.** if P
16e20 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20  4 is not 0.  If 
16e30 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  P4 is not NULL, 
16e40 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  it points to a K
16e50 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
16e60 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73  .** that defines
16e70 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b   the format of k
16e80 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  eys in the index
16e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
16ea0 6f 64 65 20 77 61 73 20 6f 6e 63 65 20 63 61 6c  ode was once cal
16eb0 6c 65 64 20 4f 70 65 6e 54 65 6d 70 2e 20 20 42  led OpenTemp.  B
16ec0 75 74 20 74 68 61 74 20 63 72 65 61 74 65 64 0a  ut that created.
16ed0 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 62 65 63  ** confusion bec
16ee0 61 75 73 65 20 74 68 65 20 74 65 72 6d 20 22 74  ause the term "t
16ef0 65 6d 70 20 74 61 62 6c 65 22 2c 20 6d 69 67 68  emp table", migh
16f00 74 20 72 65 66 65 72 20 65 69 74 68 65 72 0a 2a  t refer either.*
16f10 2a 20 74 6f 20 61 20 54 45 4d 50 20 74 61 62 6c  * to a TEMP tabl
16f20 65 20 61 74 20 74 68 65 20 53 51 4c 20 6c 65 76  e at the SQL lev
16f30 65 6c 2c 20 6f 72 20 74 6f 20 61 20 74 61 62 6c  el, or to a tabl
16f40 65 20 6f 70 65 6e 65 64 20 62 79 0a 2a 2a 20 74  e opened by.** t
16f50 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  his opcode.  The
16f60 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 61  n this opcode wa
16f70 73 20 63 61 6c 6c 20 4f 70 65 6e 56 69 72 74 75  s call OpenVirtu
16f80 61 6c 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74  al.  But.** that
16f90 20 63 72 65 61 74 65 64 20 63 6f 6e 66 75 73 69   created confusi
16fa0 6f 6e 20 77 69 74 68 20 74 68 65 20 77 68 6f 6c  on with the whol
16fb0 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
16fc0 69 64 65 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  idea..*/.case OP
16fd0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20  _OpenEphemeral: 
16fe0 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  {.  int i = pOp-
16ff0 3e 70 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  >p1;.  VdbeCurso
17000 72 20 2a 70 43 78 3b 0a 20 20 73 74 61 74 69 63  r *pCx;.  static
17010 20 63 6f 6e 73 74 20 69 6e 74 20 6f 70 65 6e 46   const int openF
17020 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51  lags = .      SQ
17030 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17040 49 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49  ITE |.      SQLI
17050 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
17060 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
17070 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
17080 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17090 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
170a0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  .      SQLITE_OP
170b0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b  EN_TRANSIENT_DB;
170c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
170d0 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f   );.  pCx = allo
170e0 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 69 2c  cateCursor(p, i,
170f0 20 70 4f 70 2c 20 2d 31 2c 20 31 29 3b 0a 20 20   pOp, -1, 1);.  
17100 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74  if( pCx==0 ) got
17110 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d  o no_mem;.  pCx-
17120 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
17130 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
17140 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
17150 31 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  1, SQLITE_DEFAUL
17160 54 5f 54 45 4d 50 5f 43 41 43 48 45 5f 53 49 5a  T_TEMP_CACHE_SIZ
17170 45 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  E, openFlags,.  
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 20 20 20 20 20 20 20 20 20 26 70 43 78 2d 3e 70           &pCx->p
171a0 42 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Bt);.  if( rc==S
171b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
171c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
171d0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43 78 2d  eBeginTrans(pCx-
171e0 3e 70 42 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  >pBt, 1);.  }.  
171f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17200 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  K ){.    /* If a
17210 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
17220 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 63 72   is required, cr
17230 65 61 74 65 20 69 74 20 62 79 20 63 61 6c 6c 69  eate it by calli
17240 6e 67 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ng.    ** sqlite
17250 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
17260 65 28 29 20 77 69 74 68 20 74 68 65 20 42 54 52  e() with the BTR
17270 45 45 5f 5a 45 52 4f 44 41 54 41 20 66 6c 61 67  EE_ZERODATA flag
17280 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f   before.    ** o
17290 70 65 6e 69 6e 67 20 69 74 2e 20 49 66 20 61 20  pening it. If a 
172a0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
172b0 69 73 20 72 65 71 75 69 72 65 64 2c 20 6a 75 73  is required, jus
172c0 74 20 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a  t use the.    **
172d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
172e0 72 65 61 74 65 64 20 74 61 62 6c 65 20 77 69 74  reated table wit
172f0 68 20 72 6f 6f 74 2d 70 61 67 65 20 31 20 28 61  h root-page 1 (a
17300 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e  n INTKEY table).
17310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17320 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
17330 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
17340 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  no;.      assert
17350 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
17360 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20  4_KEYINFO );.   
17370 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17380 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
17390 70 43 78 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c  pCx->pBt, &pgno,
173a0 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 29   BTREE_ZERODATA)
173b0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ; .      if( rc=
173c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
173d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 67        assert( pg
173e0 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 2b  no==MASTER_ROOT+
173f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  1 );.        rc 
17400 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
17410 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 2c 20 70  rsor(pCx->pBt, p
17420 67 6e 6f 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  gno, 1, .       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 20 20 20 20 20 28 4b 65 79 49 6e 66           (KeyInf
17450 6f 2a 29 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 43  o*)pOp->p4.z, pC
17460 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  x->pCursor);.   
17470 20 20 20 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e       pCx->pKeyIn
17480 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
17490 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  yInfo;.        p
174a0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  Cx->pKeyInfo->en
174b0 63 20 3d 20 45 4e 43 28 70 2d 3e 64 62 29 3b 0a  c = ENC(p->db);.
174c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
174d0 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a  x->isTable = 0;.
174e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
174f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
17500 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42  eeCursor(pCx->pB
17510 74 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  t, MASTER_ROOT, 
17520 31 2c 20 30 2c 20 70 43 78 2d 3e 70 43 75 72 73  1, 0, pCx->pCurs
17530 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e  or);.      pCx->
17540 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  isTable = 1;.   
17550 20 7d 0a 20 20 7d 0a 20 20 70 43 78 2d 3e 69 73   }.  }.  pCx->is
17560 49 6e 64 65 78 20 3d 20 21 70 43 78 2d 3e 69 73  Index = !pCx->is
17570 54 61 62 6c 65 3b 0a 20 20 62 72 65 61 6b 3b 0a  Table;.  break;.
17580 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  }../* Opcode: Op
17590 65 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20 2a  enPseudo P1 P2 *
175a0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20   * *.**.** Open 
175b0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61  a new cursor tha
175c0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61  t points to a fa
175d0 6b 65 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  ke table that co
175e0 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a  ntains a single.
175f0 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20  ** row of data. 
17600 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
17610 77 72 69 74 65 20 61 20 73 65 63 6f 6e 64 20 72  write a second r
17620 6f 77 20 6f 66 20 64 61 74 61 20 63 61 75 73 65  ow of data cause
17630 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 72  s the.** first r
17640 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ow to be deleted
17650 2e 20 20 41 6c 6c 20 64 61 74 61 20 69 73 20 64  .  All data is d
17660 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
17670 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6c 6f  cursor is.** clo
17680 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65  sed..**.** A pse
17690 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65  udo-table create
176a0 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65  d by this opcode
176b0 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 68   is useful for h
176c0 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 4e 45  olding the.** NE
176d0 57 20 6f 72 20 4f 4c 44 20 74 61 62 6c 65 73 20  W or OLD tables 
176e0 69 6e 20 61 20 74 72 69 67 67 65 72 2e 20 20 41  in a trigger.  A
176f0 6c 73 6f 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  lso used to hold
17700 20 74 68 65 20 61 20 73 69 6e 67 6c 65 0a 2a 2a   the a single.**
17710 20 72 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d   row output from
17720 20 74 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74   the sorter so t
17730 68 61 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20  hat the row can 
17740 62 65 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e  be decomposed in
17750 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  to.** individual
17760 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74   columns using t
17770 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63  he OP_Column opc
17780 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ode..**.** When 
17790 4f 50 5f 49 6e 73 65 72 74 20 69 73 20 65 78 65  OP_Insert is exe
177a0 63 75 74 65 64 20 74 6f 20 69 6e 73 65 72 74 20  cuted to insert 
177b0 61 20 72 6f 77 20 69 6e 20 74 6f 20 74 68 65 20  a row in to the 
177c0 70 73 65 75 64 6f 20 74 61 62 6c 65 2c 0a 2a 2a  pseudo table,.**
177d0 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
177e0 65 20 63 75 72 73 6f 72 20 6d 61 79 20 6f 72 20  e cursor may or 
177f0 6d 61 79 20 6e 6f 74 20 6d 61 6b 65 20 69 74 27  may not make it'
17800 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
17810 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 72 6f  e.** original ro
17820 77 20 64 61 74 61 2e 20 49 66 20 50 32 20 69 73  w data. If P2 is
17830 20 30 2c 20 74 68 65 6e 20 74 68 65 20 70 73 65   0, then the pse
17840 75 64 6f 2d 74 61 62 6c 65 20 77 69 6c 6c 20 63  udo-table will c
17850 6f 70 79 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  opy the.** origi
17860 6e 61 6c 20 72 6f 77 20 64 61 74 61 2e 20 4f 74  nal row data. Ot
17870 68 65 72 77 69 73 65 2c 20 61 20 70 6f 69 6e 74  herwise, a point
17880 65 72 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  er to the origin
17890 61 6c 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 2a  al memory cell.*
178a0 2a 20 69 73 20 73 74 6f 72 65 64 2e 20 49 6e 20  * is stored. In 
178b0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 76  this case, the v
178c0 64 62 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74  dbe program must
178d0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
178e0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   .** memory cell
178f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17900 72 6f 77 20 64 61 74 61 20 69 73 20 6e 6f 74 20  row data is not 
17910 6f 76 65 72 77 72 69 74 74 65 6e 20 75 6e 74 69  overwritten unti
17920 6c 20 74 68 65 0a 2a 2a 20 70 73 65 75 64 6f 20  l the.** pseudo 
17930 74 61 62 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  table is closed 
17940 28 6f 72 20 61 20 6e 65 77 20 72 6f 77 20 69 73  (or a new row is
17950 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69   inserted into i
17960 74 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  t)..*/.case OP_O
17970 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 69  penPseudo: {.  i
17980 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
17990 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
179a0 78 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  x;.  assert( i>=
179b0 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
179c0 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 69  ocateCursor(p, i
179d0 2c 20 26 70 4f 70 5b 2d 31 5d 2c 20 2d 31 2c 20  , &pOp[-1], -1, 
179e0 30 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  0);.  if( pCx==0
179f0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
17a00 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d    pCx->nullRow =
17a10 20 31 3b 0a 20 20 70 43 78 2d 3e 70 73 65 75 64   1;.  pCx->pseud
17a20 6f 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 70 43  oTable = 1;.  pC
17a30 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61  x->ephemPseudoTa
17a40 62 6c 65 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70  ble = (u8)pOp->p
17a50 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62 6c  2;.  pCx->isTabl
17a60 65 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73  e = 1;.  pCx->is
17a70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 62 72 65  Index = 0;.  bre
17a80 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
17a90 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a  : Close P1 * * *
17aa0 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61   *.**.** Close a
17ab0 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73   cursor previous
17ac0 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e  ly opened as P1.
17ad0 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a    If P1 is not.*
17ae0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  * currently open
17af0 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  , this instructi
17b00 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
17b10 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a  /.case OP_Close:
17b20 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70   {.  int i = pOp
17b30 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
17b40 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75  i>=0 && i<p->nCu
17b50 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74 65  rsor );.  sqlite
17b60 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
17b70 70 2c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b  p, p->apCsr[i]);
17b80 0a 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d  .  p->apCsr[i] =
17b90 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
17ba0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47  /* Opcode: SeekG
17bb0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  e P1 P2 P3 P4 *.
17bc0 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20  **.** If cursor 
17bd0 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20  P1 refers to an 
17be0 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65  SQL table (B-Tre
17bf0 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65  e that uses inte
17c00 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75  ger keys), .** u
17c10 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  se the value in 
17c20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20 74  register P3 as t
17c30 68 65 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73  he key.  If curs
17c40 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
17c50 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
17c60 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
17c70 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
17c80 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
17c90 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
17ca0 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
17cb0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
17cc0 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
17cd0 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
17ce0 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
17cf0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e   the smallest en
17d00 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
17d10 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
17d20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
17d30 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
17d40 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
17d50 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
17d60 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
17d70 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
17d80 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
17d90 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
17da0 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
17db0 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73 74 69   NotFound, Disti
17dc0 6e 63 74 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65  nct, SeekLt, See
17dd0 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGt, SeekLe.*/./
17de0 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 74  * Opcode: SeekGt
17df0 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
17e00 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
17e10 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
17e20 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
17e30 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
17e40 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
17e50 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
17e60 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
17e70 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
17e80 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
17e90 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
17ea0 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
17eb0 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
17ec0 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
17ed0 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
17ee0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
17ef0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
17f00 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
17f10 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
17f20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
17f30 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
17f40 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
17f50 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
17f60 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
17f70 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
17f80 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
17f90 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
17fa0 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
17fb0 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
17fc0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
17fd0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44  und, NotFound, D
17fe0 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 4c 74 2c  istinct, SeekLt,
17ff0 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a   SeekGe, SeekLe.
18000 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
18010 65 6b 4c 74 20 50 31 20 50 32 20 50 33 20 50 34  ekLt P1 P2 P3 P4
18020 20 2a 20 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72   * .**.** If cur
18030 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f  sor P1 refers to
18040 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42   an SQL table (B
18050 2d 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20  -Tree that uses 
18060 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a  integer keys), .
18070 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  ** use the value
18080 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
18090 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72  as a key. If cur
180a0 73 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a  sor P1 refers .*
180b0 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  * to an SQL inde
180c0 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68  x, then P3 is th
180d0 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
180e0 72 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74  ray of P4 regist
180f0 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65  ers .** that are
18100 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61   used as an unpa
18110 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20  cked index key. 
18120 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f  .**.** Repositio
18130 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  n cursor P1 so t
18140 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74  hat  it points t
18150 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
18160 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20  try that .** is 
18170 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
18180 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
18190 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
181a0 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74   less than .** t
181b0 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73  he key and P2 is
181c0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
181d0 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a  jump to P2..**.*
181e0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
181f0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 44 69 73  d, NotFound, Dis
18200 74 69 6e 63 74 2c 20 53 65 65 6b 47 74 2c 20 53  tinct, SeekGt, S
18210 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGe, SeekLe.*/
18220 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
18230 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  Le P1 P2 P3 P4 *
18240 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
18250 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
18260 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
18270 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
18280 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
18290 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
182a0 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
182b0 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
182c0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
182d0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
182e0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
182f0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
18300 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
18310 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
18320 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
18330 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
18340 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
18350 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
18360 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
18370 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
18380 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73  that .** is less
18390 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
183a0 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e  o the key value.
183b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
183c0 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73   records .** les
183d0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
183e0 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  to the key and P
183f0 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
18400 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
18410 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
18420 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
18430 20 44 69 73 74 69 6e 63 74 2c 20 53 65 65 6b 47   Distinct, SeekG
18440 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
18450 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
18460 6b 4c 74 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLt:         /* 
18470 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
18480 65 20 4f 50 5f 53 65 65 6b 4c 65 3a 20 20 20 20  e OP_SeekLe:    
18490 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
184a0 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
184b0 6b 47 65 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGe:         /* 
184c0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
184d0 65 20 4f 50 5f 53 65 65 6b 47 74 3a 20 7b 20 20  e OP_SeekGt: {  
184e0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
184f0 33 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  3 */.  int i = p
18500 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43 75  Op->p1;.  VdbeCu
18510 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73  rsor *pC;..  ass
18520 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
18530 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
18540 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21 3d  ssert( pOp->p2!=
18550 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  0 );.  pC = p->a
18560 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72  pCsr[i];.  asser
18570 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69 66  t( pC!=0 );.  if
18580 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30  ( pC->pCursor!=0
18590 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
185a0 20 6f 63 3b 0a 20 20 20 20 6f 63 20 3d 20 70 4f   oc;.    oc = pO
185b0 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
185c0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
185d0 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61      if( pC->isTa
185e0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ble ){.      i64
185f0 20 69 4b 65 79 3b 20 20 20 20 20 20 2f 2a 20 54   iKey;      /* T
18600 68 65 20 72 6f 77 69 64 20 77 65 20 61 72 65 20  he rowid we are 
18610 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 0a 20  to seek to */.. 
18620 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
18630 74 20 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69  t value in P3 mi
18640 67 68 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79  ght be of any ty
18650 70 65 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61  pe: integer, rea
18660 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 20  l, string,.     
18670 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c   ** blob, or NUL
18680 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64 73  L.  But it needs
18690 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
186a0 72 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e 20  r before we can 
186b0 64 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  do.      ** the 
186c0 73 65 65 6b 2c 20 73 6f 20 63 6f 76 65 72 74 20  seek, so covert 
186d0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 70  it. */.      app
186e0 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
186f0 79 28 70 49 6e 33 29 3b 0a 20 20 20 20 20 20 69  y(pIn3);.      i
18700 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
18710 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33 29 3b  eIntValue(pIn3);
18720 0a 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64  .      pC->rowid
18730 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20  IsValid = 0;..  
18740 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33      /* If the P3
18750 20 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74   value could not
18760 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
18770 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69  to an integer wi
18780 74 68 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 6c  thout.      ** l
18790 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69  oss of informati
187a0 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69 61 6c  on, then special
187b0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 72   processing is r
187c0 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20  equired... */.  
187d0 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66      if( (pIn3->f
187e0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d  lags & MEM_Int)=
187f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
18800 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
18810 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b   MEM_Real)==0 ){
18820 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
18830 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 63 61   the P3 value ca
18840 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65  nnot be converte
18850 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20  d into any kind 
18860 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20  of a number,.   
18870 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
18880 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74 20 70  he seek is not p
18890 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70  ossible, so jump
188a0 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 20 20   to P2 */.      
188b0 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32      pc = pOp->p2
188c0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
188d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
188e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77  .        /* If w
188f0 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
18900 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 50 33 20  nt, then the P3 
18910 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
18920 66 6c 6f 61 74 69 6e 67 0a 20 20 20 20 20 20 20  floating.       
18930 20 2a 2a 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72   ** point number
18940 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
18950 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
18960 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  s & MEM_Real)!=0
18970 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
18980 20 69 4b 65 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f   iKey==SMALLEST_
18990 49 4e 54 36 34 20 26 26 20 28 70 49 6e 33 2d 3e  INT64 && (pIn3->
189a0 72 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 7c  r<(double)iKey |
189b0 7c 20 70 49 6e 33 2d 3e 72 3e 30 29 20 29 7b 0a  | pIn3->r>0) ){.
189c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
189d0 20 50 33 20 76 61 6c 75 65 20 69 73 20 74 6f 20   P3 value is to 
189e0 6c 61 72 67 65 20 69 6e 20 6d 61 67 6e 69 74 75  large in magnitu
189f0 64 65 20 74 6f 20 62 65 20 65 78 70 72 65 73 73  de to be express
18a00 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20 20 20  ed as an.       
18a10 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a     ** integer. *
18a20 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  /.          res 
18a30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
18a40 66 28 20 70 49 6e 33 2d 3e 72 3c 30 20 29 7b 0a  f( pIn3->r<0 ){.
18a50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18a60 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 7c 7c  oc==OP_SeekGt ||
18a70 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29   oc==OP_SeekGe )
18a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
18a90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18aa0 65 46 69 72 73 74 28 70 43 2d 3e 70 43 75 72 73  eFirst(pC->pCurs
18ab0 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
18ac0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
18ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
18ae0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
18af0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
18b00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
18b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
18b20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
18b30 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Lt || oc==OP_See
18b40 6b 4c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kLe ){.         
18b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18b60 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 70  3BtreeLast(pC->p
18b70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
18b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ba0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
18bb0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
18bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
18be0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
18bf0 20 20 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70       pc = pOp->p
18c00 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  2 - 1;.         
18c10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
18c20 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
18c30 65 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65  e if( oc==OP_See
18c40 6b 4c 74 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65  kLt || oc==OP_Se
18c50 65 6b 47 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ekGe ){.        
18c60 20 20 2f 2a 20 55 73 65 20 74 68 65 20 63 65 69    /* Use the cei
18c70 6c 69 6e 67 28 29 20 66 75 6e 63 74 69 6f 6e 20  ling() function 
18c80 74 6f 20 63 6f 6e 76 65 72 74 20 72 65 61 6c 2d  to convert real-
18c90 3e 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  >int */.        
18ca0 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3e 20    if( pIn3->r > 
18cb0 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69  (double)iKey ) i
18cc0 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Key++;.        }
18cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18ce0 2f 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 6f 72  /* Use the floor
18cf0 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
18d00 6f 6e 76 65 72 74 20 72 65 61 6c 2d 3e 69 6e 74  onvert real->int
18d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
18d20 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65  sert( oc==OP_See
18d30 6b 4c 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65  kLe || oc==OP_Se
18d40 65 6b 47 74 20 29 3b 0a 20 20 20 20 20 20 20 20  ekGt );.        
18d50 20 20 69 66 28 20 70 49 6e 33 2d 3e 72 20 3c 20    if( pIn3->r < 
18d60 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 20 69  (double)iKey ) i
18d70 4b 65 79 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d  Key--;.        }
18d80 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20  .      } .      
18d90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18da0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
18db0 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
18dc0 28 75 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72  (u64)iKey, 0, &r
18dd0 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
18de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18df0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
18e00 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
18e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18e20 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
18e30 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73       pC->rowidIs
18e40 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
18e50 20 20 20 70 43 2d 3e 6c 61 73 74 52 6f 77 69 64     pC->lastRowid
18e60 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = iKey;.      }
18e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18e80 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
18e90 20 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   r;.      int nF
18ea0 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
18eb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18ec0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
18ed0 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 20 20 61  INT32 );.      a
18ee0 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20  ssert( nField>0 
18ef0 29 3b 0a 20 20 20 20 20 20 72 2e 70 4b 65 79 49  );.      r.pKeyI
18f00 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
18f10 66 6f 3b 0a 20 20 20 20 20 20 72 2e 6e 46 69 65  fo;.      r.nFie
18f20 6c 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64  ld = (u16)nField
18f30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 63 3d 3d  ;.      if( oc==
18f40 4f 50 5f 53 65 65 6b 47 74 20 7c 7c 20 6f 63 3d  OP_SeekGt || oc=
18f50 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 7b 0a 20 20  =OP_SeekLe ){.  
18f60 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20        r.flags = 
18f70 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
18f80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18f90 20 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d         r.flags =
18fa0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18fb0 20 20 72 2e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61    r.aMem = &p->a
18fc0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
18fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18fe0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
18ff0 6b 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ked(pC->pCursor,
19000 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29   &r, 0, 0, &res)
19010 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19030 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
19040 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
19050 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 2d 3e      }.      pC->
19060 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
19070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e  ;.    }.    pC->
19080 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
19090 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68   0;.    pC->cach
190a0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
190b0 53 54 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51  STALE;.#ifdef SQ
190c0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
190d0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
190e0 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
190f0 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b   if( oc==OP_Seek
19100 47 65 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65  Ge || oc==OP_See
19110 6b 47 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  kGt ){.      if(
19120 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d   res<0 || (res==
19130 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
19140 47 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Gt) ){.        r
19150 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19160 4e 65 78 74 28 70 43 2d 3e 70 43 75 72 73 6f 72  Next(pC->pCursor
19170 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  , &res);.       
19180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19190 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
191a0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
191b0 20 20 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49        pC->rowidI
191c0 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  sValid = 0;.    
191d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
191e0 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
191f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
19200 20 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f     assert( oc==O
19210 50 5f 53 65 65 6b 4c 74 20 7c 7c 20 6f 63 3d 3d  P_SeekLt || oc==
19220 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20  OP_SeekLe );.   
19230 20 20 20 69 66 28 20 72 65 73 3e 30 20 7c 7c 20     if( res>0 || 
19240 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f  (res==0 && oc==O
19250 50 5f 53 65 65 6b 4c 74 29 20 29 7b 0a 20 20 20  P_SeekLt) ){.   
19260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19270 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
19280 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  C->pCursor, &res
19290 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
192a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
192b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
192c0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
192d0 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64  pC->rowidIsValid
192e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
192f0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 72 65  e{.        /* re
19300 73 20 6d 69 67 68 74 20 62 65 20 6e 65 67 61 74  s might be negat
19310 69 76 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ive because the 
19320 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20  table is empty. 
19330 20 43 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   Check to.      
19340 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 69 73    ** see if this
19350 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
19360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
19370 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74   res = sqlite3Bt
19380 72 65 65 45 6f 66 28 70 43 2d 3e 70 43 75 72 73  reeEof(pC->pCurs
19390 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
193a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
193b0 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
193c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
193d0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
193e0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
193f0 20 69 66 28 20 21 70 43 2d 3e 70 73 65 75 64 6f   if( !pC->pseudo
19400 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
19410 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
19420 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
19430 6f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 33  open the sqlite3
19440 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20  _master table.  
19450 20 20 2a 2a 20 66 6f 72 20 72 65 61 64 20 61 63    ** for read ac
19460 63 65 73 73 20 72 65 74 75 72 6e 73 20 53 51 4c  cess returns SQL
19470 49 54 45 5f 45 4d 50 54 59 2e 20 49 6e 20 74 68  ITE_EMPTY. In th
19480 69 73 20 63 61 73 65 20 61 6c 77 61 79 73 0a 20  is case always. 
19490 20 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a     ** take the j
194a0 75 6d 70 20 28 73 69 6e 63 65 20 74 68 65 72 65  ump (since there
194b0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
194c0 69 6e 20 74 68 65 20 74 61 62 6c 65 29 2e 0a 20  in the table).. 
194d0 20 20 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 70     */.    pc = p
194e0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
194f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
19500 70 63 6f 64 65 3a 20 53 65 65 6b 20 50 31 20 50  pcode: Seek P1 P
19510 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 31  2 * * *.**.** P1
19520 20 69 73 20 61 6e 20 6f 70 65 6e 20 74 61 62 6c   is an open tabl
19530 65 20 63 75 72 73 6f 72 20 61 6e 64 20 50 32 20  e cursor and P2 
19540 69 73 20 61 20 72 6f 77 69 64 20 69 6e 74 65 67  is a rowid integ
19550 65 72 2e 20 20 41 72 72 61 6e 67 65 0a 2a 2a 20  er.  Arrange.** 
19560 66 6f 72 20 50 31 20 74 6f 20 6d 6f 76 65 20 73  for P1 to move s
19570 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
19580 20 74 6f 20 74 68 65 20 72 6f 77 69 64 20 67 69   to the rowid gi
19590 76 65 6e 20 62 79 20 50 32 2e 0a 2a 2a 0a 2a 2a  ven by P2..**.**
195a0 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
195b0 79 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65  y a deferred see
195c0 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75  k.  Nothing actu
195d0 61 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74  ally happens unt
195e0 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  il.** the cursor
195f0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
19600 20 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74   a record.  That
19610 20 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64   way, if no read
19620 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75  s.** occur, no u
19630 6e 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68  nnecessary I/O h
19640 61 70 70 65 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20  appens..*/.case 
19650 4f 50 5f 53 65 65 6b 3a 20 7b 20 20 20 20 2f 2a  OP_Seek: {    /*
19660 20 69 6e 32 20 2a 2f 0a 20 20 69 6e 74 20 69 20   in2 */.  int i 
19670 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62  = pOp->p1;.  Vdb
19680 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20  eCursor *pC;..  
19690 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
196a0 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  i<p->nCursor );.
196b0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
196c0 69 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  i];.  assert( pC
196d0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 2d  !=0 );.  if( pC-
196e0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20  >pCursor!=0 ){. 
196f0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
19700 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 43  sTable );.    pC
19710 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
19720 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
19730 67 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  get = sqlite3Vdb
19740 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
19750 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64 49 73  .    pC->rowidIs
19760 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
19770 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
19780 6f 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65  o = 1;.  }.  bre
19790 61 6b 3b 0a 7d 0a 20 20 0a 0a 2f 2a 20 4f 70 63  ak;.}.  ../* Opc
197a0 6f 64 65 3a 20 46 6f 75 6e 64 20 50 31 20 50 32  ode: Found P1 P2
197b0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   P3 * *.**.** Re
197c0 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20  gister P3 holds 
197d0 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74  a blob construct
197e0 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64  ed by MakeRecord
197f0 2e 20 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65  .  P1 is an inde
19800 78 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 6e 74 72  x..** If an entr
19810 79 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  y that matches t
19820 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
19830 73 74 65 72 20 70 33 20 65 78 69 73 74 73 20 69  ster p3 exists i
19840 6e 20 50 31 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  n P1 then.** jum
19850 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  p to P2.  If the
19860 20 50 33 20 76 61 6c 75 65 20 64 6f 65 73 20 6e   P3 value does n
19870 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 65 6e 74  ot match any ent
19880 72 79 20 69 6e 20 50 31 0a 2a 2a 20 74 68 65 6e  ry in P1.** then
19890 20 66 61 6c 6c 20 74 68 72 75 2e 20 20 54 68 65   fall thru.  The
198a0 20 50 31 20 63 75 72 73 6f 72 20 69 73 20 6c 65   P1 cursor is le
198b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
198c0 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
198d0 79 0a 2a 2a 20 69 66 20 69 74 20 65 78 69 73 74  y.** if it exist
198e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
198f0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 75 73 65  struction is use
19900 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
19910 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77  he IN operator w
19920 68 65 72 65 20 74 68 65 0a 2a 2a 20 6c 65 66 74  here the.** left
19930 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
19940 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19950 2e 20 20 50 31 20 6d 61 79 20 62 65 20 61 20 74  .  P1 may be a t
19960 72 75 65 20 69 6e 64 65 78 2c 20 6f 72 20 69 74  rue index, or it
19970 0a 2a 2a 20 6d 61 79 20 62 65 20 61 20 74 65 6d  .** may be a tem
19980 70 6f 72 61 72 79 20 69 6e 64 65 78 20 74 68 61  porary index tha
19990 74 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  t holds the resu
199a0 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
199b0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  T.** statement. 
199c0 20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69    This instructi
199d0 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  on is also used 
199e0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
199f0 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 6b 65 79  .** DISTINCT key
19a00 77 6f 72 64 20 69 6e 20 53 45 4c 45 43 54 20 73  word in SELECT s
19a10 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
19a20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
19a30 6e 20 63 68 65 63 6b 73 20 69 66 20 69 6e 64 65  n checks if inde
19a40 78 20 50 31 20 63 6f 6e 74 61 69 6e 73 20 61 20  x P1 contains a 
19a50 72 65 63 6f 72 64 20 66 6f 72 20 77 68 69 63 68  record for which
19a60 20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 4e   .** the first N
19a70 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
19a80 65 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  es exactly match
19a90 20 74 68 65 20 4e 20 73 65 72 69 61 6c 69 7a 65   the N serialize
19aa0 64 20 76 61 6c 75 65 73 0a 2a 2a 20 69 6e 20 74  d values.** in t
19ab0 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67  he record in reg
19ac0 69 73 74 65 72 20 50 33 2c 20 77 68 65 72 65 20  ister P3, where 
19ad0 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
19ae0 75 6d 62 65 72 20 6f 66 20 76 61 6c 75 65 73 20  umber of values 
19af0 69 6e 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 63  in.** the P3 rec
19b00 6f 72 64 20 28 74 68 65 20 50 33 20 72 65 63 6f  ord (the P3 reco
19b10 72 64 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  rd is a prefix o
19b20 66 20 74 68 65 20 50 31 20 72 65 63 6f 72 64 29  f the P1 record)
19b30 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
19b40 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 49 73 55  o: NotFound, IsU
19b50 6e 69 71 75 65 2c 20 4e 6f 74 45 78 69 73 74 73  nique, NotExists
19b60 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
19b70 6f 74 46 6f 75 6e 64 20 50 31 20 50 32 20 50 33  otFound P1 P2 P3
19b80 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73   * *.**.** Regis
19b90 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
19ba0 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
19bb0 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
19bc0 50 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65  P1 is.** an inde
19bd0 78 2e 20 20 49 66 20 6e 6f 20 65 6e 74 72 79 20  x.  If no entry 
19be0 65 78 69 73 74 73 20 69 6e 20 50 31 20 74 68 61  exists in P1 tha
19bf0 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 62 6c  t matches the bl
19c00 6f 62 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20  ob then jump.** 
19c10 74 6f 20 50 32 2e 20 20 49 66 20 61 6e 20 65 6e  to P2.  If an en
19c20 74 72 79 20 64 6f 65 73 20 65 78 69 73 74 69 6e  try does existin
19c30 67 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  g, fall through.
19c40 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
19c50 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
19c60 20 74 6f 20 74 68 65 20 65 6e 74 72 79 20 74 68   to the entry th
19c70 61 74 20 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a  at matches..**.*
19c80 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
19c90 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 49 73  d, NotExists, Is
19ca0 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73 65 20 4f  Unique.*/.case O
19cb0 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20 20 20  P_NotFound:     
19cc0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
19cd0 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e 64 3a  /.case OP_Found:
19ce0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
19cf0 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
19d00 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  i = pOp->p1;.  i
19d10 6e 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73  nt alreadyExists
19d20 20 3d 20 30 3b 0a 20 20 56 64 62 65 43 75 72 73   = 0;.  VdbeCurs
19d30 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74  or *pC;.  assert
19d40 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e  ( i>=0 && i<p->n
19d50 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
19d60 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 21  rt( p->apCsr[i]!
19d70 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 20  =0 );.  if( (pC 
19d80 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e  = p->apCsr[i])->
19d90 70 43 75 72 73 6f 72 21 3d 30 20 29 7b 0a 20 20  pCursor!=0 ){.  
19da0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 55    int res;.    U
19db0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
19dc0 49 64 78 4b 65 79 3b 0a 0a 20 20 20 20 61 73 73  IdxKey;..    ass
19dd0 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
19de0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
19df0 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  t( pIn3->flags &
19e00 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
19e10 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
19e20 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
19e30 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
19e40 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e   pIn3->n, pIn3->
19e50 7a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  z,.             
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 20 20 20 61 54 65 6d 70 52 65           aTempRe
19e80 63 2c 20 73 69 7a 65 6f 66 28 61 54 65 6d 70 52  c, sizeof(aTempR
19e90 65 63 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ec));.    if( pI
19ea0 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dxKey==0 ){.    
19eb0 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
19ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70     }.    if( pOp
19ed0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75  ->opcode==OP_Fou
19ee0 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  nd ){.      pIdx
19ef0 4b 65 79 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 4e  Key->flags |= UN
19f00 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
19f10 54 43 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  TCH;.    }.    r
19f20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
19f30 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
19f40 43 2d 3e 70 43 75 72 73 6f 72 2c 20 70 49 64 78  C->pCursor, pIdx
19f50 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29  Key, 0, 0, &res)
19f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19f70 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
19f80 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a  ecord(pIdxKey);.
19f90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19fa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62  TE_OK ){.      b
19fb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19fc0 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 3d 20  alreadyExists = 
19fd0 28 72 65 73 3d 3d 30 29 3b 0a 20 20 20 20 70 43  (res==0);.    pC
19fe0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
19ff0 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61   = 0;.    pC->ca
1a000 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
1a010 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69  E_STALE;.  }.  i
1a020 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
1a030 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  OP_Found ){.    
1a040 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74  if( alreadyExist
1a050 73 20 29 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32  s ) pc = pOp->p2
1a060 20 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 1;.  }else{. 
1a070 20 20 20 69 66 28 20 21 61 6c 72 65 61 64 79 45     if( !alreadyE
1a080 78 69 73 74 73 20 29 20 70 63 20 3d 20 70 4f 70  xists ) pc = pOp
1a090 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  ->p2 - 1;.  }.  
1a0a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1a0b0 6f 64 65 3a 20 49 73 55 6e 69 71 75 65 20 50 31  ode: IsUnique P1
1a0c0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a   P2 P3 P4 *.**.*
1a0d0 2a 20 54 68 65 20 50 33 20 72 65 67 69 73 74 65  * The P3 registe
1a0e0 72 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  r contains an in
1a0f0 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d  teger record num
1a100 62 65 72 2e 20 20 43 61 6c 6c 20 74 68 69 73 0a  ber.  Call this.
1a110 2a 2a 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  ** record number
1a120 20 52 2e 20 20 54 68 65 20 50 34 20 72 65 67 69   R.  The P4 regi
1a130 73 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ster contains an
1a140 20 69 6e 64 65 78 20 6b 65 79 20 63 72 65 61 74   index key creat
1a150 65 64 0a 2a 2a 20 75 73 69 6e 67 20 4d 61 6b 65  ed.** using Make
1a160 52 65 63 6f 72 64 2e 20 20 43 61 6c 6c 20 69 74  Record.  Call it
1a170 20 4b 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20   K..**.** P1 is 
1a180 61 6e 20 69 6e 64 65 78 2e 20 20 53 6f 20 69 74  an index.  So it
1a190 20 68 61 73 20 6e 6f 20 64 61 74 61 20 61 6e 64   has no data and
1a1a0 20 69 74 73 20 6b 65 79 20 63 6f 6e 73 69 73 74   its key consist
1a1b0 73 20 6f 66 20 61 0a 2a 2a 20 72 65 63 6f 72 64  s of a.** record
1a1c0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 4f 50   generated by OP
1a1d0 5f 4d 61 6b 65 52 65 63 6f 72 64 20 77 68 65 72  _MakeRecord wher
1a1e0 65 20 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64  e the last field
1a1f0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 77 69   is the .** rowi
1a200 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
1a210 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 72 65  hat the index re
1a220 66 65 72 73 20 74 6f 2e 0a 2a 2a 20 0a 2a 2a 20  fers to..** .** 
1a230 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
1a240 20 61 73 6b 73 20 69 66 20 74 68 65 72 65 20 69   asks if there i
1a250 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 50 31  s an entry in P1
1a260 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 66 69   where the.** fi
1a270 65 6c 64 73 20 6d 61 74 63 68 65 73 20 4b 20 62  elds matches K b
1a280 75 74 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  ut the rowid is 
1a290 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 52  different from R
1a2a0 2e 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  ..** If there is
1a2b0 20 6e 6f 20 73 75 63 68 20 65 6e 74 72 79 2c 20   no such entry, 
1a2c0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  then there is an
1a2d0 20 69 6d 6d 65 64 69 61 74 65 0a 2a 2a 20 6a 75   immediate.** ju
1a2e0 6d 70 20 74 6f 20 50 32 2e 20 20 49 66 20 61 6e  mp to P2.  If an
1a2f0 79 20 65 6e 74 72 79 20 64 6f 65 73 20 65 78 69  y entry does exi
1a300 73 74 20 77 68 65 72 65 20 74 68 65 20 69 6e 64  st where the ind
1a310 65 78 20 73 74 72 69 6e 67 0a 2a 2a 20 6d 61 74  ex string.** mat
1a320 63 68 65 73 20 4b 20 62 75 74 20 74 68 65 20 72  ches K but the r
1a330 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20  ecord number is 
1a340 6e 6f 74 20 52 2c 20 74 68 65 6e 20 74 68 65 20  not R, then the 
1a350 72 65 63 6f 72 64 0a 2a 2a 20 6e 75 6d 62 65 72  record.** number
1a360 20 66 6f 72 20 74 68 61 74 20 65 6e 74 72 79 20   for that entry 
1a370 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1a380 50 33 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 0a 2a  P3 and control.*
1a390 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20  * falls through 
1a3a0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
1a3b0 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  ruction..**.** S
1a3c0 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e  ee also: NotFoun
1a3d0 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c 20 46 6f  d, NotExists, Fo
1a3e0 75 6e 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  und.*/.case OP_I
1a3f0 73 55 6e 69 71 75 65 3a 20 7b 20 20 20 20 20 20  sUnique: {      
1a400 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
1a410 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d  /.  int i = pOp-
1a420 3e 70 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  >p1;.  VdbeCurso
1a430 72 20 2a 70 43 78 3b 0a 20 20 42 74 43 75 72 73  r *pCx;.  BtCurs
1a440 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 4d 65 6d  or *pCrsr;.  Mem
1a450 20 2a 70 4b 3b 0a 20 20 69 36 34 20 52 3b 0a 0a   *pK;.  i64 R;..
1a460 20 20 2f 2a 20 50 6f 70 20 74 68 65 20 76 61 6c    /* Pop the val
1a470 75 65 20 52 20 6f 66 66 20 74 68 65 20 74 6f 70  ue R off the top
1a480 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20 20   of the stack.  
1a490 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
1a4a0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
1a4b0 33 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  32 );.  assert( 
1a4c0 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 26 26 20 70  pOp->p4.i>0 && p
1a4d0 4f 70 2d 3e 70 34 2e 69 3c 3d 70 2d 3e 6e 4d 65  Op->p4.i<=p->nMe
1a4e0 6d 20 29 3b 0a 20 20 70 4b 20 3d 20 26 70 2d 3e  m );.  pK = &p->
1a4f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 34 2e 69 5d 3b  aMem[pOp->p4.i];
1a500 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1a510 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 33  mIntegerify(pIn3
1a520 29 3b 0a 20 20 52 20 3d 20 70 49 6e 33 2d 3e 75  );.  R = pIn3->u
1a530 2e 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  .i;.  assert( i>
1a540 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73  =0 && i<p->nCurs
1a550 6f 72 20 29 3b 0a 20 20 70 43 78 20 3d 20 70 2d  or );.  pCx = p-
1a560 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73  >apCsr[i];.  ass
1a570 65 72 74 28 20 70 43 78 21 3d 30 20 29 3b 0a 20  ert( pCx!=0 );. 
1a580 20 70 43 72 73 72 20 3d 20 70 43 78 2d 3e 70 43   pCrsr = pCx->pC
1a590 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 72  ursor;.  if( pCr
1a5a0 73 72 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  sr!=0 ){.    int
1a5b0 20 72 65 73 3b 0a 20 20 20 20 69 36 34 20 76 3b   res;.    i64 v;
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
1a5e0 72 64 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d  rd number that m
1a5f0 61 74 63 68 65 73 20 4b 20 2a 2f 0a 20 20 20 20  atches K */.    
1a600 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a610 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
1a620 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
1a630 66 20 50 34 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  f P4 */..    /* 
1a640 4d 61 6b 65 20 73 75 72 65 20 4b 20 69 73 20 61  Make sure K is a
1a650 20 73 74 72 69 6e 67 20 61 6e 64 20 6d 61 6b 65   string and make
1a660 20 7a 4b 65 79 20 70 6f 69 6e 74 20 74 6f 20 4b   zKey point to K
1a670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1a680 72 74 28 20 70 4b 2d 3e 66 6c 61 67 73 20 26 20  rt( pK->flags & 
1a690 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
1a6a0 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
1a6b0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1a6c0 6b 28 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c  k(pCx->pKeyInfo,
1a6d0 20 70 4b 2d 3e 6e 2c 20 70 4b 2d 3e 7a 2c 0a 20   pK->n, pK->z,. 
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 61 54 65 6d 70 52 65 63 2c 20 73       aTempRec, s
1a710 69 7a 65 6f 66 28 61 54 65 6d 70 52 65 63 29 29  izeof(aTempRec))
1a720 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
1a730 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  y==0 ){.      go
1a740 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
1a750 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 66 6c  .    pIdxKey->fl
1a760 61 67 73 20 7c 3d 20 55 4e 50 41 43 4b 45 44 5f  ags |= UNPACKED_
1a770 49 47 4e 4f 52 45 5f 52 4f 57 49 44 3b 0a 0a 20  IGNORE_ROWID;.. 
1a780 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
1a790 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 50 31 20   an entry in P1 
1a7a0 77 68 65 72 65 20 61 6c 6c 20 62 75 74 20 74 68  where all but th
1a7b0 65 20 6c 61 73 74 20 72 6f 77 69 64 20 6d 61 74  e last rowid mat
1a7c0 63 68 20 4b 0a 20 20 20 20 2a 2a 20 49 66 20 74  ch K.    ** If t
1a7d0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
1a7e0 65 6e 74 72 79 2c 20 6a 75 6d 70 20 69 6d 6d 65  entry, jump imme
1a7f0 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 20  diately to P2.. 
1a800 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a810 28 20 70 43 78 2d 3e 64 65 66 65 72 72 65 64 4d  ( pCx->deferredM
1a820 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  oveto==0 );.    
1a830 70 43 78 2d 3e 63 61 63 68 65 53 74 61 74 75 73  pCx->cacheStatus
1a840 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
1a850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a860 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1a870 6b 65 64 28 70 43 72 73 72 2c 20 70 49 64 78 4b  ked(pCrsr, pIdxK
1a880 65 79 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  ey, 0, 0, &res);
1a890 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a8b0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1a8c0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
1a8d0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
1a8e0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1a8f0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
1a900 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1a910 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a920 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 72 73  e3BtreeNext(pCrs
1a930 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
1a940 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
1a950 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1a960 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  - 1;.        sql
1a970 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1a980 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
1a990 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 62  xKey);.        b
1a9a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a9b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1a9c0 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
1a9d0 6d 70 61 72 65 28 70 43 78 2c 20 70 49 64 78 4b  mpare(pCx, pIdxK
1a9e0 65 79 2c 20 26 72 65 73 29 3b 20 0a 20 20 20 20  ey, &res); .    
1a9f0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1aa00 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
1aa10 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
1aa20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1aa30 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1aa40 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  _to_error;.    i
1aa50 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
1aa60 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d    pc = pOp->p2 -
1aa70 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
1aa80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1aa90 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 43  t this point, pC
1aaa0 72 73 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  rsr is pointing 
1aab0 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 50  to an entry in P
1aac0 31 20 77 68 65 72 65 20 61 6c 6c 20 62 75 74 0a  1 where all but.
1aad0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c      ** the final
1aae0 20 65 6e 74 72 79 20 28 74 68 65 20 72 6f 77 69   entry (the rowi
1aaf0 64 29 20 6d 61 74 63 68 65 73 20 4b 2e 20 20 43  d) matches K.  C
1ab00 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1ab10 68 65 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20  he.    ** final 
1ab20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 73 20  rowid column is 
1ab30 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 52  different from R
1ab40 2e 20 20 49 66 20 69 74 20 65 71 75 61 6c 73 20  .  If it equals 
1ab50 52 20 74 68 65 6e 20 6a 75 6d 70 0a 20 20 20 20  R then jump.    
1ab60 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ** immediately t
1ab70 6f 20 50 32 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o P2..    */.   
1ab80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1ab90 65 49 64 78 52 6f 77 69 64 28 70 43 72 73 72 2c  eIdxRowid(pCrsr,
1aba0 20 26 76 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &v);.    if( rc
1abb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1abc0 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f       goto abort_
1abd0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1abe0 20 20 7d 0a 20 20 20 20 69 66 28 20 76 3d 3d 52    }.    if( v==R
1abf0 20 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70   ){.      pc = p
1ac00 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20  Op->p2 - 1;.    
1ac10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ac20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c      /* The final
1ac30 20 76 61 72 69 6e 74 20 6f 66 20 74 68 65 20 6b   varint of the k
1ac40 65 79 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ey is different 
1ac50 66 72 6f 6d 20 52 2e 20 20 53 74 6f 72 65 20 69  from R.  Store i
1ac60 74 20 62 61 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  t back.    ** in
1ac70 74 6f 20 72 65 67 69 73 74 65 72 20 52 33 2e 20  to register R3. 
1ac80 20 28 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d   (The record num
1ac90 62 65 72 20 6f 66 20 61 6e 20 65 6e 74 72 79 20  ber of an entry 
1aca0 74 68 61 74 20 76 69 6f 6c 61 74 65 73 0a 20 20  that violates.  
1acb0 20 20 2a 2a 20 61 20 55 4e 49 51 55 45 20 63 6f    ** a UNIQUE co
1acc0 6e 73 74 72 61 69 6e 74 2e 29 0a 20 20 20 20 2a  nstraint.).    *
1acd0 2f 0a 20 20 20 20 70 49 6e 33 2d 3e 75 2e 69 20  /.    pIn3->u.i 
1ace0 3d 20 76 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = v;.    assert(
1acf0 20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn3->flags&MEM
1ad00 5f 49 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 62 72  _Int );.  }.  br
1ad10 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1ad20 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20  e: NotExists P1 
1ad30 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
1ad40 55 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  Use the content 
1ad50 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 61  of register P3 a
1ad60 73 20 61 20 69 6e 74 65 67 65 72 20 6b 65 79 2e  s a integer key.
1ad70 20 20 49 66 20 61 20 72 65 63 6f 72 64 20 0a 2a    If a record .*
1ad80 2a 20 77 69 74 68 20 74 68 61 74 20 6b 65 79 20  * with that key 
1ad90 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 69  does not exist i
1ada0 6e 20 74 61 62 6c 65 20 6f 66 20 50 31 2c 20 74  n table of P1, t
1adb0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20  hen jump to P2. 
1adc0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72  .** If the recor
1add0 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 74 68  d does exist, th
1ade0 65 6e 20 66 61 6c 6c 20 74 68 72 75 2e 20 20 54  en fall thru.  T
1adf0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1ae00 74 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  t .** pointing t
1ae10 6f 20 74 68 65 20 72 65 63 6f 72 64 20 69 66 20  o the record if 
1ae20 69 74 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  it exists..**.**
1ae30 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1ae40 62 65 74 77 65 65 6e 20 74 68 69 73 20 6f 70 65  between this ope
1ae50 72 61 74 69 6f 6e 20 61 6e 64 20 4e 6f 74 46 6f  ration and NotFo
1ae60 75 6e 64 20 69 73 20 74 68 61 74 20 74 68 69 73  und is that this
1ae70 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 61 73  .** operation as
1ae80 73 75 6d 65 73 20 74 68 65 20 6b 65 79 20 69 73  sumes the key is
1ae90 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
1aea0 74 68 61 74 20 50 31 20 69 73 20 61 20 74 61 62  that P1 is a tab
1aeb0 6c 65 20 77 68 65 72 65 61 73 0a 2a 2a 20 4e 6f  le whereas.** No
1aec0 74 46 6f 75 6e 64 20 61 73 73 75 6d 65 73 20 6b  tFound assumes k
1aed0 65 79 20 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e  ey is a blob con
1aee0 73 74 72 75 63 74 65 64 20 66 72 6f 6d 20 4d 61  structed from Ma
1aef0 6b 65 52 65 63 6f 72 64 20 61 6e 64 0a 2a 2a 20  keRecord and.** 
1af00 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78 2e 0a  P1 is an index..
1af10 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1af20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c  Found, NotFound,
1af30 20 49 73 55 6e 69 71 75 65 0a 2a 2f 0a 63 61 73   IsUnique.*/.cas
1af40 65 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20  e OP_NotExists: 
1af50 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
1af60 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 69  , in3 */.  int i
1af70 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64   = pOp->p1;.  Vd
1af80 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1af90 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1afa0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
1afb0 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  && i<p->nCursor 
1afc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1afd0 61 70 43 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20  apCsr[i]!=0 );. 
1afe0 20 69 66 28 20 28 70 43 72 73 72 20 3d 20 28 70   if( (pCrsr = (p
1aff0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29  C = p->apCsr[i])
1b000 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b  ->pCursor)!=0 ){
1b010 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30  .    int res = 0
1b020 3b 0a 20 20 20 20 75 36 34 20 69 4b 65 79 3b 0a  ;.    u64 iKey;.
1b030 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 33      assert( pIn3
1b040 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1b050 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
1b060 20 70 2d 3e 61 70 43 73 72 5b 69 5d 2d 3e 69 73   p->apCsr[i]->is
1b070 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 69 4b 65  Table );.    iKe
1b080 79 20 3d 20 69 6e 74 54 6f 4b 65 79 28 70 49 6e  y = intToKey(pIn
1b090 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 72 63 20  3->u.i);.    rc 
1b0a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1b0b0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 72  vetoUnpacked(pCr
1b0c0 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30 2c 26  sr, 0, iKey, 0,&
1b0d0 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6c 61  res);.    pC->la
1b0e0 73 74 52 6f 77 69 64 20 3d 20 70 49 6e 33 2d 3e  stRowid = pIn3->
1b0f0 75 2e 69 3b 0a 20 20 20 20 70 43 2d 3e 72 6f 77  u.i;.    pC->row
1b100 69 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d  idIsValid = res=
1b110 3d 30 20 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d  =0 ?1:0;.    pC-
1b120 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20  >nullRow = 0;.  
1b130 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1b140 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1b150 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 20  .    if( res!=0 
1b160 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
1b170 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 20  p->p2 - 1;.     
1b180 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1b190 69 64 49 73 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  idIsValid==0 );.
1b1a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1b1b0 28 20 21 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  ( !pC->pseudoTab
1b1c0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
1b1d0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
1b1e0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  n attempt to ope
1b1f0 6e 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 20  n a read cursor 
1b200 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73  on the .    ** s
1b210 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1b220 6c 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  le returns SQLIT
1b230 45 5f 45 4d 50 54 59 2e 0a 20 20 20 20 2a 2f 0a  E_EMPTY..    */.
1b240 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
1b250 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70  isTable );.    p
1b260 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b  c = pOp->p2 - 1;
1b270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
1b280 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 3d 3d 30  >rowidIsValid==0
1b290 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   );.  }.  break;
1b2a0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1b2b0 65 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20  equence P1 P2 * 
1b2c0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74  * *.**.** Find t
1b2d0 68 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c  he next availabl
1b2e0 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  e sequence numbe
1b2f0 72 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e  r for cursor P1.
1b300 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
1b310 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e  quence number in
1b320 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
1b330 2a 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20  ** The sequence 
1b340 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75  number on the cu
1b350 72 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  rsor is incremen
1b360 74 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a  ted after this.*
1b370 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  * instruction.  
1b380 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75  .*/.case OP_Sequ
1b390 65 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20  ence: {         
1b3a0 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
1b3b0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ease */.  int i 
1b3c0 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61 73 73  = pOp->p1;.  ass
1b3d0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
1b3e0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61  ->nCursor );.  a
1b3f0 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
1b400 69 5d 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 2d  i]!=0 );.  pOut-
1b410 3e 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b  >u.i = p->apCsr[
1b420 69 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a  i]->seqCount++;.
1b430 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
1b440 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
1b450 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
1b460 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69   Opcode: NewRowi
1b470 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
1b480 2a 0a 2a 2a 20 47 65 74 20 61 20 6e 65 77 20 69  *.** Get a new i
1b490 6e 74 65 67 65 72 20 72 65 63 6f 72 64 20 6e 75  nteger record nu
1b4a0 6d 62 65 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77  mber (a.k.a "row
1b4b0 69 64 22 29 20 75 73 65 64 20 61 73 20 74 68 65  id") used as the
1b4c0 20 6b 65 79 20 74 6f 20 61 20 74 61 62 6c 65 2e   key to a table.
1b4d0 0a 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 6e  .** The record n
1b4e0 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 70 72 65  umber is not pre
1b4f0 76 69 6f 75 73 6c 79 20 75 73 65 64 20 61 73 20  viously used as 
1b500 61 20 6b 65 79 20 69 6e 20 74 68 65 20 64 61 74  a key in the dat
1b510 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74  abase.** table t
1b520 68 61 74 20 63 75 72 73 6f 72 20 50 31 20 70 6f  hat cursor P1 po
1b530 69 6e 74 73 20 74 6f 2e 20 20 54 68 65 20 6e 65  ints to.  The ne
1b540 77 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  w record number 
1b550 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72  is written.** wr
1b560 69 74 74 65 6e 20 74 6f 20 72 65 67 69 73 74 65  itten to registe
1b570 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  r P2..**.** If P
1b580 33 3e 30 20 74 68 65 6e 20 50 33 20 69 73 20 61  3>0 then P3 is a
1b590 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68   register that h
1b5a0 6f 6c 64 73 20 74 68 65 20 6c 61 72 67 65 73 74  olds the largest
1b5b0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 67   previously.** g
1b5c0 65 6e 65 72 61 74 65 64 20 72 65 63 6f 72 64 20  enerated record 
1b5d0 6e 75 6d 62 65 72 2e 20 20 4e 6f 20 6e 65 77 20  number.  No new 
1b5e0 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 73 20 61  record numbers a
1b5f0 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1b600 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
1b610 69 73 20 76 61 6c 75 65 2e 20 20 57 68 65 6e 20  is value.  When 
1b620 74 68 69 73 20 76 61 6c 75 65 20 72 65 61 63 68  this value reach
1b630 65 73 20 69 74 73 20 6d 61 78 69 6d 75 6d 2c 20  es its maximum, 
1b640 61 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  a SQLITE_FULL.**
1b650 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61   error is genera
1b660 74 65 64 2e 20 20 54 68 65 20 50 33 20 72 65 67  ted.  The P3 reg
1b670 69 73 74 65 72 20 69 73 20 75 70 64 61 74 65 64  ister is updated
1b680 20 77 69 74 68 20 74 68 65 20 67 65 6e 65 72 61   with the genera
1b690 74 65 64 0a 2a 2a 20 72 65 63 6f 72 64 20 6e 75  ted.** record nu
1b6a0 6d 62 65 72 2e 20 20 54 68 69 73 20 50 33 20 6d  mber.  This P3 m
1b6b0 65 63 68 61 6e 69 73 6d 20 69 73 20 75 73 65 64  echanism is used
1b6c0 20 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65   to help impleme
1b6d0 6e 74 20 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e  nt the.** AUTOIN
1b6e0 43 52 45 4d 45 4e 54 20 66 65 61 74 75 72 65 2e  CREMENT feature.
1b6f0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52  .*/.case OP_NewR
1b700 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20 20 20  owid: {         
1b710 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c    /* out2-prerel
1b720 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ease */.  int i 
1b730 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 36 34  = pOp->p1;.  i64
1b740 20 76 20 3d 20 30 3b 0a 20 20 56 64 62 65 43 75   v = 0;.  VdbeCu
1b750 72 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65  rsor *pC;.  asse
1b760 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
1b770 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73  >nCursor );.  as
1b780 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
1b790 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ]!=0 );.  if( (p
1b7a0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 29  C = p->apCsr[i])
1b7b0 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 29 7b 0a  ->pCursor==0 ){.
1b7c0 20 20 20 20 2f 2a 20 54 68 65 20 7a 65 72 6f 20      /* The zero 
1b7d0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 61  initialization a
1b7e0 62 6f 76 65 20 69 73 20 61 6c 6c 20 74 68 61 74  bove is all that
1b7f0 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   is needed */.  
1b800 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1b810 65 20 6e 65 78 74 20 72 6f 77 69 64 20 6f 72 20  e next rowid or 
1b820 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 64  record number (d
1b830 69 66 66 65 72 65 6e 74 20 74 65 72 6d 73 20 66  ifferent terms f
1b840 6f 72 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  or the same.    
1b850 2a 2a 20 74 68 69 6e 67 29 20 69 73 20 6f 62 74  ** thing) is obt
1b860 61 69 6e 65 64 20 69 6e 20 61 20 74 77 6f 2d 73  ained in a two-s
1b870 74 65 70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20  tep algorithm.. 
1b880 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1b890 73 74 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f  st we attempt to
1b8a0 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
1b8b0 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64  t existing rowid
1b8c0 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a 20 20 20   and add one.   
1b8d0 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20 20 42 75   ** to that.  Bu
1b8e0 74 20 69 66 20 74 68 65 20 6c 61 72 67 65 73 74  t if the largest
1b8f0 20 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20   existing rowid 
1b900 69 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6d  is already the m
1b910 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f  aximum.    ** po
1b920 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 2c 20  sitive integer, 
1b930 77 65 20 68 61 76 65 20 74 6f 20 66 61 6c 6c 20  we have to fall 
1b940 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 73  through to the s
1b950 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f  econd.    ** pro
1b960 62 61 62 69 6c 69 73 74 69 63 20 61 6c 67 6f 72  babilistic algor
1b970 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ithm.    **.    
1b980 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6c  ** The second al
1b990 67 6f 72 69 74 68 6d 20 69 73 20 74 6f 20 73 65  gorithm is to se
1b9a0 6c 65 63 74 20 61 20 72 6f 77 69 64 20 61 74 20  lect a rowid at 
1b9b0 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65 65 20 69  random and see i
1b9c0 66 0a 20 20 20 20 2a 2a 20 69 74 20 61 6c 72 65  f.    ** it alre
1b9d0 61 64 79 20 65 78 69 73 74 73 20 69 6e 20 74 68  ady exists in th
1b9e0 65 20 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20  e table.  If it 
1b9f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
1ba00 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 73  we have.    ** s
1ba10 75 63 63 65 65 64 65 64 2e 20 20 49 66 20 74 68  ucceeded.  If th
1ba20 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64  e random rowid d
1ba30 6f 65 73 20 65 78 69 73 74 2c 20 77 65 20 73 65  oes exist, we se
1ba40 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20  lect a new one. 
1ba50 20 20 20 2a 2a 20 61 6e 64 20 74 72 79 20 61 67     ** and try ag
1ba60 61 69 6e 2c 20 75 70 20 74 6f 20 31 30 30 30 20  ain, up to 1000 
1ba70 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  times..    **.  
1ba80 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65    ** For a table
1ba90 20 77 69 74 68 20 6c 65 73 73 20 74 68 61 6e 20   with less than 
1baa0 32 20 62 69 6c 6c 69 6f 6e 20 65 6e 74 72 69 65  2 billion entrie
1bab0 73 2c 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  s, the probabili
1bac0 74 79 0a 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74  ty.    ** of not
1bad0 20 66 69 6e 64 69 6e 67 20 61 20 75 6e 75 73 65   finding a unuse
1bae0 64 20 72 6f 77 69 64 20 69 73 20 61 62 6f 75 74  d rowid is about
1baf0 20 31 2e 30 65 2d 33 30 30 2e 20 20 54 68 69 73   1.0e-300.  This
1bb00 20 69 73 20 61 20 0a 20 20 20 20 2a 2a 20 6e 6f   is a .    ** no
1bb10 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
1bb20 74 79 2c 20 62 75 74 20 69 74 20 69 73 20 73 74  ty, but it is st
1bb30 69 6c 6c 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  ill vanishingly 
1bb40 73 6d 61 6c 6c 20 61 6e 64 20 73 68 6f 75 6c 64  small and should
1bb50 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 63 61  .    ** never ca
1bb60 75 73 65 20 61 20 70 72 6f 62 6c 65 6d 2e 20 20  use a problem.  
1bb70 59 6f 75 20 61 72 65 20 6d 75 63 68 2c 20 6d 75  You are much, mu
1bb80 63 68 20 6d 6f 72 65 20 6c 69 6b 65 6c 79 20 74  ch more likely t
1bb90 6f 20 68 61 76 65 20 61 0a 20 20 20 20 2a 2a 20  o have a.    ** 
1bba0 68 61 72 64 77 61 72 65 20 66 61 69 6c 75 72 65  hardware failure
1bbb0 20 74 68 61 6e 20 66 6f 72 20 74 68 69 73 20 61   than for this a
1bbc0 6c 67 6f 72 69 74 68 6d 20 74 6f 20 66 61 69 6c  lgorithm to fail
1bbd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bbe0 54 68 65 20 61 6e 61 6c 79 73 69 73 20 69 6e 20  The analysis in 
1bbf0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 72  the previous par
1bc00 61 67 72 61 70 68 20 61 73 73 75 6d 65 73 20 74  agraph assumes t
1bc10 68 61 74 20 79 6f 75 20 68 61 76 65 20 61 20 67  hat you have a g
1bc20 6f 6f 64 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  ood.    ** sourc
1bc30 65 20 6f 66 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  e of random numb
1bc40 65 72 73 2e 20 20 49 73 20 61 20 6c 69 62 72 61  ers.  Is a libra
1bc50 72 79 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65  ry function like
1bc60 20 6c 72 61 6e 64 34 38 28 29 0a 20 20 20 20 2a   lrand48().    *
1bc70 2a 20 67 6f 6f 64 20 65 6e 6f 75 67 68 3f 20 20  * good enough?  
1bc80 4d 61 79 62 65 2e 20 4d 61 79 62 65 20 6e 6f 74  Maybe. Maybe not
1bc90 2e 20 49 74 27 73 20 68 61 72 64 20 74 6f 20 6b  . It's hard to k
1bca0 6e 6f 77 20 77 68 65 74 68 65 72 20 74 68 65 72  now whether ther
1bcb0 65 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62  e.    ** might b
1bcc0 65 20 73 75 62 74 6c 65 20 62 75 67 73 20 69 73  e subtle bugs is
1bcd0 20 73 6f 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61   some implementa
1bce0 74 69 6f 6e 73 20 6f 66 20 6c 72 61 6e 64 34 38  tions of lrand48
1bcf0 28 29 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  () that.    ** c
1bd00 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c  ould cause probl
1bd10 65 6d 73 2e 20 54 6f 20 61 76 6f 69 64 20 75 6e  ems. To avoid un
1bd20 63 65 72 74 61 69 6e 74 79 2c 20 53 51 4c 69 74  certainty, SQLit
1bd30 65 20 75 73 65 73 20 69 74 73 20 6f 77 6e 20 0a  e uses its own .
1bd40 20 20 20 20 2a 2a 20 72 61 6e 64 6f 6d 20 6e 75      ** random nu
1bd50 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 62  mber generator b
1bd60 61 73 65 64 20 6f 6e 20 74 68 65 20 52 43 34 20  ased on the RC4 
1bd70 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
1bd80 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 70 72 6f 6d  *.    ** To prom
1bd90 6f 74 65 20 6c 6f 63 61 6c 69 74 79 20 6f 66 20  ote locality of 
1bda0 72 65 66 65 72 65 6e 63 65 20 66 6f 72 20 72 65  reference for re
1bdb0 70 65 74 69 74 69 76 65 20 69 6e 73 65 72 74 73  petitive inserts
1bdc0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  , the.    ** fir
1bdd0 73 74 20 66 65 77 20 61 74 74 65 6d 70 74 73 20  st few attempts 
1bde0 61 74 20 63 68 6f 6f 73 69 6e 67 20 61 20 72 61  at choosing a ra
1bdf0 6e 64 6f 6d 20 72 6f 77 69 64 20 70 69 63 6b 20  ndom rowid pick 
1be00 76 61 6c 75 65 73 20 6a 75 73 74 20 61 20 6c 69  values just a li
1be10 74 74 6c 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67  ttle.    ** larg
1be20 65 72 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  er than the prev
1be30 69 6f 75 73 20 72 6f 77 69 64 2e 20 20 54 68 69  ious rowid.  Thi
1be40 73 20 68 61 73 20 62 65 65 6e 20 73 68 6f 77 6e  s has been shown
1be50 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 0a   experimentally.
1be60 20 20 20 20 2a 2a 20 74 6f 20 64 6f 75 62 6c 65      ** to double
1be70 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 74 68   the speed of th
1be80 65 20 43 4f 50 59 20 6f 70 65 72 61 74 69 6f 6e  e COPY operation
1be90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1bea0 20 72 65 73 2c 20 72 78 3d 53 51 4c 49 54 45 5f   res, rx=SQLITE_
1beb0 4f 4b 2c 20 63 6e 74 3b 0a 20 20 20 20 69 36 34  OK, cnt;.    i64
1bec0 20 78 3b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   x;.    cnt = 0;
1bed0 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
1bee0 33 42 74 72 65 65 46 6c 61 67 73 28 70 43 2d 3e  3BtreeFlags(pC->
1bef0 70 43 75 72 73 6f 72 29 26 28 42 54 52 45 45 5f  pCursor)&(BTREE_
1bf00 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 5a 45 52  INTKEY|BTREE_ZER
1bf10 4f 44 41 54 41 29 29 20 21 3d 0a 20 20 20 20 20  ODATA)) !=.     
1bf20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
1bf30 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
1bf40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bf50 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1bf60 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1bf70 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
1bf80 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 42 74  sert( (sqlite3Bt
1bf90 72 65 65 46 6c 61 67 73 28 70 43 2d 3e 70 43 75  reeFlags(pC->pCu
1bfa0 72 73 6f 72 29 20 26 20 42 54 52 45 45 5f 49 4e  rsor) & BTREE_IN
1bfb0 54 4b 45 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  TKEY)!=0 );.    
1bfc0 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
1bfd0 42 74 72 65 65 46 6c 61 67 73 28 70 43 2d 3e 70  BtreeFlags(pC->p
1bfe0 43 75 72 73 6f 72 29 20 26 20 42 54 52 45 45 5f  Cursor) & BTREE_
1bff0 5a 45 52 4f 44 41 54 41 29 3d 3d 30 20 29 3b 0a  ZERODATA)==0 );.
1c000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 33  .#ifdef SQLITE_3
1c010 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20 64  2BIT_ROWID.#   d
1c020 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20  efine MAX_ROWID 
1c030 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73 65  0x7fffffff.#else
1c040 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d  .    /* Some com
1c050 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20  pilers complain 
1c060 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73 20  about constants 
1c070 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37 66  of the form 0x7f
1c080 66 66 66 66 66 66 66 66 66 66 66 66 66 66 2e 0a  ffffffffffffff..
1c090 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63 6f      ** Others co
1c0a0 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78 37  mplain about 0x7
1c0b0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  ffffffffffffffff
1c0c0 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  LL.  The followi
1c0d0 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a 20  ng macro seems. 
1c0e0 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64 65     ** to provide
1c0f0 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77 68   the constant wh
1c100 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20 63  ile making all c
1c110 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e 0a  ompilers happy..
1c120 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e      */.#   defin
1c130 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69 36  e MAX_ROWID  (i6
1c140 34 29 28 20 28 28 28 75 36 34 29 30 78 37 66 66  4)( (((u64)0x7ff
1c150 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28 75  fffff)<<32) | (u
1c160 36 34 29 30 78 66 66 66 66 66 66 66 66 20 29 0a  64)0xffffffff ).
1c170 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
1c180 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f  !pC->useRandomRo
1c190 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  wid ){.      if(
1c1a0 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61   pC->nextRowidVa
1c1b0 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 76  lid ){.        v
1c1c0 20 3d 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64   = pC->nextRowid
1c1d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c1e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c1f0 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43 2d  te3BtreeLast(pC-
1c200 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
1c210 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1c220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c230 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
1c240 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1c250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c260 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
1c270 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b 0a 20          v = 1;. 
1c280 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1c2a0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 2d 3e  treeKeySize(pC->
1c2b0 70 43 75 72 73 6f 72 2c 20 26 76 29 3b 0a 20 20  pCursor, &v);.  
1c2c0 20 20 20 20 20 20 20 20 76 20 3d 20 6b 65 79 54          v = keyT
1c2d0 6f 49 6e 74 28 76 29 3b 0a 20 20 20 20 20 20 20  oInt(v);.       
1c2e0 20 20 20 69 66 28 20 76 3d 3d 4d 41 58 5f 52 4f     if( v==MAX_RO
1c2f0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  WID ){.         
1c300 20 20 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d     pC->useRandom
1c310 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Rowid = 1;.     
1c320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c330 20 20 20 20 20 20 20 20 76 2b 2b 3b 0a 20 20 20          v++;.   
1c340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c350 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 23 69 66 6e   }.      }..#ifn
1c360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c370 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
1c380 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20      if( pOp->p3 
1c390 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  ){.        Mem *
1c3a0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 61 73  pMem;.        as
1c3b0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
1c3c0 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
1c3d0 4d 65 6d 20 29 3b 20 2f 2a 20 50 33 20 69 73 20  Mem ); /* P3 is 
1c3e0 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63  a valid memory c
1c3f0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ell */.        p
1c400 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Mem = &p->aMem[p
1c410 4f 70 2d 3e 70 33 5d 3b 0a 09 52 45 47 49 53 54  Op->p3];..REGIST
1c420 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
1c430 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1c440 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1c450 6e 74 65 67 65 72 69 66 79 28 70 4d 65 6d 29 3b  ntegerify(pMem);
1c460 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c470 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
1c480 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 20 20  MEM_Int)!=0 );  
1c490 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c 64 73  /* mem(P3) holds
1c4a0 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1c4b0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d         if( pMem-
1c4c0 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49 44 20  >u.i==MAX_ROWID 
1c4d0 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  || pC->useRandom
1c4e0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
1c4f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
1c500 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ULL;.          g
1c510 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1c520 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  _error;.        
1c530 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3c  }.        if( v<
1c540 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20  pMem->u.i+1 ){. 
1c550 20 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65           v = pMe
1c560 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20  m->u.i + 1;.    
1c570 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4d      }.        pM
1c580 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20  em->u.i = v;.   
1c590 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1c5a0 20 20 20 69 66 28 20 76 3c 4d 41 58 5f 52 4f 57     if( v<MAX_ROW
1c5b0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ID ){.        pC
1c5c0 2d 3e 6e 65 78 74 52 6f 77 69 64 56 61 6c 69 64  ->nextRowidValid
1c5d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
1c5e0 2d 3e 6e 65 78 74 52 6f 77 69 64 20 3d 20 76 2b  ->nextRowid = v+
1c5f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1c600 20 20 20 20 20 20 20 20 70 43 2d 3e 6e 65 78 74          pC->next
1c610 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 30 3b 0a  RowidValid = 0;.
1c620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c630 20 20 69 66 28 20 70 43 2d 3e 75 73 65 52 61 6e    if( pC->useRan
1c640 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
1c650 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1c660 33 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 51 4c 49  3==0 );  /* SQLI
1c670 54 45 5f 46 55 4c 4c 20 6d 75 73 74 20 68 61 76  TE_FULL must hav
1c680 65 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  e occurred prior
1c690 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 20 20   to this */.    
1c6a0 20 20 76 20 3d 20 64 62 2d 3e 70 72 69 6f 72 4e    v = db->priorN
1c6b0 65 77 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  ewRowid;.      c
1c6c0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  nt = 0;.      do
1c6d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6e  {.        if( cn
1c6e0 74 3d 3d 30 20 26 26 20 28 76 26 30 78 66 66 66  t==0 && (v&0xfff
1c6f0 66 66 66 29 3d 3d 76 20 29 7b 0a 20 20 20 20 20  fff)==v ){.     
1c700 20 20 20 20 20 76 2b 2b 3b 0a 20 20 20 20 20 20       v++;.      
1c710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c720 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1c730 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 76 29 2c  mness(sizeof(v),
1c740 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
1c750 69 66 28 20 63 6e 74 3c 35 20 29 20 76 20 26 3d  if( cnt<5 ) v &=
1c760 20 30 78 66 66 66 66 66 66 3b 0a 20 20 20 20 20   0xffffff;.     
1c770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c780 20 76 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   v==0 ) continue
1c790 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 69 6e  ;.        x = in
1c7a0 74 54 6f 4b 65 79 28 76 29 3b 0a 20 20 20 20 20  tToKey(v);.     
1c7b0 20 20 20 72 78 20 3d 20 73 71 6c 69 74 65 33 42     rx = sqlite3B
1c7c0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1c7d0 65 64 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ed(pC->pCursor, 
1c7e0 30 2c 20 28 75 36 34 29 78 2c 20 30 2c 20 26 72  0, (u64)x, 0, &r
1c7f0 65 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6e 74  es);.        cnt
1c800 2b 2b 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  ++;.      }while
1c810 28 20 63 6e 74 3c 31 30 30 20 26 26 20 72 78 3d  ( cnt<100 && rx=
1c820 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
1c830 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 64 62  s==0 );.      db
1c840 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20  ->priorNewRowid 
1c850 3d 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = v;.      if( r
1c860 78 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  x==SQLITE_OK && 
1c870 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1c880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1c890 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
1c8a0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1c8b0 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
1c8c0 20 7d 0a 20 20 20 20 70 43 2d 3e 72 6f 77 69 64   }.    pC->rowid
1c8d0 49 73 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  IsValid = 0;.   
1c8e0 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
1c8f0 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43 2d  eto = 0;.    pC-
1c900 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
1c910 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a  ACHE_STALE;.  }.
1c920 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
1c930 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b  (pOut, MEM_Int);
1c940 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76  .  pOut->u.i = v
1c950 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1c960 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 20   Opcode: Insert 
1c970 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
1c980 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
1c990 74 72 79 20 69 6e 74 6f 20 74 68 65 20 74 61 62  try into the tab
1c9a0 6c 65 20 6f 66 20 63 75 72 73 6f 72 20 50 31 2e  le of cursor P1.
1c9b0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1c9c0 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 66 20 69  .** created if i
1c9d0 74 20 64 6f 65 73 6e 27 74 20 61 6c 72 65 61 64  t doesn't alread
1c9e0 79 20 65 78 69 73 74 20 6f 72 20 74 68 65 20 64  y exist or the d
1c9f0 61 74 61 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ata for an exist
1ca00 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20  ing.** entry is 
1ca10 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 54 68  overwritten.  Th
1ca20 65 20 64 61 74 61 20 69 73 20 74 68 65 20 76 61  e data is the va
1ca30 6c 75 65 20 73 74 6f 72 65 64 20 72 65 67 69 73  lue stored regis
1ca40 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 32  ter.** number P2
1ca50 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74 6f  . The key is sto
1ca60 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
1ca70 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73 74  P3. The key must
1ca80 0a 2a 2a 20 62 65 20 61 6e 20 69 6e 74 65 67 65  .** be an intege
1ca90 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1caa0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66  OPFLAG_NCHANGE f
1cab0 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
1cac0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63  , then the row c
1cad0 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a  hange count is.*
1cae0 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f  * incremented (o
1caf0 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20  therwise not).  
1cb00 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41  If the OPFLAG_LA
1cb10 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20  STROWID flag of 
1cb20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  P5 is set,.** th
1cb30 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72  en rowid is stor
1cb40 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e  ed for subsequen
1cb50 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a  t return by the.
1cb60 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  ** sqlite3_last_
1cb70 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66  insert_rowid() f
1cb80 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69  unction (otherwi
1cb90 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66  se it is unmodif
1cba0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ied)..**.** Para
1cbb0 6d 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69  meter P4 may poi
1cbc0 6e 74 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  nt to a string c
1cbd0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
1cbe0 62 6c 65 2d 6e 61 6d 65 2c 20 6f 72 0a 2a 2a 20  ble-name, or.** 
1cbf0 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  may be NULL. If 
1cc00 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1cc10 74 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d  then the update-
1cc20 68 6f 6f 6b 20 0a 2a 2a 20 28 73 71 6c 69 74 65  hook .** (sqlite
1cc30 33 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  3.xUpdateCallbac
1cc40 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 6f  k) is invoked fo
1cc50 6c 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73  llowing a succes
1cc60 73 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a  sful insert..**.
1cc70 2a 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f  ** (WARNING/TODO
1cc80 3a 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65  : If P1 is a pse
1cc90 75 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50  udo-cursor and P
1cca0 32 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  2 is dynamically
1ccb0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74  .** allocated, t
1ccc0 68 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  hen ownership of
1ccd0 20 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72   P2 is transferr
1cce0 65 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f  ed to the pseudo
1ccf0 2d 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72  -cursor.** and r
1cd00 65 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d  egister P2 becom
1cd10 65 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49  es ephemeral.  I
1cd20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1cd30 63 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20  changed, the.** 
1cd40 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65  value of registe
1cd50 72 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63  r P2 will then c
1cd60 68 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72  hange.  Make sur
1cd70 65 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a  e this does not.
1cd80 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ** cause any pro
1cd90 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  blems.).**.** Th
1cda0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f  is instruction o
1cdb0 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62  nly works on tab
1cdc0 6c 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61  les.  The equiva
1cdd0 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  lent instruction
1cde0 0a 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20  .** for indices 
1cdf0 69 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e  is OP_IdxInsert.
1ce00 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  .*/.case OP_Inse
1ce10 72 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61  rt: {.  Mem *pDa
1ce20 74 61 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  ta = &p->aMem[pO
1ce30 70 2d 3e 70 32 5d 3b 0a 20 20 4d 65 6d 20 2a 70  p->p2];.  Mem *p
1ce40 4b 65 79 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Key = &p->aMem[p
1ce50 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 69 36 34 20  Op->p3];..  i64 
1ce60 69 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 69  iKey;   /* The i
1ce70 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f 72 20  nteger ROWID or 
1ce80 6b 65 79 20 66 6f 72 20 74 68 65 20 72 65 63 6f  key for the reco
1ce90 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  rd to be inserte
1cea0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  d */.  int i = p
1ceb0 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43 75  Op->p1;.  VdbeCu
1cec0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73 65  rsor *pC;.  asse
1ced0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
1cee0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
1cef0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
1cf00 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1cf10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1cf20 3e 70 43 75 72 73 6f 72 21 3d 30 20 7c 7c 20 70  >pCursor!=0 || p
1cf30 43 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29  C->pseudoTable )
1cf40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1cf50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
1cf60 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1cf70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
1cf80 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
1cf90 4f 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a  Op->p2, pData);.
1cfa0 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
1cfb0 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b  (pOp->p3, pKey);
1cfc0 0a 0a 20 20 69 4b 65 79 20 3d 20 69 6e 74 54 6f  ..  iKey = intTo
1cfd0 4b 65 79 28 70 4b 65 79 2d 3e 75 2e 69 29 3b 0a  Key(pKey->u.i);.
1cfe0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
1cff0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
1d000 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
1d010 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
1d020 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20  PFLAG_LASTROWID 
1d030 29 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ) db->lastRowid 
1d040 3d 20 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 69  = pKey->u.i;.  i
1d050 66 28 20 70 43 2d 3e 6e 65 78 74 52 6f 77 69 64  f( pC->nextRowid
1d060 56 61 6c 69 64 20 26 26 20 70 4b 65 79 2d 3e 75  Valid && pKey->u
1d070 2e 69 3e 3d 70 43 2d 3e 6e 65 78 74 52 6f 77 69  .i>=pC->nextRowi
1d080 64 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 65 78  d ){.    pC->nex
1d090 74 52 6f 77 69 64 56 61 6c 69 64 20 3d 20 30 3b  tRowidValid = 0;
1d0a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1d0b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
1d0c0 6c 6c 20 29 7b 0a 20 20 20 20 70 44 61 74 61 2d  ll ){.    pData-
1d0d0 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 70 44 61 74  >z = 0;.    pDat
1d0e0 61 2d 3e 6e 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  a->n = 0;.  }els
1d0f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1d100 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d  Data->flags & (M
1d110 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29  EM_Blob|MEM_Str)
1d120 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   );.  }.  if( pC
1d130 2d 3e 70 73 65 75 64 6f 54 61 62 6c 65 20 29 7b  ->pseudoTable ){
1d140 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e 65 70  .    if( !pC->ep
1d150 68 65 6d 50 73 65 75 64 6f 54 61 62 6c 65 20 29  hemPseudoTable )
1d160 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
1d170 62 46 72 65 65 28 64 62 2c 20 70 43 2d 3e 70 44  bFree(db, pC->pD
1d180 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
1d190 70 43 2d 3e 69 4b 65 79 20 3d 20 69 4b 65 79 3b  pC->iKey = iKey;
1d1a0 0a 20 20 20 20 70 43 2d 3e 6e 44 61 74 61 20 3d  .    pC->nData =
1d1b0 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20 20 20 69   pData->n;.    i
1d1c0 66 28 20 70 44 61 74 61 2d 3e 7a 3d 3d 70 44 61  f( pData->z==pDa
1d1d0 74 61 2d 3e 7a 4d 61 6c 6c 6f 63 20 7c 7c 20 70  ta->zMalloc || p
1d1e0 43 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61  C->ephemPseudoTa
1d1f0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d  ble ){.      pC-
1d200 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d 3e  >pData = pData->
1d210 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43  z;.      if( !pC
1d220 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62  ->ephemPseudoTab
1d230 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  le ){.        pD
1d240 61 74 61 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d  ata->flags &= ~M
1d250 45 4d 5f 44 79 6e 3b 0a 20 20 20 20 20 20 20 20  EM_Dyn;.        
1d260 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 7c 3d 20  pData->flags |= 
1d270 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
1d280 20 20 20 70 44 61 74 61 2d 3e 7a 4d 61 6c 6c 6f     pData->zMallo
1d290 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
1d2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2b0 70 43 2d 3e 70 44 61 74 61 20 3d 20 73 71 6c 69  pC->pData = sqli
1d2c0 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 2d 3e 6e  te3Malloc( pC->n
1d2d0 44 61 74 61 2b 32 20 29 3b 0a 20 20 20 20 20 20  Data+2 );.      
1d2e0 69 66 28 20 21 70 43 2d 3e 70 44 61 74 61 20 29  if( !pC->pData )
1d2f0 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1d300 20 20 20 20 6d 65 6d 63 70 79 28 70 43 2d 3e 70      memcpy(pC->p
1d310 44 61 74 61 2c 20 70 44 61 74 61 2d 3e 7a 2c 20  Data, pData->z, 
1d320 70 43 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 20 20  pC->nData);.    
1d330 20 20 70 43 2d 3e 70 44 61 74 61 5b 70 43 2d 3e    pC->pData[pC->
1d340 6e 44 61 74 61 5d 20 3d 20 30 3b 0a 20 20 20 20  nData] = 0;.    
1d350 20 20 70 43 2d 3e 70 44 61 74 61 5b 70 43 2d 3e    pC->pData[pC->
1d360 6e 44 61 74 61 2b 31 5d 20 3d 20 30 3b 0a 20 20  nData+1] = 0;.  
1d370 20 20 7d 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c    }.    pC->null
1d380 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Row = 0;.  }else
1d390 7b 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 3b  {.    int nZero;
1d3a0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
1d3b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d3c0 20 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 20   ){.      nZero 
1d3d0 3d 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f  = pData->u.nZero
1d3e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d3f0 20 20 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20     nZero = 0;.  
1d400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1d410 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1d420 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
1d430 69 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  iKey,.          
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 20 70 44 61 74 61 2d 3e 7a 2c 20 70 44 61 74    pData->z, pDat
1d460 61 2d 3e 6e 2c 20 6e 5a 65 72 6f 2c 0a 20 20 20  a->n, nZero,.   
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d480 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 35           pOp->p5
1d490 20 26 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44   & OPFLAG_APPEND
1d4a0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 70 43 2d 3e  );.  }.  .  pC->
1d4b0 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 30  rowidIsValid = 0
1d4c0 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
1d4d0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
1d4e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
1d4f0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20  CACHE_STALE;..  
1d500 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
1d510 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
1d520 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
1d530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d540 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
1d550 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e  back && pOp->p4.
1d560 7a 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  z ){.    const c
1d570 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1d580 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  Db[pC->iDb].zNam
1d590 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1d5a0 72 20 2a 7a 54 62 6c 20 3d 20 70 4f 70 2d 3e 70  r *zTbl = pOp->p
1d5b0 34 2e 7a 3b 0a 20 20 20 20 69 6e 74 20 6f 70 20  4.z;.    int op 
1d5c0 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  = ((pOp->p5 & OP
1d5d0 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f  FLAG_ISUPDATE) ?
1d5e0 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a   SQLITE_UPDATE :
1d5f0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 29 3b   SQLITE_INSERT);
1d600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
1d610 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
1d620 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
1d630 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
1d640 72 67 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62  rg, op, zDb, zTb
1d650 6c 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 61 73  l, iKey);.    as
1d660 73 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30  sert( pC->iDb>=0
1d670 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   );.  }.  break;
1d680 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
1d690 65 6c 65 74 65 20 50 31 20 50 32 20 2a 20 50 34  elete P1 P2 * P4
1d6a0 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20   *.**.** Delete 
1d6b0 74 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68  the record at wh
1d6c0 69 63 68 20 74 68 65 20 50 31 20 63 75 72 73 6f  ich the P1 curso
1d6d0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  r is currently p
1d6e0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
1d6f0 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62  he cursor will b
1d700 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
1d710 61 74 20 65 69 74 68 65 72 20 74 68 65 20 6e 65  at either the ne
1d720 78 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f  xt or the previo
1d730 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20  us.** record in 
1d740 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74  the table. If it
1d750 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1d760 67 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65  g at the next re
1d770 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  cord, then.** th
1d780 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74  e next Next inst
1d790 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
1d7a0 61 20 6e 6f 2d 6f 70 2e 20 20 48 65 6e 63 65 20  a no-op.  Hence 
1d7b0 69 74 20 69 73 20 4f 4b 20 74 6f 20 64 65 6c 65  it is OK to dele
1d7c0 74 65 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 66  te.** a record f
1d7d0 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 4e 65  rom within an Ne
1d7e0 78 74 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  xt loop..**.** I
1d7f0 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48  f the OPFLAG_NCH
1d800 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32 20  ANGE flag of P2 
1d810 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
1d820 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
1d830 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  t is.** incremen
1d840 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e  ted (otherwise n
1d850 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75  ot)..**.** P1 mu
1d860 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64 6f  st not be pseudo
1d870 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73 20  -table.  It has 
1d880 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61 62  to be a real tab
1d890 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69  le with.** multi
1d8a0 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20  ple rows..**.** 
1d8b0 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c  If P4 is not NUL
1d8c0 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
1d8d0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1d8e0 62 6c 65 20 74 68 61 74 20 50 31 20 69 73 0a 2a  ble that P1 is.*
1d8f0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
1d900 54 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20  The update hook 
1d910 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c  will be invoked,
1d920 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 2a   if it exists..*
1d930 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  * If P4 is not N
1d940 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 50 31 20  ULL then the P1 
1d950 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
1d960 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64   been positioned
1d970 0a 2a 2a 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74  .** using OP_Not
1d980 46 6f 75 6e 64 20 70 72 69 6f 72 20 74 6f 20 69  Found prior to i
1d990 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 6f 70 63  nvoking this opc
1d9a0 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
1d9b0 44 65 6c 65 74 65 3a 20 7b 0a 20 20 69 6e 74 20  Delete: {.  int 
1d9c0 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  i = pOp->p1;.  i
1d9d0 36 34 20 69 4b 65 79 3b 0a 20 20 56 64 62 65 43  64 iKey;.  VdbeC
1d9e0 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73  ursor *pC;..  as
1d9f0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
1da00 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1da10 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
1da20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
1da30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1da40 43 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  C->pCursor!=0 );
1da50 20 20 2f 2a 20 4f 6e 6c 79 20 76 61 6c 69 64 20    /* Only valid 
1da60 66 6f 72 20 72 65 61 6c 20 74 61 62 6c 65 73 2c  for real tables,
1da70 20 6e 6f 20 70 73 65 75 64 6f 74 61 62 6c 65 73   no pseudotables
1da80 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
1da90 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c   update-hook wil
1daa0 6c 20 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65  l be invoked, se
1dab0 74 20 69 4b 65 79 20 74 6f 20 74 68 65 20 72 6f  t iKey to the ro
1dac0 77 69 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  wid of the.  ** 
1dad0 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65  row being delete
1dae0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  d..  */.  if( db
1daf0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
1db00 6b 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 20 29  k && pOp->p4.z )
1db10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1db20 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
1db30 20 61 73 73 65 72 74 28 20 70 43 2d 3e 72 6f 77   assert( pC->row
1db40 69 64 49 73 56 61 6c 69 64 20 29 3b 20 20 2f 2a  idIsValid );  /*
1db50 20 6c 61 73 74 52 6f 77 69 64 20 73 65 74 20 62   lastRowid set b
1db60 79 20 70 72 65 76 69 6f 75 73 20 4f 50 5f 4e 6f  y previous OP_No
1db70 74 46 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 69 4b  tFound */.    iK
1db80 65 79 20 3d 20 70 43 2d 3e 6c 61 73 74 52 6f 77  ey = pC->lastRow
1db90 69 64 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  id;.  }..  rc = 
1dba0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
1dbb0 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69  rMoveto(pC);.  i
1dbc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1dbd0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1dbe0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1dbf0 74 72 65 65 44 65 6c 65 74 65 28 70 43 2d 3e 70  treeDelete(pC->p
1dc00 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 2d 3e 6e  Cursor);.  pC->n
1dc10 65 78 74 52 6f 77 69 64 56 61 6c 69 64 20 3d 20  extRowidValid = 
1dc20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
1dc30 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
1dc40 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  LE;..  /* Invoke
1dc50 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
1dc60 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
1dc70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dc80 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 78 55 70 64  E_OK && db->xUpd
1dc90 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20 70  ateCallback && p
1dca0 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20 20  Op->p4.z ){.    
1dcb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1dcc0 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
1dcd0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
1dce0 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
1dcf0 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
1dd00 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
1dd10 61 63 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41  ack(db->pUpdateA
1dd20 72 67 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  rg, SQLITE_DELET
1dd30 45 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  E, zDb, zTbl, iK
1dd40 65 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ey);.    assert(
1dd50 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20   pC->iDb>=0 );. 
1dd60 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32   }.  if( pOp->p2
1dd70 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
1dd80 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b  E ) p->nChange++
1dd90 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1dda0 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f   Opcode: ResetCo
1ddb0 75 6e 74 20 50 31 20 2a 20 2a 0a 2a 2a 0a 2a 2a  unt P1 * *.**.**
1ddc0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 73   This opcode res
1ddd0 65 74 73 20 74 68 65 20 56 4d 73 20 69 6e 74 65  ets the VMs inte
1dde0 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e  rnal change coun
1ddf0 74 65 72 20 74 6f 20 30 2e 20 49 66 20 50 31 20  ter to 0. If P1 
1de00 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
1de10 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1de20 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1de30 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
1de40 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1de50 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e  e.** change coun
1de60 74 65 72 20 28 72 65 74 75 72 6e 65 64 20 62 79  ter (returned by
1de70 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1de80 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 68 61  s to sqlite3_cha
1de90 6e 67 65 73 28 29 29 0a 2a 2a 20 62 65 66 6f 72  nges()).** befor
1dea0 65 20 69 74 20 69 73 20 72 65 73 65 74 2e 20 54  e it is reset. T
1deb0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
1dec0 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
1ded0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65  .*/.case OP_Rese
1dee0 74 43 6f 75 6e 74 3a 20 7b 0a 20 20 69 66 28 20  tCount: {.  if( 
1def0 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73  pOp->p1 ){.    s
1df00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
1df10 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
1df20 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  nge);.  }.  p->n
1df30 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72  Change = 0;.  br
1df40 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1df50 65 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50 32  e: RowData P1 P2
1df60 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69   * * *.**.** Wri
1df70 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  te into register
1df80 20 50 32 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   P2 the complete
1df90 20 72 6f 77 20 64 61 74 61 20 66 6f 72 20 63 75   row data for cu
1dfa0 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65 72  rsor P1..** Ther
1dfb0 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72 65  e is no interpre
1dfc0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
1dfd0 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20 6a  ta.  .** It is j
1dfe0 75 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f 20  ust copied onto 
1dff0 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  the P2 register 
1e000 65 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20 69  exactly as .** i
1e010 74 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  t is found in th
1e020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e030 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31  .**.** If the P1
1e040 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20   cursor must be 
1e050 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
1e060 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e  lid row (not a N
1e070 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61  ULL row).** of a
1e080 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74   real table, not
1e090 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e   a pseudo-table.
1e0a0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .*/./* Opcode: R
1e0b0 6f 77 4b 65 79 20 50 31 20 50 32 20 2a 20 2a 20  owKey P1 P2 * * 
1e0c0 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  *.**.** Write in
1e0d0 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74  to register P2 t
1e0e0 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f 77 20  he complete row 
1e0f0 6b 65 79 20 66 6f 72 20 63 75 72 73 6f 72 20 50  key for cursor P
1e100 31 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6e  1..** There is n
1e110 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e  o interpretation
1e120 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20 0a   of the data.  .
1e130 2a 2a 20 54 68 65 20 6b 65 79 20 69 73 20 63 6f  ** The key is co
1e140 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50 33  pied onto the P3
1e150 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74 6c   register exactl
1e160 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20 66  y as .** it is f
1e170 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
1e180 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e190 20 49 66 20 74 68 65 20 50 31 20 63 75 72 73 6f   If the P1 curso
1e1a0 72 20 6d 75 73 74 20 62 65 20 70 6f 69 6e 74 69  r must be pointi
1e1b0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
1e1c0 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f  w (not a NULL ro
1e1d0 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20  w).** of a real 
1e1e0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65  table, not a pse
1e1f0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  udo-table..*/.ca
1e200 73 65 20 4f 50 5f 52 6f 77 4b 65 79 3a 0a 63 61  se OP_RowKey:.ca
1e210 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20 7b  se OP_RowData: {
1e220 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e  .  int i = pOp->
1e230 70 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p1;.  VdbeCursor
1e240 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
1e250 20 2a 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e   *pCrsr;.  u32 n
1e260 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e  ;..  pOut = &p->
1e270 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 0a  aMem[pOp->p2];..
1e280 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 52    /* Note that R
1e290 6f 77 4b 65 79 20 61 6e 64 20 52 6f 77 44 61 74  owKey and RowDat
1e2a0 61 20 61 72 65 20 72 65 61 6c 6c 79 20 65 78 61  a are really exa
1e2b0 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 69 6e  ctly the same in
1e2c0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 61  struction */.  a
1e2d0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
1e2e0 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1e2f0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69   pC = p->apCsr[i
1e300 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ];.  assert( pC-
1e310 3e 69 73 54 61 62 6c 65 20 7c 7c 20 70 4f 70 2d  >isTable || pOp-
1e320 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 4b  >opcode==OP_RowK
1e330 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
1e340 70 43 2d 3e 69 73 49 6e 64 65 78 20 7c 7c 20 70  pC->isIndex || p
1e350 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
1e360 6f 77 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  owData );.  asse
1e370 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
1e380 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52  ssert( pC->nullR
1e390 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
1e3a0 74 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  t( pC->pseudoTab
1e3b0 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le==0 );.  asser
1e3c0 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72 21 3d  t( pC->pCursor!=
1e3d0 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  0 );.  pCrsr = p
1e3e0 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 72 63  C->pCursor;.  rc
1e3f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1e400 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a  rsorMoveto(pC);.
1e410 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1e420 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1e430 6f 72 3b 0a 20 20 69 66 28 20 70 43 2d 3e 69 73  or;.  if( pC->is
1e440 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 36 34  Index ){.    i64
1e450 20 6e 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74   n64;.    assert
1e460 28 20 21 70 43 2d 3e 69 73 54 61 62 6c 65 20 29  ( !pC->isTable )
1e470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e480 65 65 4b 65 79 53 69 7a 65 28 70 43 72 73 72 2c  eeKeySize(pCrsr,
1e490 20 26 6e 36 34 29 3b 0a 20 20 20 20 69 66 28 20   &n64);.    if( 
1e4a0 6e 36 34 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  n64>db->aLimit[S
1e4b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
1e4c0 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  TH] ){.      got
1e4d0 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20 7d  o too_big;.    }
1e4e0 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 6e 36  .    n = (int)n6
1e4f0 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
1e500 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1e510 53 69 7a 65 28 70 43 72 73 72 2c 20 26 6e 29 3b  Size(pCrsr, &n);
1e520 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 6e 3e  .    if( (int)n>
1e530 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
1e540 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20  E_LIMIT_LENGTH] 
1e550 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 6f  ){.      goto to
1e560 6f 5f 62 69 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  o_big;.    }.  }
1e570 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
1e580 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
1e590 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  n, 0) ){.    got
1e5a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
1e5b0 70 4f 75 74 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 4d  pOut->n = n;.  M
1e5c0 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
1e5d0 75 74 2c 20 4d 45 4d 5f 42 6c 6f 62 29 3b 0a 20  ut, MEM_Blob);. 
1e5e0 20 69 66 28 20 70 43 2d 3e 69 73 49 6e 64 65 78   if( pC->isIndex
1e5f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e600 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 72  ite3BtreeKey(pCr
1e610 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 2d 3e  sr, 0, n, pOut->
1e620 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1e630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e640 65 65 44 61 74 61 28 70 43 72 73 72 2c 20 30 2c  eeData(pCrsr, 0,
1e650 20 6e 2c 20 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20   n, pOut->z);.  
1e660 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  }.  pOut->enc = 
1e670 53 51 4c 49 54 45 5f 55 54 46 38 3b 20 20 2f 2a  SQLITE_UTF8;  /*
1e680 20 49 6e 20 63 61 73 65 20 74 68 65 20 62 6c 6f   In case the blo
1e690 62 20 69 73 20 65 76 65 72 20 63 61 73 74 20 74  b is ever cast t
1e6a0 6f 20 74 65 78 74 20 2a 2f 0a 20 20 55 50 44 41  o text */.  UPDA
1e6b0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
1e6c0 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
1e6d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
1e6e0 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  wid P1 P2 * * *.
1e6f0 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72  **.** Store in r
1e700 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
1e710 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1e720 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61  he key of the ta
1e730 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a  ble entry that.*
1e740 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  * P1 is currentl
1e750 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2f 0a 63  y point to..*/.c
1e760 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20 7b 20  ase OP_Rowid: { 
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
1e790 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  se */.  int i = 
1e7a0 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43  pOp->p1;.  VdbeC
1e7b0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34  ursor *pC;.  i64
1e7c0 20 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   v;..  assert( i
1e7d0 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72  >=0 && i<p->nCur
1e7e0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
1e7f0 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73  >apCsr[i];.  ass
1e800 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1e810 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
1e820 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29  CursorMoveto(pC)
1e830 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1e840 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1e850 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 43 2d 3e  rror;.  if( pC->
1e860 72 6f 77 69 64 49 73 56 61 6c 69 64 20 29 7b 0a  rowidIsValid ){.
1e870 20 20 20 20 76 20 3d 20 70 43 2d 3e 6c 61 73 74      v = pC->last
1e880 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 20 69  Rowid;.  }else i
1e890 66 28 20 70 43 2d 3e 70 73 65 75 64 6f 54 61 62  f( pC->pseudoTab
1e8a0 6c 65 20 29 7b 0a 20 20 20 20 76 20 3d 20 6b 65  le ){.    v = ke
1e8b0 79 54 6f 49 6e 74 28 70 43 2d 3e 69 4b 65 79 29  yToInt(pC->iKey)
1e8c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
1e8d0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
1e8e0 20 2f 2a 20 4c 65 61 76 65 20 74 68 65 20 72 6f   /* Leave the ro
1e8f0 77 69 64 20 73 65 74 20 74 6f 20 61 20 4e 55 4c  wid set to a NUL
1e900 4c 20 2a 2f 0a 20 20 20 20 62 72 65 61 6b 3b 0a  L */.    break;.
1e910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1e920 65 72 74 28 20 70 43 2d 3e 70 43 75 72 73 6f 72  ert( pC->pCursor
1e930 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
1e940 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1e950 43 2d 3e 70 43 75 72 73 6f 72 2c 20 26 76 29 3b  C->pCursor, &v);
1e960 0a 20 20 20 20 76 20 3d 20 6b 65 79 54 6f 49 6e  .    v = keyToIn
1e970 74 28 76 29 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  t(v);.  }.  pOut
1e980 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 4d 65 6d  ->u.i = v;.  Mem
1e990 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
1e9a0 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
1e9b0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1e9c0 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20 2a 20  e: NullRow P1 * 
1e9d0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65  * * *.**.** Move
1e9e0 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 74   the cursor P1 t
1e9f0 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20 20 41  o a null row.  A
1ea00 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 65  ny OP_Column ope
1ea10 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  rations.** that 
1ea20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68 65 20  occur while the 
1ea30 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74 68 65  cursor is on the
1ea40 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c 20 61   null row will a
1ea50 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65 20 61  lways.** write a
1ea60 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
1ea70 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20 20 69  P_NullRow: {.  i
1ea80 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  nt i = pOp->p1;.
1ea90 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1eaa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
1eab0 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
1eac0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
1ead0 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65 72  pCsr[i];.  asser
1eae0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43  t( pC!=0 );.  pC
1eaf0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
1eb00 20 70 43 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69   pC->rowidIsVali
1eb10 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 2d  d = 0;.  if( pC-
1eb20 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
1eb30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1eb40 72 43 75 72 73 6f 72 28 70 43 2d 3e 70 43 75 72  rCursor(pC->pCur
1eb50 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  sor);.  }.  brea
1eb60 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
1eb70 20 4c 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20   Last P1 P2 * * 
1eb80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
1eb90 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69   use of the Rowi
1eba0 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e  d or Column or N
1ebb0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
1ebc0 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20  for P1 .** will 
1ebd0 72 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73  refer to the las
1ebe0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1ebf0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
1ec00 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
1ec10 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1ec20 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32   is empty and P2
1ec30 3e 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d  >0, then jump im
1ec40 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
1ec50 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f  .** If P2 is 0 o
1ec60 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f  r if the table o
1ec70 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
1ec80 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
1ec90 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c  gh.** to the fol
1eca0 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69  lowing instructi
1ecb0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c  on..*/.case OP_L
1ecc0 61 73 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ast: {        /*
1ecd0 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 69   jump */.  int i
1ece0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64   = pOp->p1;.  Vd
1ecf0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
1ed00 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
1ed10 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
1ed20 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
1ed30 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1ed40 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69   pC = p->apCsr[i
1ed50 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
1ed60 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  =0 );.  pCrsr = 
1ed70 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61  pC->pCursor;.  a
1ed80 73 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20  ssert( pCrsr!=0 
1ed90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1eda0 33 42 74 72 65 65 4c 61 73 74 28 70 43 72 73 72  3BtreeLast(pCrsr
1edb0 2c 20 26 72 65 73 29 3b 0a 20 20 70 43 2d 3e 6e  , &res);.  pC->n
1edc0 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
1edd0 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
1ede0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
1edf0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
1ee00 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
1ee10 66 28 20 72 65 73 20 26 26 20 70 4f 70 2d 3e 70  f( res && pOp->p
1ee20 32 3e 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  2>0 ){.    pc = 
1ee30 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d  pOp->p2 - 1;.  }
1ee40 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
1ee50 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 20 50 31   Opcode: Sort P1
1ee60 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
1ee70 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  This opcode does
1ee80 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
1ee90 65 20 74 68 69 6e 67 20 61 73 20 4f 50 5f 52 65  e thing as OP_Re
1eea0 77 69 6e 64 20 65 78 63 65 70 74 20 74 68 61 74  wind except that
1eeb0 0a 2a 2a 20 69 74 20 69 6e 63 72 65 6d 65 6e 74  .** it increment
1eec0 73 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  s an undocumente
1eed0 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  d global variabl
1eee0 65 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  e used for testi
1eef0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e  ng..**.** Sortin
1ef00 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
1ef10 64 20 62 79 20 77 72 69 74 69 6e 67 20 72 65 63  d by writing rec
1ef20 6f 72 64 73 20 69 6e 74 6f 20 61 20 73 6f 72 74  ords into a sort
1ef30 69 6e 67 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68  ing index,.** th
1ef40 65 6e 20 72 65 77 69 6e 64 69 6e 67 20 74 68 61  en rewinding tha
1ef50 74 20 69 6e 64 65 78 20 61 6e 64 20 70 6c 61 79  t index and play
1ef60 69 6e 67 20 69 74 20 62 61 63 6b 20 66 72 6f 6d  ing it back from
1ef70 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a   beginning to.**
1ef80 20 65 6e 64 2e 20 20 57 65 20 75 73 65 20 74 68   end.  We use th
1ef90 65 20 4f 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65  e OP_Sort opcode
1efa0 20 69 6e 73 74 65 61 64 20 6f 66 20 4f 50 5f 52   instead of OP_R
1efb0 65 77 69 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a  ewind to do the.
1efc0 2a 2a 20 72 65 77 69 6e 64 69 6e 67 20 73 6f 20  ** rewinding so 
1efd0 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
1efe0 76 61 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65  variable will be
1eff0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 61 6e 64   incremented and
1f000 0a 2a 2a 20 72 65 67 72 65 73 73 69 6f 6e 20 74  .** regression t
1f010 65 73 74 73 20 63 61 6e 20 64 65 74 65 72 6d 69  ests can determi
1f020 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
1f030 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  t the optimizer 
1f040 69 73 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  is.** correctly 
1f050 6f 70 74 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73  optimizing out s
1f060 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  orts..*/.case OP
1f070 5f 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20  _Sort: {        
1f080 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65  /* jump */.#ifde
1f090 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1f0a0 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
1f0b0 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt++;.  sqlite3_
1f0c0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a  search_count--;.
1f0d0 23 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75  #endif.  p->aCou
1f0e0 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54  nter[SQLITE_STMT
1f0f0 53 54 41 54 55 53 5f 53 4f 52 54 2d 31 5d 2b 2b  STATUS_SORT-1]++
1f100 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ;.  /* Fall thro
1f110 75 67 68 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69  ugh into OP_Rewi
1f120 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64  nd */.}./* Opcod
1f130 65 3a 20 52 65 77 69 6e 64 20 50 31 20 50 32 20  e: Rewind P1 P2 
1f140 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  * * *.**.** The 
1f150 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65 20  next use of the 
1f160 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20  Rowid or Column 
1f170 6f 72 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  or Next instruct
1f180 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77  ion for P1 .** w
1f190 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68 65  ill refer to the
1f1a0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1f1b0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
1f1c0 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20  le or index..** 
1f1d0 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  If the table or 
1f1e0 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 61  index is empty a
1f1f0 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75  nd P2>0, then ju
1f200 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
1f210 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69  o P2..** If P2 i
1f220 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74 61  s 0 or if the ta
1f230 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
1f240 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20  not empty, fall 
1f250 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
1f260 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
1f270 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
1f280 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20   OP_Rewind: {   
1f290 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
1f2a0 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e 70    int i = pOp->p
1f2b0 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  1;.  VdbeCursor 
1f2c0 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
1f2d0 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
1f2e0 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  s;..  assert( i>
1f2f0 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73  =0 && i<p->nCurs
1f300 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1f310 61 70 43 73 72 5b 69 5d 3b 0a 20 20 61 73 73 65  apCsr[i];.  asse
1f320 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 69  rt( pC!=0 );.  i
1f330 66 28 20 28 70 43 72 73 72 20 3d 20 70 43 2d 3e  f( (pCrsr = pC->
1f340 70 43 75 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20  pCursor)!=0 ){. 
1f350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f360 74 72 65 65 46 69 72 73 74 28 70 43 72 73 72 2c  treeFirst(pCrsr,
1f370 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e   &res);.    pC->
1f380 61 74 46 69 72 73 74 20 3d 20 72 65 73 3d 3d 30  atFirst = res==0
1f390 20 3f 31 3a 30 3b 0a 20 20 20 20 70 43 2d 3e 64   ?1:0;.    pC->d
1f3a0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
1f3b0 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
1f3c0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
1f3d0 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TALE;.  }else{. 
1f3e0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d 0a     res = 1;.  }.
1f3f0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
1f400 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72  (u8)res;.  asser
1f410 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  t( pOp->p2>0 && 
1f420 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29  pOp->p2<p->nOp )
1f430 3b 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  ;.  if( res ){. 
1f440 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
1f450 2d 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  - 1;.  }.  break
1f460 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1f470 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Next P1 P2 * * *
1f480 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63  .**.** Advance c
1f490 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1f4a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
1f4b0 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20  e next key/data 
1f4c0 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74  pair in its.** t
1f4d0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20  able or index.  
1f4e0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1f4f0 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70  more key/value p
1f500 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74  airs then fall t
1f510 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
1f520 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
1f530 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20  uction.  But if 
1f540 74 68 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e  the cursor advan
1f550 63 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ce was successfu
1f560 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64  l,.** jump immed
1f570 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
1f580 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
1f590 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
1f5a0 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
1f5b0 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
1f5c0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1f5d0 50 72 65 76 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  Prev.*/./* Opcod
1f5e0 65 3a 20 50 72 65 76 20 50 31 20 50 32 20 2a 20  e: Prev P1 P2 * 
1f5f0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75  * *.**.** Back u
1f600 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  p cursor P1 so t
1f610 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1f620 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
1f630 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20 69  y/data pair in i
1f640 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  ts.** table or i
1f650 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65 20  ndex.  If there 
1f660 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b  is no previous k
1f670 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74  ey/value pairs t
1f680 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1f690 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
1f6a0 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
1f6b0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75  .  But if the cu
1f6c0 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61 73 20  rsor backup was 
1f6d0 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a  successful,.** j
1f6e0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
1f6f0 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  to P2..**.** The
1f700 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
1f710 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61  be for a real ta
1f720 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
1f730 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65  o-table..*/.case
1f740 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20 20   OP_Prev:       
1f750 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
1f760 73 65 20 4f 50 5f 4e 65 78 74 3a 20 7b 20 20 20  se OP_Next: {   
1f770 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
1f780 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1f790 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
1f7a0 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rsr;.  int res;.
1f7b0 0a 20 20 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54  .  CHECK_FOR_INT
1f7c0 45 52 52 55 50 54 3b 0a 20 20 61 73 73 65 72 74  ERRUPT;.  assert
1f7d0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1f7e0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1f7f0 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
1f800 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1f810 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 0a 20    if( pC==0 ){. 
1f820 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 53 65     break;  /* Se
1f830 65 20 74 69 63 6b 65 74 20 23 32 32 37 33 20 2a  e ticket #2273 *
1f840 2f 0a 20 20 7d 0a 20 20 70 43 72 73 72 20 3d 20  /.  }.  pCrsr = 
1f850 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 61  pC->pCursor;.  a
1f860 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a  ssert( pCrsr );.
1f870 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 61 73 73    res = 1;.  ass
1f880 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
1f890 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
1f8a0 72 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  rc = pOp->opcode
1f8b0 3d 3d 4f 50 5f 4e 65 78 74 20 3f 20 73 71 6c 69  ==OP_Next ? sqli
1f8c0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 72  te3BtreeNext(pCr
1f8d0 73 72 2c 20 26 72 65 73 29 20 3a 0a 20 20 20 20  sr, &res) :.    
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f900 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
1f910 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 70  Crsr, &res);.  p
1f920 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38  C->nullRow = (u8
1f930 29 72 65 73 3b 0a 20 20 70 43 2d 3e 63 61 63 68  )res;.  pC->cach
1f940 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
1f950 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 72 65 73  STALE;.  if( res
1f960 3d 3d 30 20 29 7b 0a 20 20 20 20 70 63 20 3d 20  ==0 ){.    pc = 
1f970 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20  pOp->p2 - 1;.   
1f980 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 20 70   if( pOp->p5 ) p
1f990 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e  ->aCounter[pOp->
1f9a0 70 35 2d 31 5d 2b 2b 3b 0a 23 69 66 64 65 66 20  p5-1]++;.#ifdef 
1f9b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
1f9c0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
1f9d0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
1f9e0 20 7d 0a 20 20 70 43 2d 3e 72 6f 77 69 64 49 73   }.  pC->rowidIs
1f9f0 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 62 72 65  Valid = 0;.  bre
1fa00 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1fa10 3a 20 49 64 78 49 6e 73 65 72 74 20 50 31 20 50  : IdxInsert P1 P
1fa20 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52  2 P3 * *.**.** R
1fa30 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73  egister P2 holds
1fa40 20 61 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79   a SQL index key
1fa50 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a   made using the.
1fa60 2a 2a 20 4d 61 6b 65 49 64 78 52 65 63 20 69 6e  ** MakeIdxRec in
1fa70 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69  structions.  Thi
1fa80 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20  s opcode writes 
1fa90 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f  that key.** into
1faa0 20 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20   the index P1.  
1fab0 44 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74  Data for the ent
1fac0 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a  ry is nil..**.**
1fad0 20 50 33 20 69 73 20 61 20 66 6c 61 67 20 74 68   P3 is a flag th
1fae0 61 74 20 70 72 6f 76 69 64 65 73 20 61 20 68 69  at provides a hi
1faf0 6e 74 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65  nt to the b-tree
1fb00 20 6c 61 79 65 72 20 74 68 61 74 20 74 68 69 73   layer that this
1fb10 0a 2a 2a 20 69 6e 73 65 72 74 20 69 73 20 6c 69  .** insert is li
1fb20 6b 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70  kely to be an ap
1fb30 70 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pend..**.** This
1fb40 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c   instruction onl
1fb50 79 20 77 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69  y works for indi
1fb60 63 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61  ces.  The equiva
1fb70 6c 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  lent instruction
1fb80 0a 2a 2a 20 66 6f 72 20 74 61 62 6c 65 73 20 69  .** for tables i
1fb90 73 20 4f 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a  s OP_Insert..*/.
1fba0 63 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65 72  case OP_IdxInser
1fbb0 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69  t: {        /* i
1fbc0 6e 32 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  n2 */.  int i = 
1fbd0 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64 62 65 43  pOp->p1;.  VdbeC
1fbe0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
1fbf0 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
1fc00 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
1fc10 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  i<p->nCursor );.
1fc20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
1fc30 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 61 73  sr[i]!=0 );.  as
1fc40 73 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c 61 67  sert( pIn2->flag
1fc50 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
1fc60 20 20 69 66 28 20 28 70 43 72 73 72 20 3d 20 28    if( (pCrsr = (
1fc70 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
1fc80 29 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30 20 29  )->pCursor)!=0 )
1fc90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1fca0 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
1fcb0 20 20 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42      rc = ExpandB
1fcc0 6c 6f 62 28 70 49 6e 32 29 3b 0a 20 20 20 20 69  lob(pIn2);.    i
1fcd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fce0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   ){.      int nK
1fcf0 65 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20  ey = pIn2->n;.  
1fd00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1fd10 7a 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a  zKey = pIn2->z;.
1fd20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fd30 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70 43  e3BtreeInsert(pC
1fd40 72 73 72 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 2c  rsr, zKey, nKey,
1fd50 20 22 22 2c 20 30 2c 20 30 2c 20 70 4f 70 2d 3e   "", 0, 0, pOp->
1fd60 70 33 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  p3);.      asser
1fd70 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  t( pC->deferredM
1fd80 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  oveto==0 );.    
1fd90 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
1fda0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
1fdb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
1fdc0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1fdd0 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20 50  : IdxDelete P1 P
1fde0 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
1fdf0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50 33  he content of P3
1fe00 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
1fe10 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72 20  ing at register 
1fe20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75 6e  P2 form.** an un
1fe30 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1fe40 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65  . This opcode re
1fe50 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72 79  moves that entry
1fe60 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69 6e   from the .** in
1fe70 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63 75  dex opened by cu
1fe80 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73 65  rsor P1..*/.case
1fe90 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20 7b   OP_IdxDelete: {
1fea0 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70 2d 3e  .  int i = pOp->
1feb0 70 31 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p1;.  VdbeCursor
1fec0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
1fed0 20 2a 70 43 72 73 72 3b 0a 20 20 61 73 73 65 72   *pCrsr;.  asser
1fee0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
1fef0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1ff00 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70  2>0 && pOp->p2+p
1ff10 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
1ff20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  );.  assert( i>=
1ff30 30 20 26 26 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  0 && i<p->nCurso
1ff40 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1ff50 2d 3e 61 70 43 73 72 5b 69 5d 21 3d 30 20 29 3b  ->apCsr[i]!=0 );
1ff60 0a 20 20 69 66 28 20 28 70 43 72 73 72 20 3d 20  .  if( (pCrsr = 
1ff70 28 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  (pC = p->apCsr[i
1ff80 5d 29 2d 3e 70 43 75 72 73 6f 72 29 21 3d 30 20  ])->pCursor)!=0 
1ff90 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  ){.    int res;.
1ffa0 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f      UnpackedReco
1ffb0 72 64 20 72 3b 0a 20 20 20 20 72 2e 70 4b 65 79  rd r;.    r.pKey
1ffc0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
1ffd0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
1ffe0 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 33  d = (u16)pOp->p3
1fff0 3b 0a 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20  ;.    r.flags = 
20000 30 3b 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20  0;.    r.aMem = 
20010 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
20020 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
20030 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
20040 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 26 72  packed(pCrsr, &r
20050 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
20060 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20070 45 5f 4f 4b 20 26 26 20 72 65 73 3d 3d 30 20 29  E_OK && res==0 )
20080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20090 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
200a0 70 43 72 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pCrsr);.    }.  
200b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65    assert( pC->de
200c0 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20  ferredMoveto==0 
200d0 29 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  );.    pC->cache
200e0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
200f0 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 62 72 65 61  TALE;.  }.  brea
20100 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
20110 20 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20   IdxRowid P1 P2 
20120 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74  * * *.**.** Writ
20130 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
20140 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  P2 an integer wh
20150 69 63 68 20 69 73 20 74 68 65 20 6c 61 73 74 20  ich is the last 
20160 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 63  entry in the rec
20170 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ord at.** the en
20180 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
20190 65 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ey pointed to by
201a0 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69   cursor P1.  Thi
201b0 73 20 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64  s integer should
201c0 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64   be.** the rowid
201d0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
201e0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69  try to which thi
201f0 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f  s index entry po
20200 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ints..**.** See 
20210 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b  also: Rowid, Mak
20220 65 49 64 78 52 65 63 2e 0a 2a 2f 0a 63 61 73 65  eIdxRec..*/.case
20230 20 4f 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20   OP_IdxRowid: { 
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20250 6f 75 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20  out2-prerelease 
20260 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 4f 70  */.  int i = pOp
20270 2d 3e 70 31 3b 0a 20 20 42 74 43 75 72 73 6f 72  ->p1;.  BtCursor
20280 20 2a 70 43 72 73 72 3b 0a 20 20 56 64 62 65 43   *pCrsr;.  VdbeC
20290 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73  ursor *pC;..  as
202a0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
202b0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
202c0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
202d0 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]!=0 );.  if( 
202e0 28 70 43 72 73 72 20 3d 20 28 70 43 20 3d 20 70  (pCrsr = (pC = p
202f0 2d 3e 61 70 43 73 72 5b 69 5d 29 2d 3e 70 43 75  ->apCsr[i])->pCu
20300 72 73 6f 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rsor)!=0 ){.    
20310 69 36 34 20 72 6f 77 69 64 3b 0a 0a 20 20 20 20  i64 rowid;..    
20320 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
20330 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
20340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
20350 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  >isTable==0 );. 
20360 20 20 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c     if( !pC->null
20370 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Row ){.      rc 
20380 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
20390 52 6f 77 69 64 28 70 43 72 73 72 2c 20 26 72 6f  Rowid(pCrsr, &ro
203a0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
203b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
203c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
203d0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
203e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
203f0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
20400 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  Out, MEM_Int);. 
20410 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d       pOut->u.i =
20420 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20   rowid;.    }.  
20430 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
20440 20 4f 70 63 6f 64 65 3a 20 49 64 78 47 45 20 50   Opcode: IdxGE P
20450 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
20460 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
20470 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
20480 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
20490 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
204a0 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
204b0 20 6f 6d 69 74 73 20 74 68 65 20 52 4f 57 49 44   omits the ROWID
204c0 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20  .  Compare this 
204d0 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73  key value agains
204e0 74 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  t the index .** 
204f0 74 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65  that P1 is curre
20500 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
20510 2c 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 52  , ignoring the R
20520 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69  OWID on the P1 i
20530 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
20540 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72  he P1 index entr
20550 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
20560 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
20570 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74  e key value.** t
20580 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20  hen jump to P2. 
20590 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
205a0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
205b0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
205c0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
205d0 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
205e0 65 20 6b 65 79 20 76 61 6c 75 65 20 69 73 20 69  e key value is i
205f0 6e 63 72 65 61 73 65 64 20 62 79 20 61 6e 20 65  ncreased by an e
20600 70 73 69 6c 6f 6e 20 0a 2a 2a 20 70 72 69 6f 72  psilon .** prior
20610 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   to the comparis
20620 6f 6e 2e 20 20 54 68 69 73 20 6d 61 6b 65 20 74  on.  This make t
20630 68 65 20 6f 70 63 6f 64 65 20 77 6f 72 6b 20 6c  he opcode work l
20640 69 6b 65 20 49 64 78 47 54 20 65 78 63 65 70 74  ike IdxGT except
20650 0a 2a 2a 20 74 68 61 74 20 69 66 20 74 68 65 20  .** that if the 
20660 6b 65 79 20 66 72 6f 6d 20 72 65 67 69 73 74 65  key from registe
20670 72 20 50 33 20 69 73 20 61 20 70 72 65 66 69 78  r P3 is a prefix
20680 20 6f 66 20 74 68 65 20 6b 65 79 20 69 6e 20 74   of the key in t
20690 68 65 20 63 75 72 73 6f 72 2c 0a 2a 2a 20 74 68  he cursor,.** th
206a0 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c 73  e result is fals
206b0 65 20 77 68 65 72 65 61 73 20 69 74 20 77 6f 75  e whereas it wou
206c0 6c 64 20 62 65 20 74 72 75 65 20 77 69 74 68 20  ld be true with 
206d0 49 64 78 47 54 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  IdxGT..*/./* Opc
206e0 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20 50 32  ode: IdxLT P1 P2
206f0 20 50 33 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20 54   P3 * P5.**.** T
20700 68 65 20 50 34 20 72 65 67 69 73 74 65 72 20 76  he P4 register v
20710 61 6c 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  alues beginning 
20720 77 69 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20  with P3 form an 
20730 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a  unpacked index .
20740 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74  ** key that omit
20750 73 20 74 68 65 20 52 4f 57 49 44 2e 20 20 43 6f  s the ROWID.  Co
20760 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20 76  mpare this key v
20770 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68 65  alue against the
20780 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74 20   index .** that 
20790 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
207a0 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e  pointing to, ign
207b0 6f 72 69 6e 67 20 74 68 65 20 52 4f 57 49 44 20  oring the ROWID 
207c0 6f 6e 20 74 68 65 20 50 31 20 69 6e 64 65 78 2e  on the P1 index.
207d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31  .**.** If the P1
207e0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20   index entry is 
207f0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65  less than the ke
20800 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d  y value then jum
20810 70 20 74 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65  p to P2..** Othe
20820 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75  rwise fall throu
20830 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  gh to the next i
20840 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
20850 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 6e 2d 7a  * If P5 is non-z
20860 65 72 6f 20 74 68 65 6e 20 74 68 65 20 6b 65 79  ero then the key
20870 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
20880 73 65 64 20 62 79 20 61 6e 20 65 70 73 69 6c 6f  sed by an epsilo
20890 6e 20 70 72 69 6f 72 20 0a 2a 2a 20 74 6f 20 74  n prior .** to t
208a0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
208b0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 20 6f  This makes the o
208c0 70 63 6f 64 65 20 77 6f 72 6b 20 6c 69 6b 65 20  pcode work like 
208d0 49 64 78 4c 45 2e 0a 2a 2f 0a 63 61 73 65 20 4f  IdxLE..*/.case O
208e0 50 5f 49 64 78 4c 54 3a 20 20 20 20 20 20 20 20  P_IdxLT:        
208f0 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
20900 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 45 3a  /.case OP_IdxGE:
20910 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
20920 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  p, in3 */.  int 
20930 69 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 56 64  i= pOp->p1;.  Vd
20940 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a 20  beCursor *pC;.. 
20950 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
20960 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b   i<p->nCursor );
20970 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
20980 43 73 72 5b 69 5d 21 3d 30 20 29 3b 0a 20 20 69  Csr[i]!=0 );.  i
20990 66 28 20 28 70 43 20 3d 20 70 2d 3e 61 70 43 73  f( (pC = p->apCs
209a0 72 5b 69 5d 29 2d 3e 70 43 75 72 73 6f 72 21 3d  r[i])->pCursor!=
209b0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  0 ){.    int res
209c0 3b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  ;.    UnpackedRe
209d0 63 6f 72 64 20 72 3b 0a 20 20 20 20 61 73 73 65  cord r;.    asse
209e0 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
209f0 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 20  Moveto==0 );.   
20a00 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
20a10 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ==0 || pOp->p5==
20a20 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
20a30 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
20a40 5f 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 72 2e  _INT32 );.    r.
20a50 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70  pKeyInfo = pC->p
20a60 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e  KeyInfo;.    r.n
20a70 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f 70  Field = (u16)pOp
20a80 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 69 66 28 20  ->p4.i;.    if( 
20a90 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20  pOp->p5 ){.     
20aa0 20 72 2e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43   r.flags = UNPAC
20ab0 4b 45 44 5f 49 4e 43 52 4b 45 59 20 7c 20 55 4e  KED_INCRKEY | UN
20ac0 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
20ad0 57 49 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  WID;.    }else{.
20ae0 20 20 20 20 20 20 72 2e 66 6c 61 67 73 20 3d 20        r.flags = 
20af0 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
20b00 52 4f 57 49 44 3b 0a 20 20 20 20 7d 0a 20 20 20  ROWID;.    }.   
20b10 20 72 2e 61 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d   r.aMem = &p->aM
20b20 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
20b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
20b40 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 70  eIdxKeyCompare(p
20b50 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20  C, &r, &res);.  
20b60 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
20b70 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20  e==OP_IdxLT ){. 
20b80 20 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b       res = -res;
20b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ba0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
20bb0 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20  pcode==OP_IdxGE 
20bc0 29 3b 0a 20 20 20 20 20 20 72 65 73 2b 2b 3b 0a  );.      res++;.
20bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
20be0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 63 20  s>0 ){.      pc 
20bf0 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 31 20 3b 0a  = pOp->p2 - 1 ;.
20c00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65 61      }.  }.  brea
20c10 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
20c20 20 44 65 73 74 72 6f 79 20 50 31 20 50 32 20 50   Destroy P1 P2 P
20c30 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  3 * *.**.** Dele
20c40 74 65 20 61 6e 20 65 6e 74 69 72 65 20 64 61 74  te an entire dat
20c50 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69  abase table or i
20c60 6e 64 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20  ndex whose root 
20c70 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
20c80 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
20c90 67 69 76 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a  given by P1..**.
20ca0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  ** The table bei
20cb0 6e 67 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  ng destroyed is 
20cc0 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
20cd0 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 33 3d  base file if P3=
20ce0 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31  =0.  If.** P3==1
20cf0 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
20d00 74 6f 20 62 65 20 63 6c 65 61 72 20 69 73 20 69  to be clear is i
20d10 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  n the auxiliary 
20d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
20d30 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
20d40 20 73 74 6f 72 65 20 74 61 62 6c 65 73 20 63 72   store tables cr
20d50 65 61 74 65 20 75 73 69 6e 67 20 43 52 45 41 54  eate using CREAT
20d60 45 20 54 45 4d 50 4f 52 41 52 59 20 54 41 42 4c  E TEMPORARY TABL
20d70 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f  E..**.** If AUTO
20d80 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65  VACUUM is enable
20d90 64 20 74 68 65 6e 20 69 74 20 69 73 20 70 6f 73  d then it is pos
20da0 73 69 62 6c 65 20 74 68 61 74 20 61 6e 6f 74 68  sible that anoth
20db0 65 72 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  er root page.** 
20dc0 6d 69 67 68 74 20 62 65 20 6d 6f 76 65 64 20 69  might be moved i
20dd0 6e 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 64 65  nto the newly de
20de0 6c 65 74 65 64 20 72 6f 6f 74 20 70 61 67 65 20  leted root page 
20df0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
20e00 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
20e10 65 73 20 63 6f 6e 74 69 67 75 6f 75 73 20 61 74  es contiguous at
20e20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
20e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
20e40 20 54 68 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76   The former.** v
20e50 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  alue of the root
20e60 20 70 61 67 65 20 74 68 61 74 20 6d 6f 76 65 64   page that moved
20e70 20 2d 20 69 74 73 20 76 61 6c 75 65 20 62 65 66   - its value bef
20e80 6f 72 65 20 74 68 65 20 6d 6f 76 65 20 6f 63 63  ore the move occ
20e90 75 72 72 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74  urred -.** is st
20ea0 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
20eb0 20 50 32 2e 20 20 49 66 20 6e 6f 20 70 61 67 65   P2.  If no page
20ec0 20 0a 2a 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61   .** movement wa
20ed0 73 20 72 65 71 75 69 72 65 64 20 28 62 65 63 61  s required (beca
20ee0 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 62 65  use the table be
20ef0 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61 73 20  ing dropped was 
20f00 61 6c 72 65 61 64 79 20 0a 2a 2a 20 74 68 65 20  already .** the 
20f10 6c 61 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20  last one in the 
20f20 64 61 74 61 62 61 73 65 29 20 74 68 65 6e 20 61  database) then a
20f30 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20   zero is stored 
20f40 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
20f50 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
20f60 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65   is disabled the
20f70 6e 20 61 20 7a 65 72 6f 20 69 73 20 73 74 6f 72  n a zero is stor
20f80 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
20f90 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  2..**.** See als
20fa0 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65  o: Clear.*/.case
20fb0 20 4f 50 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20   OP_Destroy: {  
20fc0 20 20 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65     /* out2-prere
20fd0 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lease */.  int i
20fe0 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 43 6e  Moved;.  int iCn
20ff0 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
21000 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
21010 42 4c 45 0a 20 20 56 64 62 65 20 2a 70 56 64 62  BLE.  Vdbe *pVdb
21020 65 3b 0a 20 20 69 43 6e 74 20 3d 20 30 3b 0a 20  e;.  iCnt = 0;. 
21030 20 66 6f 72 28 70 56 64 62 65 3d 64 62 2d 3e 70   for(pVdbe=db->p
21040 56 64 62 65 3b 20 70 56 64 62 65 3b 20 70 56 64  Vdbe; pVdbe; pVd
21050 62 65 3d 70 56 64 62 65 2d 3e 70 4e 65 78 74 29  be=pVdbe->pNext)
21060 7b 0a 20 20 20 20 69 66 28 20 70 56 64 62 65 2d  {.    if( pVdbe-
21070 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
21080 49 43 5f 52 55 4e 20 26 26 20 70 56 64 62 65 2d  IC_RUN && pVdbe-
21090 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 3c 32 20  >inVtabMethod<2 
210a0 26 26 20 70 56 64 62 65 2d 3e 70 63 3e 3d 30 20  && pVdbe->pc>=0 
210b0 29 7b 0a 20 20 20 20 20 20 69 43 6e 74 2b 2b 3b  ){.      iCnt++;
210c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
210d0 0a 20 20 69 43 6e 74 20 3d 20 64 62 2d 3e 61 63  .  iCnt = db->ac
210e0 74 69 76 65 56 64 62 65 43 6e 74 3b 0a 23 65 6e  tiveVdbeCnt;.#en
210f0 64 69 66 0a 20 20 69 66 28 20 69 43 6e 74 3e 31  dif.  if( iCnt>1
21100 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
21110 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
21120 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
21130 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 7d 65 6c   OE_Abort;.  }el
21140 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  se{.    int iDb 
21150 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61  = pOp->p3;.    a
21160 73 73 65 72 74 28 20 69 43 6e 74 3d 3d 31 20 29  ssert( iCnt==1 )
21170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
21180 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31  ->btreeMask & (1
21190 3c 3c 69 44 62 29 29 21 3d 30 20 29 3b 0a 20 20  <<iDb))!=0 );.  
211a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
211b0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62 2d  reeDropTable(db-
211c0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 70  >aDb[iDb].pBt, p
211d0 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64 29  Op->p1, &iMoved)
211e0 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
211f0 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
21200 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  nt);.    pOut->u
21210 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 23 69 66  .i = iMoved;.#if
21220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21230 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
21240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21250 4b 20 26 26 20 69 4d 6f 76 65 64 21 3d 30 20 29  K && iMoved!=0 )
21260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
21270 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 26 64 62  ootPageMoved(&db
21280 2d 3e 61 44 62 5b 69 44 62 5d 2c 20 69 4d 6f 76  ->aDb[iDb], iMov
21290 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  ed, pOp->p1);.  
212a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
212b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
212c0 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20 50  code: Clear P1 P
212d0 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  2 P3.**.** Delet
212e0 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  e all contents o
212f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
21300 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68  able or index wh
21310 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ose root page.**
21320 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21330 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
21340 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c 69  y P1.  But, unli
21350 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20 6e  ke Destroy, do n
21360 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  ot.** remove the
21370 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
21380 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21390 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
213a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
213b0 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ear is in the ma
213c0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
213d0 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a 2a   if P2==0.  If.*
213e0 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68 65  * P2==1 then the
213f0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c 65   table to be cle
21400 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75 78  ar is in the aux
21410 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
21420 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73 20  file.** that is 
21430 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 61  used to store ta
21440 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69 6e  bles create usin
21450 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  g CREATE TEMPORA
21460 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  RY TABLE..**.** 
21470 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
21480 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
21490 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65  n the table refe
214a0 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65 20 61  red to must be a
214b0 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c  n.** intkey tabl
214c0 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c  e (an SQL table,
214d0 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29 2e 20   not an index). 
214e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
214f0 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20   row change .** 
21500 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  count is increme
21510 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
21520 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
21530 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
21540 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33  eared. .** If P3
21550 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
21560 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
21570 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
21580 72 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  register P3 is.*
21590 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74  * also increment
215a0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
215b0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
215c0 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61  table being clea
215d0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  red..**.** See a
215e0 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a  lso: Destroy.*/.
215f0 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b  case OP_Clear: {
21600 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20 3d  .  int nChange =
21610 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
21620 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 28 31  ->btreeMask & (1
21630 3c 3c 70 4f 70 2d 3e 70 32 29 29 21 3d 30 20 29  <<pOp->p2))!=0 )
21640 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21650 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
21660 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70  .      db->aDb[p
21670 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70  Op->p2].pBt, pOp
21680 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f  ->p1, (pOp->p3 ?
21690 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20   &nChange : 0). 
216a0 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
216b0 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  3 ){.    p->nCha
216c0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
216d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e      if( pOp->p3>
216e0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  0 ){.      p->aM
216f0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75 2e 69 20  em[pOp->p3].u.i 
21700 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20  += nChange;.    
21710 7d 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  }.  }.  break;.}
21720 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65  ../* Opcode: Cre
21730 61 74 65 54 61 62 6c 65 20 50 31 20 50 32 20 2a  ateTable P1 P2 *
21740 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63   * *.**.** Alloc
21750 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ate a new table 
21760 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
21770 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d  base file if P1=
21780 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a 20  =0 or in the.** 
21790 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
217a0 73 65 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 31  se file if P1==1
217b0 20 6f 72 20 69 6e 20 61 6e 20 61 74 74 61 63 68   or in an attach
217c0 65 64 20 64 61 74 61 62 61 73 65 20 69 66 0a 2a  ed database if.*
217d0 2a 20 50 31 3e 31 2e 20 20 57 72 69 74 65 20 74  * P1>1.  Write t
217e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
217f0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
21800 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67  able into.** reg
21810 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54  ister P2.**.** T
21820 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
21830 74 77 65 65 6e 20 61 20 74 61 62 6c 65 20 61 6e  tween a table an
21840 64 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 68  d an index is th
21850 69 73 3a 20 20 41 20 74 61 62 6c 65 20 6d 75 73  is:  A table mus
21860 74 0a 2a 2a 20 68 61 76 65 20 61 20 34 2d 62 79  t.** have a 4-by
21870 74 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 61  te integer key a
21880 6e 64 20 63 61 6e 20 68 61 76 65 20 61 72 62 69  nd can have arbi
21890 74 72 61 72 79 20 64 61 74 61 2e 20 20 41 6e 20  trary data.  An 
218a0 69 6e 64 65 78 0a 2a 2a 20 68 61 73 20 61 6e 20  index.** has an 
218b0 61 72 62 69 74 72 61 72 79 20 6b 65 79 20 62 75  arbitrary key bu
218c0 74 20 6e 6f 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  t no data..**.**
218d0 20 53 65 65 20 61 6c 73 6f 3a 20 43 72 65 61 74   See also: Creat
218e0 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63  eIndex.*/./* Opc
218f0 6f 64 65 3a 20 43 72 65 61 74 65 49 6e 64 65 78  ode: CreateIndex
21900 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
21910 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
21920 77 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6d  w index in the m
21930 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
21940 65 20 69 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e  e if P1==0 or in
21950 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72   the.** auxiliar
21960 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
21970 69 66 20 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61  if P1==1 or in a
21980 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
21990 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20  ase if.** P1>1. 
219a0 20 57 72 69 74 65 20 74 68 65 20 72 6f 6f 74 20   Write the root 
219b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
219c0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 74  he new table int
219d0 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32  o.** register P2
219e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64 6f 63 75  ..**.** See docu
219f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20 4f 50 5f  mentation on OP_
21a00 43 72 65 61 74 65 54 61 62 6c 65 20 66 6f 72 20  CreateTable for 
21a10 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
21a20 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  mation..*/.case 
21a30 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3a 20  OP_CreateIndex: 
21a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
21a50 74 32 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f  t2-prerelease */
21a60 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54  .case OP_CreateT
21a70 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
21a80 20 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65   /* out2-prerele
21a90 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e  ase */.  int pgn
21aa0 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6c 61  o = 0;.  int fla
21ab0 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  gs;.  Db *pDb;. 
21ac0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
21ad0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
21ae0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
21af0 72 74 28 20 28 70 2d 3e 62 74 72 65 65 4d 61 73  rt( (p->btreeMas
21b00 6b 20 26 20 28 31 3c 3c 70 4f 70 2d 3e 70 31 29  k & (1<<pOp->p1)
21b10 29 21 3d 30 20 29 3b 0a 20 20 70 44 62 20 3d 20  )!=0 );.  pDb = 
21b20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  &db->aDb[pOp->p1
21b30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ];.  assert( pDb
21b40 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 69 66  ->pBt!=0 );.  if
21b50 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
21b60 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 7b  P_CreateTable ){
21b70 0a 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 3d 20  .    /* flags = 
21b80 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f  BTREE_INTKEY; */
21b90 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52  .    flags = BTR
21ba0 45 45 5f 4c 45 41 46 44 41 54 41 7c 42 54 52 45  EE_LEAFDATA|BTRE
21bb0 45 5f 49 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c 73  E_INTKEY;.  }els
21bc0 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 42  e{.    flags = B
21bd0 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 3b 0a 20  TREE_ZERODATA;. 
21be0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
21bf0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
21c00 65 28 70 44 62 2d 3e 70 42 74 2c 20 26 70 67 6e  e(pDb->pBt, &pgn
21c10 6f 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4f 75  o, flags);.  pOu
21c20 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20  t->u.i = pgno;. 
21c30 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
21c40 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
21c50 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
21c60 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63 68 65  pcode: ParseSche
21c70 6d 61 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  ma P1 P2 * P4 *.
21c80 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 70  **.** Read and p
21c90 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65 73  arse all entries
21ca0 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45   from the SQLITE
21cb0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
21cc0 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a 20   database P1.** 
21cd0 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 57  that match the W
21ce0 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e 20  HERE clause P4. 
21cf0 20 50 32 20 69 73 20 74 68 65 20 22 66 6f 72 63   P2 is the "forc
21d00 65 22 20 66 6c 61 67 2e 20 20 20 41 6c 77 61 79  e" flag.   Alway
21d10 73 20 64 6f 0a 2a 2a 20 74 68 65 20 70 61 72 73  s do.** the pars
21d20 69 6e 67 20 69 66 20 50 32 20 69 73 20 74 72 75  ing if P2 is tru
21d30 65 2e 20 20 49 66 20 50 32 20 69 73 20 66 61 6c  e.  If P2 is fal
21d40 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  se, then this ro
21d50 75 74 69 6e 65 20 69 73 20 61 0a 2a 2a 20 6e 6f  utine is a.** no
21d60 2d 6f 70 20 69 66 20 74 68 65 20 73 63 68 65 6d  -op if the schem
21d70 61 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  a is not current
21d80 6c 79 20 6c 6f 61 64 65 64 2e 20 20 49 6e 20 6f  ly loaded.  In o
21d90 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 50  ther words, if P
21da0 32 0a 2a 2a 20 69 73 20 66 61 6c 73 65 2c 20 74  2.** is false, t
21db0 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
21dc0 20 74 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20 70   table is only p
21dd0 61 72 73 65 64 20 69 66 20 74 68 65 20 72 65 73  arsed if the res
21de0 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  t of the.** sche
21df0 6d 61 20 69 73 20 61 6c 72 65 61 64 79 20 6c 6f  ma is already lo
21e00 61 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73 79  aded into the sy
21e10 6d 62 6f 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  mbol table..**.*
21e20 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
21e30 76 6f 6b 65 73 20 74 68 65 20 70 61 72 73 65 72  vokes the parser
21e40 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
21e50 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
21e60 2c 0a 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74  ,.** then runs t
21e70 68 65 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d  he new virtual m
21e80 61 63 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74  achine.  It is t
21e90 68 75 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74  hus a re-entrant
21ea0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65   opcode..*/.case
21eb0 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a   OP_ParseSchema:
21ec0 20 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b   {.  char *zSql;
21ed0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 70 4f 70  .  int iDb = pOp
21ee0 2d 3e 70 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->p1;.  const ch
21ef0 61 72 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 49  ar *zMaster;.  I
21f00 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74 61  nitData initData
21f10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
21f20 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
21f30 44 62 20 29 3b 0a 20 20 69 66 28 20 21 70 4f 70  Db );.  if( !pOp
21f40 2d 3e 70 32 20 26 26 20 21 44 62 48 61 73 50 72  ->p2 && !DbHasPr
21f50 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c 20  operty(db, iDb, 
21f60 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
21f70 20 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20   ){.    break;. 
21f80 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 53   }.  zMaster = S
21f90 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
21fa0 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20  ;.  initData.db 
21fb0 3d 20 64 62 3b 0a 20 20 69 6e 69 74 44 61 74 61  = db;.  initData
21fc0 2e 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  .iDb = pOp->p1;.
21fd0 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72    initData.pzErr
21fe0 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d 73  Msg = &p->zErrMs
21ff0 67 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  g;.  zSql = sqli
22000 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 0a 20  te3MPrintf(db,. 
22010 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
22020 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20  , rootpage, sql 
22030 46 52 4f 4d 20 27 25 71 27 2e 25 73 20 57 48 45  FROM '%q'.%s WHE
22040 52 45 20 25 73 22 2c 0a 20 20 20 20 20 64 62 2d  RE %s",.     db-
22050 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
22060 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70   zMaster, pOp->p
22070 34 2e 7a 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  4.z);.  if( zSql
22080 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
22090 6d 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  m;.  (void)sqlit
220a0 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
220b0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69  .  assert( db->i
220c0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
220d0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
220e0 20 31 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 72   1;.  initData.r
220f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22100 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
22110 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
22120 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
22130 63 28 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  c(db, zSql, sqli
22140 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c  te3InitCallback,
22150 20 26 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a   &initData, 0);.
22160 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22170 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69 74 44  _OK ) rc = initD
22180 61 74 61 2e 72 63 3b 0a 20 20 73 71 6c 69 74 65  ata.rc;.  sqlite
22190 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
221a0 29 3b 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  );.  db->init.bu
221b0 73 79 20 3d 20 30 3b 0a 20 20 28 76 6f 69 64 29  sy = 0;.  (void)
221c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
221d0 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
221e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
221f0 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
22200 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d    }.  break;  .}
22210 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
22220 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
22230 5a 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ZE) && !defined(
22240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 52 53  SQLITE_OMIT_PARS
22250 45 52 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  ER)./* Opcode: L
22260 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a  oadAnalysis P1 *
22270 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61   * * *.**.** Rea
22280 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
22290 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74  t1 table for dat
222a0 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61  abase P1 and loa
222b0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  d the content.**
222c0 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   of that table i
222d0 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  nto the internal
222e0 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
222f0 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
22300 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79  use.** the analy
22310 73 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 77  sis to be used w
22320 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c  hen preparing al
22330 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65  l subsequent que
22340 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ries..*/.case OP
22350 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b  _LoadAnalysis: {
22360 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 70 4f 70  .  int iDb = pOp
22370 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p1;.  assert( 
22380 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
22390 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20  ->nDb );.  rc = 
223a0 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c  sqlite3AnalysisL
223b0 6f 61 64 28 64 62 2c 20 69 44 62 29 3b 0a 20 20  oad(db, iDb);.  
223c0 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64 69  break;  .}.#endi
223d0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
223e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
223f0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
22400 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 52 53 45  QLITE_OMIT_PARSE
22410 52 29 20 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  R)  */../* Opcod
22420 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50 31 20  e: DropTable P1 
22430 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
22440 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
22450 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
22460 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
22470 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
22480 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
22490 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
224a0 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
224b0 65 64 20 61 66 74 65 72 20 61 20 74 61 62 6c 65  ed after a table
224c0 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 69  .** is dropped i
224d0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
224e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
224f0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
22500 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e  he.** schema con
22510 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61  sistent with wha
22520 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  t is on disk..*/
22530 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 62  .case OP_DropTab
22540 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55  le: {.  sqlite3U
22550 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61  nlinkAndDeleteTa
22560 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  ble(db, pOp->p1,
22570 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62   pOp->p4.z);.  b
22580 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
22590 64 65 3a 20 44 72 6f 70 49 6e 64 65 78 20 50 31  de: DropIndex P1
225a0 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
225b0 52 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72  Remove the inter
225c0 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20  nal (in-memory) 
225d0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
225e0 74 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a  that describe.**
225f0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
22600 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20   P4 in database 
22610 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c  P1.  This is cal
22620 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 64  led after an ind
22630 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64  ex.** is dropped
22640 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
22650 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  p the internal r
22660 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
22670 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
22680 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
22690 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
226a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49  */.case OP_DropI
226b0 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65  ndex: {.  sqlite
226c0 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
226d0 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e 70  Index(db, pOp->p
226e0 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  1, pOp->p4.z);. 
226f0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
22700 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67 67 65  code: DropTrigge
22710 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  r P1 * * P4 *.**
22720 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
22730 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f  nternal (in-memo
22740 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75  ry) data structu
22750 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62  res that describ
22760 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  e.** the trigger
22770 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74   named P4 in dat
22780 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20  abase P1.  This 
22790 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
227a0 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73 20  a trigger.** is 
227b0 64 72 6f 70 70 65 64 20 69 6e 20 6f 72 64 65 72  dropped in order
227c0 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
227d0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
227e0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
227f0 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
22800 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
22810 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
22820 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a 20 7b  P_DropTrigger: {
22830 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
22840 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
22850 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
22860 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
22870 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
22880 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
22890 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70  RITY_CHECK./* Op
228a0 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 79 43  code: IntegrityC
228b0 6b 20 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a  k P1 P2 P3 * P5.
228c0 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61 6c  **.** Do an anal
228d0 79 73 69 73 20 6f 66 20 74 68 65 20 63 75 72 72  ysis of the curr
228e0 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61 62  ently open datab
228f0 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a 2a  ase.  Store in.*
22900 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 74 68  * register P1 th
22910 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 72 72  e text of an err
22920 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73 63 72  or message descr
22930 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c 65  ibing any proble
22940 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72 6f  ms..** If no pro
22950 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2c  blems are found,
22960 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69 6e   store a NULL in
22970 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
22980 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
22990 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P3 contains the
229a0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
229b0 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f 72  of allowed error
229c0 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72 65  s..** At most re
229d0 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69 6c  g(P3) errors wil
229e0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a 2a  l be reported..*
229f0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
22a00 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 73  , the analysis s
22a10 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73 20  tops as soon as 
22a20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20 61  reg(P1) errors a
22a30 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52 65  re .** seen.  Re
22a40 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65 64  g(P1) is updated
22a50 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65 72   with the number
22a60 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69   of errors remai
22a70 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
22a80 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
22a90 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
22aa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
22ab0 61 72 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 73  are integer.** s
22ac0 74 6f 72 65 64 20 69 6e 20 72 65 67 28 50 31 29  tored in reg(P1)
22ad0 2c 20 72 65 67 28 50 31 2b 31 29 2c 20 72 65 67  , reg(P1+1), reg
22ae0 28 50 31 2b 32 29 2c 20 2e 2e 2e 2e 20 20 54 68  (P1+2), ....  Th
22af0 65 72 65 20 61 72 65 20 50 32 20 74 61 62 6c 65  ere are P2 table
22b00 73 0a 2a 2a 20 74 6f 74 61 6c 2e 0a 2a 2a 0a 2a  s.** total..**.*
22b10 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a  * If P5 is not z
22b20 65 72 6f 2c 20 74 68 65 20 63 68 65 63 6b 20 69  ero, the check i
22b30 73 20 64 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75  s done on the au
22b40 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
22b50 0a 2a 2a 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68  .** file, not th
22b60 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
22b70 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
22b80 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
22b90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
22ba0 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
22bb0 20 70 72 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65   pragma..*/.case
22bc0 20 4f 50 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a   OP_IntegrityCk:
22bd0 20 7b 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20   {.  int nRoot; 
22be0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22bf0 66 20 74 61 62 6c 65 73 20 74 6f 20 63 68 65 63  f tables to chec
22c00 6b 2e 20 20 28 4e 75 6d 62 65 72 20 6f 66 20 72  k.  (Number of r
22c10 6f 6f 74 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20  oot pages.) */. 
22c20 20 69 6e 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20   int *aRoot;    
22c30 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 6f 6f   /* Array of roo
22c40 74 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f  tpage numbers fo
22c50 72 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 63  r tables to be c
22c60 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
22c70 6a 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  j;          /* L
22c80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22c90 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
22ca0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
22cb0 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f  rors reported */
22cc0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
22cd0 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
22ce0 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a  e error report *
22cf0 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20  /.  Mem *pnErr; 
22d00 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22d10 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
22d20 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
22d30 67 20 2a 2f 0a 20 20 0a 20 20 6e 52 6f 6f 74 20  g */.  .  nRoot 
22d40 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
22d50 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a  ert( nRoot>0 );.
22d60 20 20 61 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65    aRoot = sqlite
22d70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
22d80 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 52   sizeof(int)*(nR
22d90 6f 6f 74 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  oot+1) );.  if( 
22da0 61 52 6f 6f 74 3d 3d 30 20 29 20 67 6f 74 6f 20  aRoot==0 ) goto 
22db0 6e 6f 5f 6d 65 6d 3b 0a 20 20 61 73 73 65 72 74  no_mem;.  assert
22dc0 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
22dd0 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d 65 6d 20  Op->p3<=p->nMem 
22de0 29 3b 0a 20 20 70 6e 45 72 72 20 3d 20 26 70 2d  );.  pnErr = &p-
22df0 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  >aMem[pOp->p3];.
22e00 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72 72    assert( (pnErr
22e10 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
22e20 74 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  t)!=0 );.  asser
22e30 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73  t( (pnErr->flags
22e40 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
22e50 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 70  Blob))==0 );.  p
22e60 49 6e 31 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  In1 = &p->aMem[p
22e70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 6a  Op->p1];.  for(j
22e80 3d 30 3b 20 6a 3c 6e 52 6f 6f 74 3b 20 6a 2b 2b  =0; j<nRoot; j++
22e90 29 7b 0a 20 20 20 20 61 52 6f 6f 74 5b 6a 5d 20  ){.    aRoot[j] 
22ea0 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
22eb0 62 65 49 6e 74 56 61 6c 75 65 28 26 70 49 6e 31  beIntValue(&pIn1
22ec0 5b 6a 5d 29 3b 0a 20 20 7d 0a 20 20 61 52 6f 6f  [j]);.  }.  aRoo
22ed0 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 61 73 73 65  t[j] = 0;.  asse
22ee0 72 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e  rt( pOp->p5<db->
22ef0 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
22f00 20 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26   (p->btreeMask &
22f10 20 28 31 3c 3c 70 4f 70 2d 3e 70 35 29 29 21 3d   (1<<pOp->p5))!=
22f20 30 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  0 );.  z = sqlit
22f30 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
22f40 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f  Check(db->aDb[pO
22f50 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f  p->p5].pBt, aRoo
22f60 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20  t, nRoot,.      
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
22f90 70 6e 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72  pnErr->u.i, &nEr
22fa0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
22fb0 72 65 65 28 64 62 2c 20 61 52 6f 6f 74 29 3b 0a  ree(db, aRoot);.
22fc0 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20    pnErr->u.i -= 
22fd0 6e 45 72 72 3b 0a 20 20 73 71 6c 69 74 65 33 56  nErr;.  sqlite3V
22fe0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
22ff0 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d  n1);.  if( nErr=
23000 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
23010 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ( z==0 );.  }els
23020 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20  e if( z==0 ){.  
23030 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
23040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
23050 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
23060 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pIn1, z, -1, SQ
23070 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
23080 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20  e3_free);.  }.  
23090 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
230a0 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c  IZE(pIn1);.  sql
230b0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
230c0 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63  coding(pIn1, enc
230d0 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
230e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
230f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
23100 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20  TY_CHECK */../* 
23110 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64  Opcode: RowSetAd
23120 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
23130 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69  .** Insert the i
23140 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c  nteger value hel
23150 64 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32  d by register P2
23160 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20   into a boolean 
23170 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e  index.** held in
23180 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
23190 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  .** An assertion
231a0 20 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20   fails if P2 is 
231b0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  not an integer..
231c0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
231d0 74 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a  tAdd: {       /*
231e0 20 69 6e 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70   in2 */.  Mem *p
231f0 49 64 78 3b 0a 20 20 4d 65 6d 20 2a 70 56 61 6c  Idx;.  Mem *pVal
23200 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
23210 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
23220 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70  <=p->nMem );.  p
23230 49 64 78 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70  Idx = &p->aMem[p
23240 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
23250 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  t( pOp->p2>0 && 
23260 70 4f 70 2d 3e 70 32 3c 3d 70 2d 3e 6e 4d 65 6d  pOp->p2<=p->nMem
23270 20 29 3b 0a 20 20 70 56 61 6c 20 3d 20 26 70 2d   );.  pVal = &p-
23280 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  >aMem[pOp->p2];.
23290 20 20 61 73 73 65 72 74 28 20 28 70 56 61 6c 2d    assert( (pVal-
232a0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
232b0 29 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  )!=0 );.  if( (p
232c0 49 64 78 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Idx->flags & MEM
232d0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20  _RowSet)==0 ){. 
232e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
232f0 6d 53 65 74 52 6f 77 53 65 74 28 70 49 64 78 29  mSetRowSet(pIdx)
23300 3b 0a 20 20 20 20 69 66 28 20 28 70 49 64 78 2d  ;.    if( (pIdx-
23310 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
23320 53 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  Set)==0 ) goto n
23330 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c  o_mem;.  }.  sql
23340 69 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74  ite3RowSetInsert
23350 28 70 49 64 78 2d 3e 75 2e 70 52 6f 77 53 65 74  (pIdx->u.pRowSet
23360 2c 20 70 56 61 6c 2d 3e 75 2e 69 29 3b 0a 20 20  , pVal->u.i);.  
23370 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
23380 6f 64 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20  ode: RowSetRead 
23390 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a  P1 P2 P3 * *.**.
233a0 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73  ** Extract the s
233b0 6d 61 6c 6c 65 73 74 20 76 61 6c 75 65 20 66 72  mallest value fr
233c0 6f 6d 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78  om boolean index
233d0 20 50 31 20 61 6e 64 20 70 75 74 20 74 68 61 74   P1 and put that
233e0 20 76 61 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72   value into.** r
233f0 65 67 69 73 74 65 72 20 50 33 2e 20 20 4f 72 2c  egister P3.  Or,
23400 20 69 66 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65   if boolean inde
23410 78 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c  x P1 is initiall
23420 79 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50  y empty, leave P
23430 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  3.** unchanged a
23440 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  nd jump to instr
23450 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61  uction P2..*/.ca
23460 73 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  se OP_RowSetRead
23470 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
23480 70 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 4d 65 6d  p, out3 */.  Mem
23490 20 2a 70 49 64 78 3b 0a 20 20 69 36 34 20 76 61   *pIdx;.  i64 va
234a0 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  l;.  assert( pOp
234b0 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
234c0 31 3c 3d 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  1<=p->nMem );.  
234d0 43 48 45 43 4b 5f 46 4f 52 5f 49 4e 54 45 52 52  CHECK_FOR_INTERR
234e0 55 50 54 3b 0a 20 20 70 49 64 78 20 3d 20 26 70  UPT;.  pIdx = &p
234f0 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b  ->aMem[pOp->p1];
23500 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d  .  pOut = &p->aM
23510 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
23520 66 28 20 28 70 49 64 78 2d 3e 66 6c 61 67 73 20  f( (pIdx->flags 
23530 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
23540 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 52   .   || sqlite3R
23550 6f 77 53 65 74 4e 65 78 74 28 70 49 64 78 2d 3e  owSetNext(pIdx->
23560 75 2e 70 52 6f 77 53 65 74 2c 20 26 76 61 6c 29  u.pRowSet, &val)
23570 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ==0.  ){.    /* 
23580 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65  The boolean inde
23590 78 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  x is empty */.  
235a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
235b0 53 65 74 4e 75 6c 6c 28 70 49 64 78 29 3b 0a 20  SetNull(pIdx);. 
235c0 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
235d0 2d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 1;.  }else{.  
235e0 20 20 2f 2a 20 41 20 76 61 6c 75 65 20 77 61 73    /* A value was
235f0 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65   pulled from the
23600 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 61 73   index */.    as
23610 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20  sert( pOp->p3>0 
23620 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e  && pOp->p3<=p->n
23630 4d 65 6d 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Mem );.    sqlit
23640 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
23650 34 28 70 4f 75 74 2c 20 76 61 6c 29 3b 0a 20 20  4(pOut, val);.  
23660 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23  }.  break;.}...#
23670 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23680 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 20 4f 70  IT_TRIGGER./* Op
23690 63 6f 64 65 3a 20 43 6f 6e 74 65 78 74 50 75 73  code: ContextPus
236a0 68 20 2a 20 2a 20 2a 20 0a 2a 2a 0a 2a 2a 20 53  h * * * .**.** S
236b0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
236c0 56 64 62 65 20 63 6f 6e 74 65 78 74 20 73 75 63  Vdbe context suc
236d0 68 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  h that it can be
236e0 20 72 65 73 74 6f 72 65 64 20 62 79 20 61 20 43   restored by a C
236f0 6f 6e 74 65 78 74 50 6f 70 0a 2a 2a 20 6f 70 63  ontextPop.** opc
23700 6f 64 65 2e 20 54 68 65 20 63 6f 6e 74 65 78 74  ode. The context
23710 20 73 74 6f 72 65 73 20 74 68 65 20 6c 61 73 74   stores the last
23720 20 69 6e 73 65 72 74 20 72 6f 77 20 69 64 2c 20   insert row id, 
23730 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 6d 65  the last stateme
23740 6e 74 20 63 68 61 6e 67 65 0a 2a 2a 20 63 6f 75  nt change.** cou
23750 6e 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  nt, and the curr
23760 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 63 68  ent statement ch
23770 61 6e 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 63  ange count..*/.c
23780 61 73 65 20 4f 50 5f 43 6f 6e 74 65 78 74 50 75  ase OP_ContextPu
23790 73 68 3a 20 7b 0a 20 20 69 6e 74 20 69 20 3d 20  sh: {.  int i = 
237a0 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54  p->contextStackT
237b0 6f 70 2b 2b 3b 0a 20 20 43 6f 6e 74 65 78 74 20  op++;.  Context 
237c0 2a 70 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 61 73  *pContext;..  as
237d0 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
237e0 2f 2a 20 46 49 58 20 4d 45 3a 20 54 68 69 73 20  /* FIX ME: This 
237f0 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 6f 63 61  should be alloca
23800 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ted as part of t
23810 68 65 20 76 64 62 65 20 61 74 20 63 6f 6d 70 69  he vdbe at compi
23820 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 69 66 28  le-time */.  if(
23830 20 69 3e 3d 70 2d 3e 63 6f 6e 74 65 78 74 53 74   i>=p->contextSt
23840 61 63 6b 44 65 70 74 68 20 29 7b 0a 20 20 20 20  ackDepth ){.    
23850 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
23860 65 70 74 68 20 3d 20 69 2b 31 3b 0a 20 20 20 20  epth = i+1;.    
23870 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
23880 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
23890 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 2d 3e  ocOrFree(db, p->
238a0 63 6f 6e 74 65 78 74 53 74 61 63 6b 2c 0a 20 20  contextStack,.  
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 43          sizeof(C
238e0 6f 6e 74 65 78 74 29 2a 28 69 2b 31 29 29 3b 0a  ontext)*(i+1));.
238f0 20 20 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65      if( p->conte
23900 78 74 53 74 61 63 6b 3d 3d 30 20 29 20 67 6f 74  xtStack==0 ) got
23910 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
23920 70 43 6f 6e 74 65 78 74 20 3d 20 26 70 2d 3e 63  pContext = &p->c
23930 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d 3b 0a  ontextStack[i];.
23940 20 20 70 43 6f 6e 74 65 78 74 2d 3e 6c 61 73 74    pContext->last
23950 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
23960 52 6f 77 69 64 3b 0a 20 20 70 43 6f 6e 74 65 78  Rowid;.  pContex
23970 74 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e  t->nChange = p->
23980 6e 43 68 61 6e 67 65 3b 0a 20 20 62 72 65 61 6b  nChange;.  break
23990 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
239a0 43 6f 6e 74 65 78 74 50 6f 70 20 2a 20 2a 20 2a  ContextPop * * *
239b0 20 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20   .**.** Restore 
239c0 74 68 65 20 56 64 62 65 20 63 6f 6e 74 65 78 74  the Vdbe context
239d0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
239e0 20 77 61 73 20 69 6e 20 77 68 65 6e 20 63 6f 6e   was in when con
239f0 74 65 78 74 50 75 73 68 20 77 61 73 20 6c 61 73  textPush was las
23a00 74 0a 2a 2a 20 65 78 65 63 75 74 65 64 2e 20 54  t.** executed. T
23a10 68 65 20 63 6f 6e 74 65 78 74 20 73 74 6f 72 65  he context store
23a20 73 20 74 68 65 20 6c 61 73 74 20 69 6e 73 65 72  s the last inser
23a30 74 20 72 6f 77 20 69 64 2c 20 74 68 65 20 6c 61  t row id, the la
23a40 73 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  st statement.** 
23a50 63 68 61 6e 67 65 20 63 6f 75 6e 74 2c 20 61 6e  change count, an
23a60 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
23a70 61 74 65 6d 65 6e 74 20 63 68 61 6e 67 65 20 63  atement change c
23a80 6f 75 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ount..*/.case OP
23a90 5f 43 6f 6e 74 65 78 74 50 6f 70 3a 20 7b 0a 20  _ContextPop: {. 
23aa0 20 43 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65   Context *pConte
23ab0 78 74 20 3d 20 26 70 2d 3e 63 6f 6e 74 65 78 74  xt = &p->context
23ac0 53 74 61 63 6b 5b 2d 2d 70 2d 3e 63 6f 6e 74 65  Stack[--p->conte
23ad0 78 74 53 74 61 63 6b 54 6f 70 5d 3b 0a 20 20 61  xtStackTop];.  a
23ae0 73 73 65 72 74 28 20 70 2d 3e 63 6f 6e 74 65 78  ssert( p->contex
23af0 74 53 74 61 63 6b 54 6f 70 3e 3d 30 20 29 3b 0a  tStackTop>=0 );.
23b00 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20    db->lastRowid 
23b10 3d 20 70 43 6f 6e 74 65 78 74 2d 3e 6c 61 73 74  = pContext->last
23b20 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 6e 43 68 61  Rowid;.  p->nCha
23b30 6e 67 65 20 3d 20 70 43 6f 6e 74 65 78 74 2d 3e  nge = pContext->
23b40 6e 43 68 61 6e 67 65 3b 0a 20 20 62 72 65 61 6b  nChange;.  break
23b50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69  ;.}.#endif /* #i
23b60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23b70 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69  T_TRIGGER */..#i
23b80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23b90 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
23ba0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 65 6d 4d 61  /* Opcode: MemMa
23bb0 78 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  x P1 P2 * * *.**
23bc0 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
23bd0 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  e of register P1
23be0 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
23bf0 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
23c00 61 6c 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  alue.** and the 
23c10 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
23c20 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P2..**.** This
23c30 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72   instruction thr
23c40 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ows an error if 
23c50 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
23c60 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
23c70 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  .** an integer..
23c80 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61  */.case OP_MemMa
23c90 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69  x: {        /* i
23ca0 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 73 71 6c  n1, in2 */.  sql
23cb0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
23cc0 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 73  erify(pIn1);.  s
23cd0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
23ce0 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20  egerify(pIn2);. 
23cf0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70   if( pIn1->u.i<p
23d00 49 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70  In2->u.i){.    p
23d10 49 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d  In1->u.i = pIn2-
23d20 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61  >u.i;.  }.  brea
23d30 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
23d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
23d50 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20  NCREMENT */../* 
23d60 4f 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31  Opcode: IfPos P1
23d70 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
23d80 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
23d90 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 31  register P1 is 1
23da0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 6a 75 6d   or greater, jum
23db0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  p to P2..**.** I
23dc0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
23dd0 75 73 65 20 74 68 69 73 20 69 6e 73 74 72 75 63  use this instruc
23de0 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74  tion on a regist
23df0 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20  er that does.** 
23e00 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  not contain an i
23e10 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65  nteger.  An asse
23e20 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c  rtion fault will
23e30 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74   result if you t
23e40 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ry..*/.case OP_I
23e50 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f  fPos: {        /
23e60 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
23e70 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
23e80 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
23e90 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
23ea0 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d 20 70  0 ){.     pc = p
23eb0 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 7d 0a  Op->p2 - 1;.  }.
23ec0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
23ed0 70 63 6f 64 65 3a 20 49 66 4e 65 67 20 50 31 20  pcode: IfNeg P1 
23ee0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
23ef0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 72  f the value of r
23f00 65 67 69 73 74 65 72 20 50 31 20 69 73 20 6c 65  egister P1 is le
23f10 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 6a 75  ss than zero, ju
23f20 6d 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a  mp to P2. .**.**
23f30 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23f40 6f 20 75 73 65 20 74 68 69 73 20 69 6e 73 74 72  o use this instr
23f50 75 63 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69  uction on a regi
23f60 73 74 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a  ster that does.*
23f70 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  * not contain an
23f80 20 69 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73   integer.  An as
23f90 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69  sertion fault wi
23fa0 6c 6c 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75  ll result if you
23fb0 20 74 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   try..*/.case OP
23fc0 5f 49 66 4e 65 67 3a 20 7b 20 20 20 20 20 20 20  _IfNeg: {       
23fd0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
23fe0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
23ff0 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
24000 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
24010 69 3c 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d  i<0 ){.     pc =
24020 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
24030 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
24040 20 4f 70 63 6f 64 65 3a 20 49 66 5a 65 72 6f 20   Opcode: IfZero 
24050 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
24060 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f  * If the value o
24070 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
24080 20 65 78 61 63 74 6c 79 20 30 2c 20 6a 75 6d 70   exactly 0, jump
24090 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20 49   to P2. .**.** I
240a0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
240b0 75 73 65 20 74 68 69 73 20 69 6e 73 74 72 75 63  use this instruc
240c0 74 69 6f 6e 20 6f 6e 20 61 20 72 65 67 69 73 74  tion on a regist
240d0 65 72 20 74 68 61 74 20 64 6f 65 73 0a 2a 2a 20  er that does.** 
240e0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  not contain an i
240f0 6e 74 65 67 65 72 2e 20 20 41 6e 20 61 73 73 65  nteger.  An asse
24100 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c 6c  rtion fault will
24110 20 72 65 73 75 6c 74 20 69 66 20 79 6f 75 20 74   result if you t
24120 72 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ry..*/.case OP_I
24130 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20  fZero: {        
24140 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
24150 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
24160 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b  flags&MEM_Int );
24170 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69  .  if( pIn1->u.i
24180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 70 63 20 3d  ==0 ){.     pc =
24190 20 70 4f 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20   pOp->p2 - 1;.  
241a0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
241b0 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70   Opcode: AggStep
241c0 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a   * P2 P3 P4 P5.*
241d0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
241e0 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66   step function f
241f0 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  or an aggregate.
24200 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f    The.** functio
24210 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e  n has P5 argumen
24220 74 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f  ts.   P4 is a po
24230 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
24240 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72  cDef.** structur
24250 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
24260 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
24270 55 73 65 20 72 65 67 69 73 74 65 72 0a 2a 2a 20  Use register.** 
24280 50 33 20 61 73 20 74 68 65 20 61 63 63 75 6d 75  P3 as the accumu
24290 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
242a0 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72   P5 arguments ar
242b0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  e taken from reg
242c0 69 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73  ister P2 and its
242d0 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a  .** successors..
242e0 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 53 74  */.case OP_AggSt
242f0 65 70 3a 20 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ep: {.  int n = 
24300 70 4f 70 2d 3e 70 35 3b 0a 20 20 69 6e 74 20 69  pOp->p5;.  int i
24310 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 2a  ;.  Mem *pMem, *
24320 70 52 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRec;.  sqlite3_
24330 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73  context ctx;.  s
24340 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
24350 70 56 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  pVal;..  assert(
24360 20 6e 3e 3d 30 20 29 3b 0a 20 20 70 52 65 63 20   n>=0 );.  pRec 
24370 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  = &p->aMem[pOp->
24380 70 32 5d 3b 0a 20 20 61 70 56 61 6c 20 3d 20 70  p2];.  apVal = p
24390 2d 3e 61 70 41 72 67 3b 0a 20 20 61 73 73 65 72  ->apArg;.  asser
243a0 74 28 20 61 70 56 61 6c 20 7c 7c 20 6e 3d 3d 30  t( apVal || n==0
243b0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
243c0 3c 6e 3b 20 69 2b 2b 2c 20 70 52 65 63 2b 2b 29  <n; i++, pRec++)
243d0 7b 0a 20 20 20 20 61 70 56 61 6c 5b 69 5d 20 3d  {.    apVal[i] =
243e0 20 70 52 65 63 3b 0a 20 20 20 20 73 74 6f 72 65   pRec;.    store
243f0 54 79 70 65 49 6e 66 6f 28 70 52 65 63 2c 20 65  TypeInfo(pRec, e
24400 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  ncoding);.  }.  
24410 63 74 78 2e 70 46 75 6e 63 20 3d 20 70 4f 70 2d  ctx.pFunc = pOp-
24420 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 61 73 73  >p4.pFunc;.  ass
24430 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
24440 26 20 70 4f 70 2d 3e 70 33 3c 3d 70 2d 3e 6e 4d  & pOp->p3<=p->nM
24450 65 6d 20 29 3b 0a 20 20 63 74 78 2e 70 4d 65 6d  em );.  ctx.pMem
24460 20 3d 20 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d   = pMem = &p->aM
24470 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70  em[pOp->p3];.  p
24480 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 63 74 78 2e  Mem->n++;.  ctx.
24490 73 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  s.flags = MEM_Nu
244a0 6c 6c 3b 0a 20 20 63 74 78 2e 73 2e 7a 20 3d 20  ll;.  ctx.s.z = 
244b0 30 3b 0a 20 20 63 74 78 2e 73 2e 7a 4d 61 6c 6c  0;.  ctx.s.zMall
244c0 6f 63 20 3d 20 30 3b 0a 20 20 63 74 78 2e 73 2e  oc = 0;.  ctx.s.
244d0 78 44 65 6c 20 3d 20 30 3b 0a 20 20 63 74 78 2e  xDel = 0;.  ctx.
244e0 73 2e 64 62 20 3d 20 64 62 3b 0a 20 20 63 74 78  s.db = db;.  ctx
244f0 2e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20  .isError = 0;.  
24500 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  ctx.pColl = 0;. 
24510 20 69 66 28 20 63 74 78 2e 70 46 75 6e 63 2d 3e   if( ctx.pFunc->
24520 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
24530 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
24540 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e      assert( pOp>
24550 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  p->aOp );.    as
24560 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34  sert( pOp[-1].p4
24570 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51  type==P4_COLLSEQ
24580 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24590 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
245a0 4f 50 5f 43 6f 6c 6c 53 65 71 20 29 3b 0a 20 20  OP_CollSeq );.  
245b0 20 20 63 74 78 2e 70 43 6f 6c 6c 20 3d 20 70 4f    ctx.pColl = pO
245c0 70 5b 2d 31 5d 2e 70 34 2e 70 43 6f 6c 6c 3b 0a  p[-1].p4.pColl;.
245d0 20 20 7d 0a 20 20 28 63 74 78 2e 70 46 75 6e 63    }.  (ctx.pFunc
245e0 2d 3e 78 53 74 65 70 29 28 26 63 74 78 2c 20 6e  ->xStep)(&ctx, n
245f0 2c 20 61 70 56 61 6c 29 3b 0a 20 20 69 66 28 20  , apVal);.  if( 
24600 63 74 78 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20  ctx.isError ){. 
24610 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
24620 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
24630 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
24640 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 63  e3_value_text(&c
24650 74 78 2e 73 29 29 3b 0a 20 20 20 20 72 63 20 3d  tx.s));.    rc =
24660 20 63 74 78 2e 69 73 45 72 72 6f 72 3b 0a 20 20   ctx.isError;.  
24670 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
24680 65 6d 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73  emRelease(&ctx.s
24690 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
246a0 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e  * Opcode: AggFin
246b0 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a  al P1 P2 * P4 *.
246c0 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68  **.** Execute th
246d0 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63  e finalizer func
246e0 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72  tion for an aggr
246f0 65 67 61 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a  egate.  P1 is.**
24700 20 74 68 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   the memory loca
24710 74 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65  tion that is the
24720 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72   accumulator for
24730 20 74 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a   the aggregate..
24740 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20  **.** P2 is the 
24750 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
24760 6e 74 73 20 74 68 61 74 20 74 68 65 20 73 74 65  nts that the ste
24770 70 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  p function takes
24780 20 61 6e 64 0a 2a 2a 20 50 34 20 69 73 20 61 20   and.** P4 is a 
24790 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
247a0 75 6e 63 44 65 66 20 66 6f 72 20 74 68 69 73 20  uncDef for this 
247b0 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 50  function.  The P
247c0 32 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  2.** argument is
247d0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68 69   not used by thi
247e0 73 20 6f 70 63 6f 64 65 2e 20 20 49 74 20 69 73  s opcode.  It is
247f0 20 6f 6e 6c 79 20 74 68 65 72 65 20 74 6f 20 64   only there to d
24800 69 73 61 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66  isambiguate.** f
24810 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63 61  unctions that ca
24820 6e 20 74 61 6b 65 20 76 61 72 79 69 6e 67 20 6e  n take varying n
24830 75 6d 62 65 72 73 20 6f 66 20 61 72 67 75 6d 65  umbers of argume
24840 6e 74 73 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20  nts.  The.** P4 
24850 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79  argument is only
24860 20 6e 65 65 64 65 64 20 66 6f 72 20 74 68 65 20   needed for the 
24870 64 65 67 65 6e 65 72 61 74 65 20 63 61 73 65 20  degenerate case 
24880 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 73 74 65  where.** the ste
24890 70 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e  p function was n
248a0 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  ot previously ca
248b0 6c 6c 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  lled..*/.case OP
248c0 5f 41 67 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d  _AggFinal: {.  M
248d0 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65  em *pMem;.  asse
248e0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26  rt( pOp->p1>0 &&
248f0 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 4d 65   pOp->p1<=p->nMe
24900 6d 20 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 70  m );.  pMem = &p
24910 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b  ->aMem[pOp->p1];
24920 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d  .  assert( (pMem
24930 2d 3e 66 6c 61 67 73 20 26 20 7e 28 4d 45 4d 5f  ->flags & ~(MEM_
24940 4e 75 6c 6c 7c 4d 45 4d 5f 41 67 67 29 29 3d 3d  Null|MEM_Agg))==
24950 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
24960 74 65 33 56 64 62 65 4d 65 6d 46 69 6e 61 6c 69  te3VdbeMemFinali
24970 7a 65 28 70 4d 65 6d 2c 20 70 4f 70 2d 3e 70 34  ze(pMem, pOp->p4
24980 2e 70 46 75 6e 63 29 3b 0a 20 20 69 66 28 20 72  .pFunc);.  if( r
24990 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
249a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
249b0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
249c0 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
249d0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
249e0 74 28 70 4d 65 6d 29 29 3b 0a 20 20 7d 0a 20 20  t(pMem));.  }.  
249f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
24a00 65 45 6e 63 6f 64 69 6e 67 28 70 4d 65 6d 2c 20  eEncoding(pMem, 
24a10 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44  encoding);.  UPD
24a20 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
24a30 28 70 4d 65 6d 29 3b 0a 20 20 69 66 28 20 73 71  (pMem);.  if( sq
24a40 6c 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42  lite3VdbeMemTooB
24a50 69 67 28 70 4d 65 6d 29 20 29 7b 0a 20 20 20 20  ig(pMem) ){.    
24a60 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20  goto too_big;.  
24a70 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23  }.  break;.}...#
24a80 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
24a90 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
24aa0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
24ab0 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a  TE_OMIT_ATTACH).
24ac0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75  /* Opcode: Vacuu
24ad0 6d 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  m * * * * *.**.*
24ae0 2a 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74  * Vacuum the ent
24af0 69 72 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  ire database.  T
24b00 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
24b10 63 61 75 73 65 20 6f 74 68 65 72 20 76 69 72 74  cause other virt
24b20 75 61 6c 0a 2a 2a 20 6d 61 63 68 69 6e 65 73 20  ual.** machines 
24b30 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
24b40 64 20 72 75 6e 2e 20 20 49 74 20 6d 61 79 20 6e  d run.  It may n
24b50 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ot be called fro
24b60 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  m within.** a tr
24b70 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  ansaction..*/.ca
24b80 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a  se OP_Vacuum: {.
24b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66    if( sqlite3Saf
24ba0 65 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74  etyOff(db) ) got
24bb0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
24bc0 69 73 75 73 65 3b 20 0a 20 20 72 63 20 3d 20 73  isuse; .  rc = s
24bd0 71 6c 69 74 65 33 52 75 6e 56 61 63 75 75 6d 28  qlite3RunVacuum(
24be0 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 29  &p->zErrMsg, db)
24bf0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
24c00 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f  afetyOn(db) ) go
24c10 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
24c20 6d 69 73 75 73 65 3b 0a 20 20 62 72 65 61 6b 3b  misuse;.  break;
24c30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
24c40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
24c50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
24c60 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56  /* Opcode: IncrV
24c70 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20 2a 20  acuum P1 P2 * * 
24c80 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  *.**.** Perform 
24c90 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
24ca0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
24cb0 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64 75 72   vacuum procedur
24cc0 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64  e on.** the P1 d
24cd0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
24ce0 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e 69 73  vacuum has finis
24cf0 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73  hed, jump to ins
24d00 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20  truction.** P2. 
24d10 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
24d20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
24d30 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
24d40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72  .*/.case OP_Incr
24d50 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20 20 20  Vacuum: {       
24d60 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74   /* jump */.  Bt
24d70 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73  ree *pBt;..  ass
24d80 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
24d90 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
24da0 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
24db0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20  (p->btreeMask & 
24dc0 28 31 3c 3c 70 4f 70 2d 3e 70 31 29 29 21 3d 30  (1<<pOp->p1))!=0
24dd0 20 29 3b 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e   );.  pBt = db->
24de0 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74  aDb[pOp->p1].pBt
24df0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24e00 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
24e10 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pBt);.  if( rc==
24e20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
24e30 20 20 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20     pc = pOp->p2 
24e40 2d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  - 1;.    rc = SQ
24e50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 62  LITE_OK;.  }.  b
24e60 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  reak;.}.#endif..
24e70 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70 69 72  /* Opcode: Expir
24e80 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  e P1 * * * *.**.
24e90 2a 2a 20 43 61 75 73 65 20 70 72 65 63 6f 6d 70  ** Cause precomp
24ea0 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  iled statements 
24eb0 74 6f 20 62 65 63 6f 6d 65 20 65 78 70 69 72 65  to become expire
24ec0 64 2e 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  d. An expired st
24ed0 61 74 65 6d 65 6e 74 0a 2a 2a 20 66 61 69 6c 73  atement.** fails
24ee0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 63   with an error c
24ef0 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 43  ode of SQLITE_SC
24f00 48 45 4d 41 20 69 66 20 69 74 20 69 73 20 65 76  HEMA if it is ev
24f10 65 72 20 65 78 65 63 75 74 65 64 20 0a 2a 2a 20  er executed .** 
24f20 28 76 69 61 20 73 71 6c 69 74 65 33 5f 73 74 65  (via sqlite3_ste
24f30 70 28 29 29 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  p())..** .** If 
24f40 50 31 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c  P1 is 0, then al
24f50 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
24f60 20 62 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e   become expired.
24f70 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65   If P1 is non-ze
24f80 72 6f 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79  ro,.** then only
24f90 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65   the currently e
24fa0 78 65 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65  xecuting stateme
24fb0 6e 74 20 69 73 20 61 66 66 65 63 74 65 64 2e 20  nt is affected. 
24fc0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 78 70 69  .*/.case OP_Expi
24fd0 72 65 3a 20 7b 0a 20 20 69 66 28 20 21 70 4f 70  re: {.  if( !pOp
24fe0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->p1 ){.    sqli
24ff0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
25000 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
25010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
25020 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
25030 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69  }.  break;.}..#i
25040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25050 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
25060 2a 20 4f 70 63 6f 64 65 3a 20 54 61 62 6c 65 4c  * Opcode: TableL
25070 6f 63 6b 20 50 31 20 50 32 20 50 33 20 50 34 20  ock P1 P2 P3 P4 
25080 2a 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  *.**.** Obtain a
25090 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74 69   lock on a parti
250a0 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68 69  cular table. Thi
250b0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
250c0 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 0a   only used when.
250d0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  ** the shared-ca
250e0 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
250f0 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  nabled. .**.** I
25100 66 20 50 31 20 69 73 20 20 74 68 65 20 69 6e 64  f P1 is  the ind
25110 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
25120 73 65 20 69 6e 20 73 71 6c 69 74 65 33 2e 61 44  se in sqlite3.aD
25130 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
25140 61 73 65 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20  ase.** on which 
25150 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 63 71 75  the lock is acqu
25160 69 72 65 64 2e 20 20 41 20 72 65 61 64 6c 6f 63  ired.  A readloc
25170 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 66  k is obtained if
25180 20 50 33 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77   P3==0 or.** a w
25190 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d  rite lock if P3=
251a0 3d 31 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e  =1..**.** P2 con
251b0 74 61 69 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70  tains the root-p
251c0 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  age of the table
251d0 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20   to lock..**.** 
251e0 50 34 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  P4 contains a po
251f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  inter to the nam
25200 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
25210 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69  eing locked. Thi
25220 73 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65  s is only.** use
25230 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  d to generate an
25240 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
25250 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
25260 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
25270 2f 0a 63 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c  /.case OP_TableL
25280 6f 63 6b 3a 20 7b 0a 20 20 69 6e 74 20 70 31 20  ock: {.  int p1 
25290 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20 75 38  = pOp->p1; .  u8
252a0 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28   isWriteLock = (
252b0 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73  u8)pOp->p3;.  as
252c0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
252d0 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  1<db->nDb );.  a
252e0 73 73 65 72 74 28 20 28 70 2d 3e 62 74 72 65 65  ssert( (p->btree
252f0 4d 61 73 6b 20 26 20 28 31 3c 3c 70 31 29 29 21  Mask & (1<<p1))!
25300 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25310 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20 7c  isWriteLock==0 |
25320 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 31  | isWriteLock==1
25330 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
25340 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65  e3BtreeLockTable
25350 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74  (db->aDb[p1].pBt
25360 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69  , pOp->p2, isWri
25370 74 65 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72  teLock);.  if( r
25380 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
25390 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
253a0 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
253b0 7a 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  z;.    sqlite3Se
253c0 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
253d0 4d 73 67 2c 20 64 62 2c 20 22 64 61 74 61 62 61  Msg, db, "databa
253e0 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
253f0 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 7d  ed: %s", z);.  }
25400 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
25410 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
25420 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
25430 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
25440 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
25450 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
25460 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a  Begin * * * P4 *
25470 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65  .**.** P4 may be
25480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
25490 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
254a0 72 75 63 74 75 72 65 2e 20 49 66 20 73 6f 2c 20  ructure. If so, 
254b0 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65  call the .** xBe
254c0 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  gin method for t
254d0 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  hat table..**.**
254e0 20 41 6c 73 6f 2c 20 77 68 65 74 68 65 72 20 6f   Also, whether o
254f0 72 20 6e 6f 74 20 50 34 20 69 73 20 73 65 74 2c  r not P4 is set,
25500 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   check that this
25510 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 63 61   is not being ca
25520 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74  lled from.** wit
25530 68 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  hin a callback t
25540 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
25550 65 20 78 53 79 6e 63 28 29 20 6d 65 74 68 6f 64  e xSync() method
25560 2e 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20  . If it is, set 
25570 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  the.** error cod
25580 65 20 74 6f 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  e to SQLITE_LOCK
25590 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ED..*/.case OP_V
255a0 42 65 67 69 6e 3a 20 7b 0a 20 20 73 71 6c 69 74  Begin: {.  sqlit
255b0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d  e3_vtab *pVtab =
255c0 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a   pOp->p4.pVtab;.
255d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
255e0 61 62 42 65 67 69 6e 28 64 62 2c 20 70 56 74 61  abBegin(db, pVta
255f0 62 29 3b 0a 20 20 69 66 28 20 70 56 74 61 62 20  b);.  if( pVtab 
25600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
25610 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
25620 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
25630 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45  rMsg = pVtab->zE
25640 72 72 4d 73 67 3b 0a 20 20 20 20 70 56 74 61 62  rrMsg;.    pVtab
25650 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
25660 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
25670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
25680 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
25690 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
256a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
256b0 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
256c0 20 56 43 72 65 61 74 65 20 50 31 20 2a 20 2a 20   VCreate P1 * * 
256d0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
256e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
256f0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20  irtual table in 
25700 64 61 74 61 62 61 73 65 20 50 31 2e 20 43 61 6c  database P1. Cal
25710 6c 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65  l the xCreate me
25720 74 68 6f 64 0a 2a 2a 20 66 6f 72 20 74 68 61 74  thod.** for that
25730 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
25740 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a 20 20  OP_VCreate: {.  
25750 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
25760 43 61 6c 6c 43 72 65 61 74 65 28 64 62 2c 20 70  CallCreate(db, p
25770 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
25780 7a 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  z, &p->zErrMsg);
25790 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
257a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
257b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
257c0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
257d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
257e0 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  BLE./* Opcode: V
257f0 44 65 73 74 72 6f 79 20 50 31 20 2a 20 2a 20 50  Destroy P1 * * P
25800 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
25810 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69  the name of a vi
25820 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64  rtual table in d
25830 61 74 61 62 61 73 65 20 50 31 2e 20 20 43 61 6c  atabase P1.  Cal
25840 6c 20 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d  l the xDestroy m
25850 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74  ethod.** of that
25860 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20   table..*/.case 
25870 4f 50 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20  OP_VDestroy: {. 
25880 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
25890 20 3d 20 32 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 2;.  rc = sql
258a0 69 74 65 33 56 74 61 62 43 61 6c 6c 44 65 73 74  ite3VtabCallDest
258b0 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  roy(db, pOp->p1,
258c0 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 70   pOp->p4.z);.  p
258d0 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
258e0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23   0;.  break;.}.#
258f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25900 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
25910 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
25920 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
25930 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
25940 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20 50  : VOpen P1 * * P
25950 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20  4 *.**.** P4 is 
25960 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76  a pointer to a v
25970 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
25980 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f  ect, an sqlite3_
25990 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a  vtab structure..
259a0 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73 6f  ** P1 is a curso
259b0 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73 20  r number.  This 
259c0 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20 61 20 63  opcode opens a c
259d0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 76 69 72  ursor to the vir
259e0 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  tual.** table an
259f0 64 20 73 74 6f 72 65 73 20 74 68 61 74 20 63 75  d stores that cu
25a00 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a 63  rsor in P1..*/.c
25a10 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b 0a  ase OP_VOpen: {.
25a20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
25a30 75 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ur = 0;.  sqlite
25a40 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
25a50 56 74 61 62 43 75 72 73 6f 72 20 3d 20 30 3b 0a  VtabCursor = 0;.
25a60 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
25a70 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
25a80 2e 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65  .pVtab;.  sqlite
25a90 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
25aa0 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d 6f 64  e = (sqlite3_mod
25ab0 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70 4d 6f  ule *)pVtab->pMo
25ac0 64 75 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  dule;..  assert(
25ad0 70 56 74 61 62 20 26 26 20 70 4d 6f 64 75 6c 65  pVtab && pModule
25ae0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
25af0 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29 20  SafetyOff(db) ) 
25b00 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
25b10 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 72 63 20 3d  o_misuse;.  rc =
25b20 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28   pModule->xOpen(
25b30 70 56 74 61 62 2c 20 26 70 56 74 61 62 43 75 72  pVtab, &pVtabCur
25b40 73 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  sor);.  sqlite3D
25b50 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
25b60 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
25b70 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72  Msg = pVtab->zEr
25b80 72 4d 73 67 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  rMsg;.  pVtab->z
25b90 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66  ErrMsg = 0;.  if
25ba0 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  ( sqlite3SafetyO
25bb0 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f  n(db) ) goto abo
25bc0 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65  rt_due_to_misuse
25bd0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
25be0 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20  K==rc ){.    /* 
25bf0 49 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74  Initialize sqlit
25c00 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
25c10 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  ase class */.   
25c20 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
25c30 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20  tab = pVtab;..  
25c40 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 73 65 20    /* Initialise 
25c50 76 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65  vdbe cursor obje
25c60 63 74 20 2a 2f 0a 20 20 20 20 70 43 75 72 20 3d  ct */.    pCur =
25c70 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
25c80 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 70 4f 70  p, pOp->p1, &pOp
25c90 5b 2d 31 5d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  [-1], -1, 0);.  
25ca0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
25cb0 20 20 20 20 70 43 75 72 2d 3e 70 56 74 61 62 43      pCur->pVtabC
25cc0 75 72 73 6f 72 20 3d 20 70 56 74 61 62 43 75 72  ursor = pVtabCur
25cd0 73 6f 72 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  sor;.      pCur-
25ce0 3e 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62  >pModule = pVtab
25cf0 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70  Cursor->pVtab->p
25d00 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 7d 65 6c 73  Module;.    }els
25d10 65 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  e{.      db->mal
25d20 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
25d30 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
25d40 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
25d50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
25d60 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
25d70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
25d80 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
25d90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25da0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
25db0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74  /* Opcode: VFilt
25dc0 65 72 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  er P1 P2 P3 P4 *
25dd0 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 63  .**.** P1 is a c
25de0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 75 73 69  ursor opened usi
25df0 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32 20 69 73  ng VOpen.  P2 is
25e00 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 6a   an address to j
25e10 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65  ump to if.** the
25e20 20 66 69 6c 74 65 72 65 64 20 72 65 73 75 6c 74   filtered result
25e30 20 73 65 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a   set is empty..*
25e40 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69 74 68 65  *.** P4 is eithe
25e50 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73 74 72 69  r NULL or a stri
25e60 6e 67 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  ng that was gene
25e70 72 61 74 65 64 20 62 79 20 74 68 65 20 78 42 65  rated by the xBe
25e80 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f  stIndex.** metho
25e90 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e  d of the module.
25ea0 20 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 61    The interpreta
25eb0 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 34 20 73  tion of the P4 s
25ec0 74 72 69 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a  tring is left.**
25ed0 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c 65 20 69   to the module i
25ee0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
25ef0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
25f00 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 46 69   invokes the xFi
25f10 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74  lter method on t
25f20 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
25f30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
25f40 20 50 31 2e 20 20 54 68 65 20 69 6e 74 65 67 65   P1.  The intege
25f50 72 20 71 75 65 72 79 20 70 6c 61 6e 20 70 61 72  r query plan par
25f60 61 6d 65 74 65 72 20 74 6f 20 78 46 69 6c 74 65  ameter to xFilte
25f70 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  r is stored in r
25f80 65 67 69 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52  egister.** P3. R
25f90 65 67 69 73 74 65 72 20 50 33 2b 31 20 73 74 6f  egister P3+1 sto
25fa0 72 65 73 20 74 68 65 20 61 72 67 63 20 70 61 72  res the argc par
25fb0 61 6d 65 74 65 72 20 74 6f 20 62 65 20 70 61 73  ameter to be pas
25fc0 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46  sed to the.** xF
25fd0 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 52 65  ilter method. Re
25fe0 67 69 73 74 65 72 73 20 50 33 2b 32 2e 2e 50 33  gisters P3+2..P3
25ff0 2b 31 2b 61 72 67 63 20 61 72 65 20 74 68 65 20  +1+argc are the 
26000 61 72 67 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e  argc.** addition
26010 61 6c 20 70 61 72 61 6d 65 74 65 72 73 20 77 68  al parameters wh
26020 69 63 68 20 61 72 65 20 70 61 73 73 65 64 20 74  ich are passed t
26030 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20 61 73 20  o.** xFilter as 
26040 61 72 67 76 2e 20 52 65 67 69 73 74 65 72 20 50  argv. Register P
26050 33 2b 32 20 62 65 63 6f 6d 65 73 20 61 72 67 76  3+2 becomes argv
26060 5b 30 5d 20 77 68 65 6e 20 70 61 73 73 65 64 20  [0] when passed 
26070 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a  to xFilter..**.*
26080 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  * A jump is made
26090 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 72 65   to P2 if the re
260a0 73 75 6c 74 20 73 65 74 20 61 66 74 65 72 20 66  sult set after f
260b0 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c 64 20 62  iltering would b
260c0 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65  e empty..*/.case
260d0 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20   OP_VFilter: {  
260e0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e   /* jump */.  in
260f0 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 69 51  t nArg;.  int iQ
26100 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71  uery;.  const sq
26110 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
26120 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51  odule;.  Mem *pQ
26130 75 65 72 79 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  uery = &p->aMem[
26140 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 4d 65 6d 20  pOp->p3];.  Mem 
26150 2a 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79  *pArgc = &pQuery
26160 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  [1];.  sqlite3_v
26170 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
26180 62 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74  bCursor;.  sqlit
26190 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
261a0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
261b0 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
261c0 4f 70 2d 3e 70 31 5d 3b 0a 0a 20 20 52 45 47 49  Op->p1];..  REGI
261d0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
261e0 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 61  p3, pQuery);.  a
261f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74  ssert( pCur->pVt
26200 61 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 56  abCursor );.  pV
26210 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 75 72  tabCursor = pCur
26220 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
26230 20 70 56 74 61 62 20 3d 20 70 56 74 61 62 43 75   pVtab = pVtabCu
26240 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70  rsor->pVtab;.  p
26250 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
26260 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47  pModule;..  /* G
26270 72 61 62 20 74 68 65 20 69 6e 64 65 78 20 6e 75  rab the index nu
26280 6d 62 65 72 20 61 6e 64 20 61 72 67 63 20 70 61  mber and argc pa
26290 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
262a0 73 65 72 74 28 20 28 70 51 75 65 72 79 2d 3e 66  sert( (pQuery->f
262b0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30  lags&MEM_Int)!=0
262c0 20 26 26 20 70 41 72 67 63 2d 3e 66 6c 61 67 73   && pArgc->flags
262d0 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e  ==MEM_Int );.  n
262e0 41 72 67 20 3d 20 28 69 6e 74 29 70 41 72 67 63  Arg = (int)pArgc
262f0 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65 72 79 20  ->u.i;.  iQuery 
26300 3d 20 28 69 6e 74 29 70 51 75 65 72 79 2d 3e 75  = (int)pQuery->u
26310 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  .i;..  /* Invoke
26320 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74   the xFilter met
26330 68 6f 64 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 69  hod */.  {.    i
26340 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20  nt res = 0;.    
26350 69 6e 74 20 69 3b 0a 20 20 20 20 4d 65 6d 20 2a  int i;.    Mem *
26360 2a 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72  *apArg = p->apAr
26370 67 3b 0a 20 20 20 20 66 6f 72 28 69 20 3d 20 30  g;.    for(i = 0
26380 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
26390 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d        apArg[i] =
263a0 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a 20 20   &pArgc[i+1];.  
263b0 20 20 20 20 73 74 6f 72 65 54 79 70 65 49 6e 66      storeTypeInf
263c0 6f 28 61 70 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  o(apArg[i], 0);.
263d0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
263e0 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
263f0 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  db) ) goto abort
26400 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a  _due_to_misuse;.
26410 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
26420 6f 63 6b 28 70 56 74 61 62 29 3b 0a 20 20 20 20  ock(pVtab);.    
26430 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
26440 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 70 4d  = 1;.    rc = pM
26450 6f 64 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70  odule->xFilter(p
26460 56 74 61 62 43 75 72 73 6f 72 2c 20 69 51 75 65  VtabCursor, iQue
26470 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e  ry, pOp->p4.z, n
26480 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 20  Arg, apArg);.   
26490 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
264a0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
264b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
264c0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
264d0 7a 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d  zErrMsg = pVtab-
264e0 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 56  >zErrMsg;.    pV
264f0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
26500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
26510 62 55 6e 6c 6f 63 6b 28 64 62 2c 20 70 56 74 61  bUnlock(db, pVta
26520 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
26530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26540 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65     res = pModule
26550 2d 3e 78 45 6f 66 28 70 56 74 61 62 43 75 72 73  ->xEof(pVtabCurs
26560 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
26570 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
26580 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62  On(db) ) goto ab
26590 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73  ort_due_to_misus
265a0 65 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 20  e;..    if( res 
265b0 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 70 4f  ){.      pc = pO
265c0 70 2d 3e 70 32 20 2d 20 31 3b 0a 20 20 20 20 7d  p->p2 - 1;.    }
265d0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 75 6c  .  }.  pCur->nul
265e0 6c 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 62 72 65  lRow = 0;..  bre
265f0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
26600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
26610 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
26620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26630 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
26640 20 4f 70 63 6f 64 65 3a 20 56 52 6f 77 69 64 20   Opcode: VRowid 
26650 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
26660 2a 20 53 74 6f 72 65 20 69 6e 74 6f 20 72 65 67  * Store into reg
26670 69 73 74 65 72 20 50 32 20 20 74 68 65 20 72 6f  ister P2  the ro
26680 77 69 64 20 6f 66 0a 2a 2a 20 74 68 65 20 76 69  wid of.** the vi
26690 72 74 75 61 6c 2d 74 61 62 6c 65 20 74 68 61 74  rtual-table that
266a0 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 69   the P1 cursor i
266b0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
266c0 2f 0a 63 61 73 65 20 4f 50 5f 56 52 6f 77 69 64  /.case OP_VRowid
266d0 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
266e0 2f 2a 20 6f 75 74 32 2d 70 72 65 72 65 6c 65 61  /* out2-prerelea
266f0 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
26700 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
26710 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
26720 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
26730 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 52 6f  sqlite_int64 iRo
26740 77 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  w;.  VdbeCursor 
26750 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72  *pCur = p->apCsr
26760 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 0a 20 20 61 73  [pOp->p1];..  as
26770 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61  sert( pCur->pVta
26780 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  bCursor );.  if(
26790 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29   pCur->nullRow )
267a0 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  {.    break;.  }
267b0 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d  .  pVtab = pCur-
267c0 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  >pVtabCursor->pV
267d0 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d  tab;.  pModule =
267e0 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
267f0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75  .  assert( pModu
26800 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a 20 20  le->xRowid );.  
26810 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74  if( sqlite3Safet
26820 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20  yOff(db) ) goto 
26830 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
26840 75 73 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64  use;.  rc = pMod
26850 75 6c 65 2d 3e 78 52 6f 77 69 64 28 70 43 75 72  ule->xRowid(pCur
26860 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 2c 20 26  ->pVtabCursor, &
26870 69 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  iRow);.  sqlite3
26880 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
26890 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
268a0 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45  rMsg = pVtab->zE
268b0 72 72 4d 73 67 3b 0a 20 20 70 56 74 61 62 2d 3e  rrMsg;.  pVtab->
268c0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
268d0 66 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  f( sqlite3Safety
268e0 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62  On(db) ) goto ab
268f0 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73  ort_due_to_misus
26900 65 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46  e;.  MemSetTypeF
26910 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
26920 74 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  t);.  pOut->u.i 
26930 3d 20 69 52 6f 77 3b 0a 20 20 62 72 65 61 6b 3b  = iRow;.  break;
26940 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
26950 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
26960 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
26970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
26980 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
26990 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20 50 31  code: VColumn P1
269a0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
269b0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
269c0 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63 6f   of the P2-th co
269d0 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
269e0 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  ow of the virtua
269f0 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  l-table that the
26a00 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72 20 69   .** P1 cursor i
26a10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 6e  s pointing to in
26a20 74 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  to register P3..
26a30 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f 6c 75  */.case OP_VColu
26a40 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  mn: {.  sqlite3_
26a50 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63  vtab *pVtab;.  c
26a60 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
26a70 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20  ule *pModule;.  
26a80 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20 73 71  Mem *pDest;.  sq
26a90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 73 43  lite3_context sC
26aa0 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62 65 43  ontext;..  VdbeC
26ab0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d  ursor *pCur = p-
26ac0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
26ad0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26ae0 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 3b 0a  >pVtabCursor );.
26af0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
26b00 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d  3>0 && pOp->p3<=
26b10 70 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 70 44 65  p->nMem );.  pDe
26b20 73 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f  st = &p->aMem[pO
26b30 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 70 43  p->p3];.  if( pC
26b40 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  ur->nullRow ){. 
26b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
26b60 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
26b70 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
26b80 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e    pVtab = pCur->
26b90 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
26ba0 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20  ab;.  pModule = 
26bb0 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
26bc0 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c    assert( pModul
26bd0 65 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  e->xColumn );.  
26be0 6d 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74  memset(&sContext
26bf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e  , 0, sizeof(sCon
26c00 74 65 78 74 29 29 3b 0a 0a 20 20 2f 2a 20 54 68  text));..  /* Th
26c10 65 20 6f 75 74 70 75 74 20 63 65 6c 6c 20 6d 61  e output cell ma
26c20 79 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  y already have a
26c30 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
26c40 64 2e 20 4d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  d. Move.  ** the
26c50 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
26c60 73 20 74 6f 20 73 43 6f 6e 74 65 78 74 2e 73 20  s to sContext.s 
26c70 73 6f 20 69 6e 20 63 61 73 65 20 74 68 65 20 75  so in case the u
26c80 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 0a 20 20  ser-function .  
26c90 2a 2a 20 63 61 6e 20 75 73 65 20 74 68 65 20 61  ** can use the a
26ca0 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64  lready allocated
26cb0 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
26cc0 6f 66 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  of allocating a 
26cd0 0a 20 20 2a 2a 20 6e 65 77 20 6f 6e 65 2e 0a 20  .  ** new one.. 
26ce0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
26cf0 65 4d 65 6d 4d 6f 76 65 28 26 73 43 6f 6e 74 65  eMemMove(&sConte
26d00 78 74 2e 73 2c 20 70 44 65 73 74 29 3b 0a 20 20  xt.s, pDest);.  
26d10 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
26d20 73 43 6f 6e 74 65 78 74 2e 73 2c 20 4d 45 4d 5f  sContext.s, MEM_
26d30 4e 75 6c 6c 29 3b 0a 0a 20 20 69 66 28 20 73 71  Null);..  if( sq
26d40 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
26d50 62 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  b) ) goto abort_
26d60 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20  due_to_misuse;. 
26d70 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78   rc = pModule->x
26d80 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 70 56 74  Column(pCur->pVt
26d90 61 62 43 75 72 73 6f 72 2c 20 26 73 43 6f 6e 74  abCursor, &sCont
26da0 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20  ext, pOp->p2);. 
26db0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26dc0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
26dd0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 70    p->zErrMsg = p
26de0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20  Vtab->zErrMsg;. 
26df0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
26e00 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  = 0;..  /* Copy 
26e10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
26e20 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  e function to th
26e30 65 20 50 33 20 72 65 67 69 73 74 65 72 2e 20 57  e P3 register. W
26e40 65 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 72  e.  ** do this r
26e50 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
26e60 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
26e70 72 72 6f 72 20 6f 63 63 75 72 65 64 20 74 6f 20  rror occured to 
26e80 65 6e 73 75 72 65 20 61 6e 79 0a 20 20 2a 2a 20  ensure any.  ** 
26e90 64 79 6e 61 6d 69 63 20 61 6c 6c 6f 63 61 74 69  dynamic allocati
26ea0 6f 6e 20 69 6e 20 73 43 6f 6e 74 65 78 74 2e 73  on in sContext.s
26eb0 20 28 61 20 4d 65 6d 20 73 74 72 75 63 74 29 20   (a Mem struct) 
26ec0 69 73 20 20 72 65 6c 65 61 73 65 64 2e 0a 20 20  is  released..  
26ed0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
26ee0 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 26  ChangeEncoding(&
26ef0 73 43 6f 6e 74 65 78 74 2e 73 2c 20 65 6e 63 6f  sContext.s, enco
26f00 64 69 6e 67 29 3b 0a 20 20 52 45 47 49 53 54 45  ding);.  REGISTE
26f10 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
26f20 20 70 44 65 73 74 29 3b 0a 20 20 73 71 6c 69 74   pDest);.  sqlit
26f30 65 33 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 44  e3VdbeMemMove(pD
26f40 65 73 74 2c 20 26 73 43 6f 6e 74 65 78 74 2e 73  est, &sContext.s
26f50 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
26f60 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74 29 3b  BLOBSIZE(pDest);
26f70 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ..  if( sqlite3S
26f80 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b 0a 20  afetyOn(db) ){. 
26f90 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
26fa0 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20 7d  e_to_misuse;.  }
26fb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
26fc0 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 44 65 73  beMemTooBig(pDes
26fd0 74 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  t) ){.    goto t
26fe0 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72  oo_big;.  }.  br
26ff0 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
27000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27010 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
27020 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27030 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
27040 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74 20  * Opcode: VNext 
27050 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
27060 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74 75 61  * Advance virtua
27070 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20 74 68  l table P1 to th
27080 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 69 74  e next row in it
27090 73 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  s result set and
270a0 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  .** jump to inst
270b0 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72 2c  ruction P2.  Or,
270c0 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
270d0 74 61 62 6c 65 20 68 61 73 20 72 65 61 63 68 65  table has reache
270e0 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  d.** the end of 
270f0 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 2c 20  its result set, 
27100 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
27110 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
27120 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
27130 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20 20  se OP_VNext: {  
27140 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73 71   /* jump */.  sq
27150 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
27160 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
27170 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
27180 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  le;.  int res = 
27190 30 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72  0;..  VdbeCursor
271a0 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73   *pCur = p->apCs
271b0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
271c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 56 74 61  sert( pCur->pVta
271d0 62 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  bCursor );.  if(
271e0 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29   pCur->nullRow )
271f0 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  {.    break;.  }
27200 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d  .  pVtab = pCur-
27210 3e 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56  >pVtabCursor->pV
27220 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d  tab;.  pModule =
27230 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
27240 0a 20 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75  .  assert( pModu
27250 6c 65 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20  le->xNext );..  
27260 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e  /* Invoke the xN
27270 65 78 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  ext() method of 
27280 74 68 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72  the module. Ther
27290 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20  e is no way for 
272a0 74 68 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79  the.  ** underly
272b0 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
272c0 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  on to return an 
272d0 65 72 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63  error if one occ
272e0 75 72 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  urs during.  ** 
272f0 78 4e 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64  xNext(). Instead
27300 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
27310 63 75 72 73 2c 20 74 72 75 65 20 69 73 20 72 65  curs, true is re
27320 74 75 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69  turned (indicati
27330 6e 67 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61  ng that .  ** da
27340 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29  ta is available)
27350 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
27360 6f 64 65 20 72 65 74 75 72 6e 65 64 20 77 68 65  ode returned whe
27370 6e 20 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a  n xColumn or.  *
27380 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74  * some other met
27390 68 6f 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f  hod is next invo
273a0 6b 65 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20  ked on the save 
273b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75  virtual table cu
273c0 72 73 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rsor..  */.  if(
273d0 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66   sqlite3SafetyOf
273e0 66 28 64 62 29 20 29 20 67 6f 74 6f 20 61 62 6f  f(db) ) goto abo
273f0 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73 75 73 65  rt_due_to_misuse
27400 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c  ;.  sqlite3VtabL
27410 6f 63 6b 28 70 56 74 61 62 29 3b 0a 20 20 70 2d  ock(pVtab);.  p-
27420 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
27430 31 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  1;.  rc = pModul
27440 65 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 70  e->xNext(pCur->p
27450 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 70  VtabCursor);.  p
27460 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
27470 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
27480 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
27490 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
274a0 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  g = pVtab->zErrM
274b0 73 67 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72  sg;.  pVtab->zEr
274c0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
274d0 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 64 62  te3VtabUnlock(db
274e0 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
274f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27500 0a 20 20 20 20 72 65 73 20 3d 20 70 4d 6f 64 75  .    res = pModu
27510 6c 65 2d 3e 78 45 6f 66 28 70 43 75 72 2d 3e 70  le->xEof(pCur->p
27520 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d  VtabCursor);.  }
27530 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61  .  if( sqlite3Sa
27540 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74  fetyOn(db) ) got
27550 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
27560 69 73 75 73 65 3b 0a 0a 20 20 69 66 28 20 21 72  isuse;..  if( !r
27570 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
27580 74 68 65 72 65 20 69 73 20 64 61 74 61 2c 20 6a  there is data, j
27590 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20  ump to P2 */.   
275a0 20 70 63 20 3d 20 70 4f 70 2d 3e 70 32 20 2d 20   pc = pOp->p2 - 
275b0 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  1;.  }.  break;.
275c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
275d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
275e0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
275f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27600 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
27610 6f 64 65 3a 20 56 52 65 6e 61 6d 65 20 50 31 20  ode: VRename P1 
27620 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
27630 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
27640 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  o a virtual tabl
27650 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c  e object, an sql
27660 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
27670 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ure..** This opc
27680 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
27690 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 78 52  corresponding xR
276a0 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68  ename method. Th
276b0 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65  e value.** in re
276c0 67 69 73 74 65 72 20 50 31 20 69 73 20 70 61 73  gister P1 is pas
276d0 73 65 64 20 61 73 20 74 68 65 20 7a 4e 61 6d 65  sed as the zName
276e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
276f0 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e   xRename method.
27700 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e  .*/.case OP_VRen
27710 61 6d 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  ame: {.  sqlite3
27720 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
27730 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20  Op->p4.pVtab;.  
27740 4d 65 6d 20 2a 70 4e 61 6d 65 20 3d 20 26 70 2d  Mem *pName = &p-
27750 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  >aMem[pOp->p1];.
27760 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 2d    assert( pVtab-
27770 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d  >pModule->xRenam
27780 65 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  e );.  REGISTER_
27790 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
277a0 4e 61 6d 65 29 3b 0a 0a 20 20 53 74 72 69 6e 67  Name);..  String
277b0 69 66 79 28 70 4e 61 6d 65 2c 20 65 6e 63 6f 64  ify(pName, encod
277c0 69 6e 67 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  ing);..  if( sql
277d0 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
277e0 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
277f0 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20  ue_to_misuse;.  
27800 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
27810 70 56 74 61 62 29 3b 0a 20 20 72 63 20 3d 20 70  pVtab);.  rc = p
27820 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
27830 52 65 6e 61 6d 65 28 70 56 74 61 62 2c 20 70 4e  Rename(pVtab, pN
27840 61 6d 65 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  ame->z);.  sqlit
27850 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
27860 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
27870 45 72 72 4d 73 67 20 3d 20 70 56 74 61 62 2d 3e  ErrMsg = pVtab->
27880 7a 45 72 72 4d 73 67 3b 0a 20 20 70 56 74 61 62  zErrMsg;.  pVtab
27890 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
278a0 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
278b0 63 6b 28 64 62 2c 20 70 56 74 61 62 29 3b 0a 20  ck(db, pVtab);. 
278c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 61 66 65   if( sqlite3Safe
278d0 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20  tyOn(db) ) goto 
278e0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d 69 73  abort_due_to_mis
278f0 75 73 65 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d  use;..  break;.}
27900 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
27910 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
27920 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
27930 6f 64 65 3a 20 56 55 70 64 61 74 65 20 50 31 20  ode: VUpdate P1 
27940 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
27950 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
27960 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74 61   to a virtual ta
27970 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20 73  ble object, an s
27980 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
27990 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20 6f  cture..** This o
279a0 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68  pcode invokes th
279b0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
279c0 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e 20  xUpdate method. 
279d0 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  P2 values.** are
279e0 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f   contiguous memo
279f0 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e  ry cells startin
27a00 67 20 61 74 20 50 33 20 74 6f 20 70 61 73 73 20  g at P3 to pass 
27a10 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 20 0a  to the xUpdate .
27a20 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 54  ** invocation. T
27a30 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
27a40 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20 63  ster (P3+P2-1) c
27a50 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
27a60 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d 65  e .** p2th eleme
27a70 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76 20 61  nt of the argv a
27a80 72 72 61 79 20 70 61 73 73 65 64 20 74 6f 20 78  rray passed to x
27a90 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  Update..**.** Th
27aa0 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64  e xUpdate method
27ab0 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45 54   will do a DELET
27ac0 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20 6f  E or an INSERT o
27ad0 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20 61  r both..** The a
27ae0 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20 28  rgv[0] element (
27af0 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64  which correspond
27b00 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  s to memory cell
27b10 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20 72   P3).** is the r
27b20 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74 6f  owid of a row to
27b30 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72 67   delete.  If arg
27b40 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68 65  v[0] is NULL the
27b50 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69 6f  n no .** deletio
27b60 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20 61  n occurs.  The a
27b70 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20 69  rgv[1] element i
27b80 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  s the rowid of t
27b90 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e 20  he new .** row. 
27ba0 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55 4c   This can be NUL
27bb0 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 69  L to have the vi
27bc0 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c 65  rtual table sele
27bd0 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72  ct the new .** r
27be0 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66 2e  owid for itself.
27bf0 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
27c00 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
27c10 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20 74   array are .** t
27c20 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c  he values of col
27c30 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77 20  umns in the new 
27c40 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 32  row..**.** If P2
27c50 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73 65  ==1 then no inse
27c60 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  rt is performed.
27c70 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65    argv[0] is the
27c80 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20 72   rowid of.** a r
27c90 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a 2a  ow to delete..**
27ca0 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f 6c  .** P1 is a bool
27cb0 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74 20  ean flag. If it 
27cc0 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
27cd0 6e 64 20 74 68 65 20 78 55 70 64 61 74 65 20 63  nd the xUpdate c
27ce0 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  all.** is succes
27cf0 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20 76  sful, then the v
27d00 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
27d10 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
27d20 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a 2a  sert_rowid() .**
27d30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
27d40 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77 69  alue of the rowi
27d50 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a 75  d for the row ju
27d60 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  st inserted..*/.
27d70 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a  case OP_VUpdate:
27d80 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
27d90 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
27da0 70 34 2e 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  p4.pVtab;.  sqli
27db0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
27dc0 75 6c 65 20 3d 20 28 73 71 6c 69 74 65 33 5f 6d  ule = (sqlite3_m
27dd0 6f 64 75 6c 65 20 2a 29 70 56 74 61 62 2d 3e 70  odule *)pVtab->p
27de0 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41  Module;.  int nA
27df0 72 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  rg = pOp->p2;.  
27e00 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
27e10 79 70 65 3d 3d 50 34 5f 56 54 41 42 20 29 3b 0a  ype==P4_VTAB );.
27e20 20 20 69 66 28 20 70 4d 6f 64 75 6c 65 2d 3e 78    if( pModule->x
27e30 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  Update==0 ){.   
27e40 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
27e50 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
27e60 62 2c 20 22 72 65 61 64 2d 6f 6e 6c 79 20 74 61  b, "read-only ta
27e70 62 6c 65 22 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble");.    rc = 
27e80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27e90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
27ea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 69 6e 74  ;.    sqlite_int
27eb0 36 34 20 72 6f 77 69 64 3b 0a 20 20 20 20 4d 65  64 rowid;.    Me
27ec0 6d 20 2a 2a 61 70 41 72 67 20 3d 20 70 2d 3e 61  m **apArg = p->a
27ed0 70 41 72 67 3b 0a 20 20 20 20 4d 65 6d 20 2a 70  pArg;.    Mem *p
27ee0 58 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  X = &p->aMem[pOp
27ef0 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69  ->p3];.    for(i
27f00 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
27f10 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 54 79 70  {.      storeTyp
27f20 65 49 6e 66 6f 28 70 58 2c 20 30 29 3b 0a 20 20  eInfo(pX, 0);.  
27f30 20 20 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 70      apArg[i] = p
27f40 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b 3b 0a 20  X;.      pX++;. 
27f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
27f60 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
27f70 29 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  ) ) goto abort_d
27f80 75 65 5f 74 6f 5f 6d 69 73 75 73 65 3b 0a 20 20  ue_to_misuse;.  
27f90 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
27fa0 6b 28 70 56 74 61 62 29 3b 0a 20 20 20 20 72 63  k(pVtab);.    rc
27fb0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64   = pModule->xUpd
27fc0 61 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c  ate(pVtab, nArg,
27fd0 20 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b   apArg, &rowid);
27fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
27ff0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
28000 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
28010 73 67 20 3d 20 70 56 74 61 62 2d 3e 7a 45 72 72  sg = pVtab->zErr
28020 4d 73 67 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e  Msg;.    pVtab->
28030 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
28040 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
28050 63 6b 28 64 62 2c 20 70 56 74 61 62 29 3b 0a 20  ck(db, pVtab);. 
28060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 61     if( sqlite3Sa
28070 66 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74  fetyOn(db) ) got
28080 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  o abort_due_to_m
28090 69 73 75 73 65 3b 0a 20 20 20 20 69 66 28 20 70  isuse;.    if( p
280a0 4f 70 2d 3e 70 31 20 26 26 20 72 63 3d 3d 53 51  Op->p1 && rc==SQ
280b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
280c0 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 31 20   assert( nArg>1 
280d0 26 26 20 61 70 41 72 67 5b 30 5d 20 26 26 20 28  && apArg[0] && (
280e0 61 70 41 72 67 5b 30 5d 2d 3e 66 6c 61 67 73 26  apArg[0]->flags&
280f0 4d 45 4d 5f 4e 75 6c 6c 29 20 29 3b 0a 20 20 20  MEM_Null) );.   
28100 20 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64     db->lastRowid
28110 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a   = rowid;.    }.
28120 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b      p->nChange++
28130 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
28140 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
28150 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28160 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
28170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
28180 45 52 5f 50 52 41 47 4d 41 53 0a 2f 2a 20 4f 70  ER_PRAGMAS./* Op
28190 63 6f 64 65 3a 20 50 61 67 65 63 6f 75 6e 74 20  code: Pagecount 
281a0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
281b0 2a 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72  * Write the curr
281c0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
281d0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
281e0 50 31 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  P1 to memory cel
281f0 6c 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  l P2..*/.case OP
28200 5f 50 61 67 65 63 6f 75 6e 74 3a 20 7b 20 20 20  _Pagecount: {   
28210 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
28220 2d 70 72 65 72 65 6c 65 61 73 65 20 2a 2f 0a 20  -prerelease */. 
28230 20 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d 3e 70   int p1 = pOp->p
28240 31 3b 20 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  1; .  int nPage;
28250 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28260 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
28270 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 70 31 5d  ager(db->aDb[p1]
28280 2e 70 42 74 29 3b 0a 0a 20 20 72 63 20 3d 20 73  .pBt);..  rc = s
28290 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
282a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
282b0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
282c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
282d0 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
282e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74  EM_Int;.    pOut
282f0 2d 3e 75 2e 69 20 3d 20 6e 50 61 67 65 3b 0a 20  ->u.i = nPage;. 
28300 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
28310 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
28320 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
28330 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 63 65  /* Opcode: Trace
28340 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
28350 2a 20 49 66 20 74 72 61 63 69 6e 67 20 69 73 20  * If tracing is 
28360 65 6e 61 62 6c 65 64 20 28 62 79 20 74 68 65 20  enabled (by the 
28370 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 29  sqlite3_trace())
28380 20 69 6e 74 65 72 66 61 63 65 2c 20 74 68 65 6e   interface, then
28390 0a 2a 2a 20 74 68 65 20 55 54 46 2d 38 20 73 74  .** the UTF-8 st
283a0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 65 64 20 69  ring contained i
283b0 6e 20 50 34 20 69 73 20 65 6d 69 74 74 65 64 20  n P4 is emitted 
283c0 6f 6e 20 74 68 65 20 74 72 61 63 65 20 63 61 6c  on the trace cal
283d0 6c 62 61 63 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f  lback..*/.case O
283e0 50 5f 54 72 61 63 65 3a 20 7b 0a 20 20 69 66 28  P_Trace: {.  if(
283f0 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20   pOp->p4.z ){.  
28400 20 20 69 66 28 20 64 62 2d 3e 78 54 72 61 63 65    if( db->xTrace
28410 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 54   ){.      db->xT
28420 72 61 63 65 28 64 62 2d 3e 70 54 72 61 63 65 41  race(db->pTraceA
28430 72 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  rg, pOp->p4.z);.
28440 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
28450 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66  ITE_DEBUG.    if
28460 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
28470 51 4c 49 54 45 5f 53 71 6c 54 72 61 63 65 29 21  QLITE_SqlTrace)!
28480 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28490 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
284a0 53 51 4c 2d 74 72 61 63 65 3a 20 25 73 5c 6e 22  SQL-trace: %s\n"
284b0 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
284c0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
284d0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20  LITE_DEBUG */.  
284e0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  }.  break;.}.#en
284f0 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  dif.../* Opcode:
28500 20 4e 6f 6f 70 20 2a 20 2a 20 2a 20 2a 20 2a 0a   Noop * * * * *.
28510 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  **.** Do nothing
28520 2e 20 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  .  This instruct
28530 69 6f 6e 20 69 73 20 6f 66 74 65 6e 20 75 73 65  ion is often use
28540 66 75 6c 20 61 73 20 61 20 6a 75 6d 70 0a 2a 2a  ful as a jump.**
28550 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
28560 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 67 69 63  ./*.** The magic
28570 20 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20   Explain opcode 
28580 61 72 65 20 6f 6e 6c 79 20 69 6e 73 65 72 74 65  are only inserte
28590 64 20 77 68 65 6e 20 65 78 70 6c 61 69 6e 3d 3d  d when explain==
285a0 32 20 28 77 68 69 63 68 0a 2a 2a 20 69 73 20 74  2 (which.** is t
285b0 6f 20 73 61 79 20 77 68 65 6e 20 74 68 65 20 45  o say when the E
285c0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
285d0 4e 20 73 79 6e 74 61 78 20 69 73 20 75 73 65 64  N syntax is used
285e0 2e 29 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  .).** This opcod
285f0 65 20 72 65 63 6f 72 64 73 20 69 6e 66 6f 72 6d  e records inform
28600 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 6f  ation from the o
28610 70 74 69 6d 69 7a 65 72 2e 20 20 49 74 20 69 73  ptimizer.  It is
28620 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 61 6d 65   the.** the same
28630 20 61 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   as a no-op.  Th
28640 69 73 20 6f 70 63 6f 64 65 73 6e 65 76 65 72 20  is opcodesnever 
28650 61 70 70 65 61 72 73 20 69 6e 20 61 20 72 65 61  appears in a rea
28660 6c 20 56 4d 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  l VM program..*/
28670 0a 64 65 66 61 75 6c 74 3a 20 7b 20 20 20 20 20  .default: {     
28680 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
28690 72 65 61 6c 6c 79 20 4f 50 5f 4e 6f 6f 70 20 61  really OP_Noop a
286a0 6e 64 20 4f 50 5f 45 78 70 6c 61 69 6e 20 2a 2f  nd OP_Explain */
286b0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 2a  .  break;.}../**
286c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
286f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
28710 68 65 20 63 61 73 65 73 20 6f 66 20 74 68 65 20  he cases of the 
28720 73 77 69 74 63 68 20 73 74 61 74 65 6d 65 6e 74  switch statement
28730 20 61 62 6f 76 65 20 74 68 69 73 20 6c 69 6e 65   above this line
28740 20 73 68 6f 75 6c 64 20 61 6c 6c 20 62 65 20 69   should all be i
28750 6e 64 65 6e 74 65 64 0a 2a 2a 20 62 79 20 36 20  ndented.** by 6 
28760 73 70 61 63 65 73 2e 20 20 42 75 74 20 74 68 65  spaces.  But the
28770 20 6c 65 66 74 2d 6d 6f 73 74 20 36 20 73 70 61   left-most 6 spa
28780 63 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ces have been re
28790 6d 6f 76 65 64 20 74 6f 20 69 6d 70 72 6f 76 65  moved to improve
287a0 20 74 68 65 0a 2a 2a 20 72 65 61 64 61 62 69 6c   the.** readabil
287b0 69 74 79 2e 20 20 46 72 6f 6d 20 74 68 69 73 20  ity.  From this 
287c0 70 6f 69 6e 74 20 6f 6e 20 64 6f 77 6e 2c 20 74  point on down, t
287d0 68 65 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74  he normal indent
287e0 61 74 69 6f 6e 20 72 75 6c 65 73 20 61 72 65 0a  ation rules are.
287f0 2a 2a 20 72 65 73 74 6f 72 65 64 2e 0a 2a 2a 2a  ** restored..***
28800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 20 20 20 20  **********/.    
28850 7d 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  }..#ifdef VDBE_P
28860 52 4f 46 49 4c 45 0a 20 20 20 20 7b 0a 20 20 20  ROFILE.    {.   
28870 20 20 20 75 36 34 20 65 6c 61 70 73 65 64 20 3d     u64 elapsed =
28880 20 73 71 6c 69 74 65 33 48 77 74 69 6d 65 28 29   sqlite3Hwtime()
28890 20 2d 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20   - start;.      
288a0 70 4f 70 2d 3e 63 79 63 6c 65 73 20 2b 3d 20 65  pOp->cycles += e
288b0 6c 61 70 73 65 64 3b 0a 20 20 20 20 20 20 70 4f  lapsed;.      pO
288c0 70 2d 3e 63 6e 74 2b 2b 3b 0a 23 69 66 20 30 0a  p->cnt++;.#if 0.
288d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
288e0 73 74 64 6f 75 74 2c 20 22 25 31 30 6c 6c 75 20  stdout, "%10llu 
288f0 22 2c 20 65 6c 61 70 73 65 64 29 3b 0a 20 20 20  ", elapsed);.   
28900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28910 50 72 69 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20  PrintOp(stdout, 
28920 6f 72 69 67 50 63 2c 20 26 70 2d 3e 61 4f 70 5b  origPc, &p->aOp[
28930 6f 72 69 67 50 63 5d 29 3b 0a 23 65 6e 64 69 66  origPc]);.#endif
28940 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
28950 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
28960 69 6e 67 20 63 6f 64 65 20 61 64 64 73 20 6e 6f  ing code adds no
28970 74 68 69 6e 67 20 74 6f 20 74 68 65 20 61 63 74  thing to the act
28980 75 61 6c 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  ual functionalit
28990 79 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  y.    ** of the 
289a0 70 72 6f 67 72 61 6d 2e 20 20 49 74 20 69 73 20  program.  It is 
289b0 6f 6e 6c 79 20 68 65 72 65 20 66 6f 72 20 74 65  only here for te
289c0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
289d0 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 4f 6e 20 74  ing..    ** On t
289e0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
289f0 74 20 64 6f 65 73 20 62 75 72 6e 20 43 50 55 20  t does burn CPU 
28a00 63 79 63 6c 65 73 20 65 76 65 72 79 20 74 69 6d  cycles every tim
28a10 65 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  e through.    **
28a20 20 74 68 65 20 65 76 61 6c 75 61 74 6f 72 20 6c   the evaluator l
28a30 6f 6f 70 2e 20 20 53 6f 20 77 65 20 63 61 6e 20  oop.  So we can 
28a40 6c 65 61 76 65 20 69 74 20 6f 75 74 20 77 68 65  leave it out whe
28a50 6e 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  n NDEBUG is defi
28a60 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ned..    */.#ifn
28a70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 61  def NDEBUG.    a
28a80 73 73 65 72 74 28 20 70 63 3e 3d 2d 31 20 26 26  ssert( pc>=-1 &&
28a90 20 70 63 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 0a 23   pc<p->nOp );..#
28aa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28ab0 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 72  UG.    if( p->tr
28ac0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ace ){.      if(
28ad0 20 72 63 21 3d 30 20 29 20 66 70 72 69 6e 74 66   rc!=0 ) fprintf
28ae0 28 70 2d 3e 74 72 61 63 65 2c 22 72 63 3d 25 64  (p->trace,"rc=%d
28af0 5c 6e 22 2c 72 63 29 3b 0a 20 20 20 20 20 20 69  \n",rc);.      i
28b00 66 28 20 6f 70 50 72 6f 70 65 72 74 79 20 26 20  f( opProperty & 
28b10 4f 50 46 4c 47 5f 4f 55 54 32 5f 50 52 45 52 45  OPFLG_OUT2_PRERE
28b20 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20  LEASE ){.       
28b30 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 70   registerTrace(p
28b40 2d 3e 74 72 61 63 65 2c 20 70 4f 70 2d 3e 70 32  ->trace, pOp->p2
28b50 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  , pOut);.      }
28b60 0a 20 20 20 20 20 20 69 66 28 20 6f 70 50 72 6f  .      if( opPro
28b70 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55  perty & OPFLG_OU
28b80 54 33 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  T3 ){.        re
28b90 67 69 73 74 65 72 54 72 61 63 65 28 70 2d 3e 74  gisterTrace(p->t
28ba0 72 61 63 65 2c 20 70 4f 70 2d 3e 70 33 2c 20 70  race, pOp->p3, p
28bb0 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Out);.      }.  
28bc0 20 20 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53    }.#endif  /* S
28bd0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 23  QLITE_DEBUG */.#
28be0 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
28bf0 20 2a 2f 0a 20 20 7d 20 20 2f 2a 20 54 68 65 20   */.  }  /* The 
28c00 65 6e 64 20 6f 66 20 74 68 65 20 66 6f 72 28 3b  end of the for(;
28c10 3b 29 20 6c 6f 6f 70 20 74 68 65 20 6c 6f 6f 70  ;) loop the loop
28c20 73 20 74 68 72 6f 75 67 68 20 6f 70 63 6f 64 65  s through opcode
28c30 73 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 77 65  s */..  /* If we
28c40 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
28c50 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
28c60 20 65 78 65 63 75 74 69 6f 6e 20 69 73 20 66 69   execution is fi
28c70 6e 69 73 68 65 64 20 77 69 74 68 0a 20 20 2a 2a  nished with.  **
28c80 20 61 6e 20 65 72 72 6f 72 20 6f 66 20 73 6f 6d   an error of som
28c90 65 20 6b 69 6e 64 2e 0a 20 20 2a 2f 0a 76 64 62  e kind..  */.vdb
28ca0 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3a 0a 20 20  e_error_halt:.  
28cb0 61 73 73 65 72 74 28 20 72 63 20 29 3b 0a 20 20  assert( rc );.  
28cc0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 73 71  p->rc = rc;.  sq
28cd0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
28ce0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28cf0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
28d00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28d10 64 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 53 51  d = 1;.  rc = SQ
28d20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
28d30 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
28d40 6c 79 20 77 61 79 20 6f 75 74 20 6f 66 20 74 68  ly way out of th
28d50 69 73 20 70 72 6f 63 65 64 75 72 65 2e 20 20 57  is procedure.  W
28d60 65 20 68 61 76 65 20 74 6f 0a 20 20 2a 2a 20 72  e have to.  ** r
28d70 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
28d80 65 73 20 6f 6e 20 62 74 72 65 65 73 20 74 68 61  es on btrees tha
28d90 74 20 77 65 72 65 20 61 63 71 75 69 72 65 64 20  t were acquired 
28da0 61 74 20 74 68 65 0a 20 20 2a 2a 20 74 6f 70 2e  at the.  ** top.
28db0 20 2a 2f 0a 76 64 62 65 5f 72 65 74 75 72 6e 3a   */.vdbe_return:
28dc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  .  sqlite3BtreeM
28dd0 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
28de0 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 72 65  p->aMutex);.  re
28df0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
28e00 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 61  ump to here if a
28e10 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
28e20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49  larger than SQLI
28e30 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 20 20  TE_MAX_LENGTH.  
28e40 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
28e50 64 2e 0a 20 20 2a 2f 0a 74 6f 6f 5f 62 69 67 3a  d..  */.too_big:
28e60 0a 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72  .  sqlite3SetStr
28e70 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
28e80 20 64 62 2c 20 22 73 74 72 69 6e 67 20 6f 72 20   db, "string or 
28e90 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 29 3b 0a  blob too big");.
28ea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 54 4f    rc = SQLITE_TO
28eb0 4f 42 49 47 3b 0a 20 20 67 6f 74 6f 20 76 64 62  OBIG;.  goto vdb
28ec0 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20  e_error_halt;.. 
28ed0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
28ee0 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
28ef0 61 69 6c 73 2e 0a 20 20 2a 2f 0a 6e 6f 5f 6d 65  ails..  */.no_me
28f00 6d 3a 0a 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  m:.  db->mallocF
28f10 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  ailed = 1;.  sql
28f20 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
28f30 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
28f40 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
28f50 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
28f60 4f 4d 45 4d 3b 0a 20 20 67 6f 74 6f 20 76 64 62  OMEM;.  goto vdb
28f70 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a 20  e_error_halt;.. 
28f80 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
28f90 20 66 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 4d   for an SQLITE_M
28fa0 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 20 20 2a  ISUSE error..  *
28fb0 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 6d  /.abort_due_to_m
28fc0 69 73 75 73 65 3a 0a 20 20 72 63 20 3d 20 53 51  isuse:.  rc = SQ
28fd0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 2f  LITE_MISUSE;.  /
28fe0 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
28ff0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
29000 72 6f 72 20 2a 2f 0a 0a 20 20 2f 2a 20 4a 75 6d  ror */..  /* Jum
29010 70 20 74 6f 20 68 65 72 65 20 66 6f 72 20 61 6e  p to here for an
29020 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
29030 66 61 74 61 6c 20 65 72 72 6f 72 2e 20 20 54 68  fatal error.  Th
29040 65 20 22 72 63 22 20 76 61 72 69 61 62 6c 65 0a  e "rc" variable.
29050 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 6f 6c 64    ** should hold
29060 20 74 68 65 20 65 72 72 6f 72 20 6e 75 6d 62 65   the error numbe
29070 72 2e 0a 20 20 2a 2f 0a 61 62 6f 72 74 5f 64 75  r..  */.abort_du
29080 65 5f 74 6f 5f 65 72 72 6f 72 3a 0a 20 20 61 73  e_to_error:.  as
29090 73 65 72 74 28 20 70 2d 3e 7a 45 72 72 4d 73 67  sert( p->zErrMsg
290a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
290b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
290c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
290d0 4d 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  M;.  if( rc!=SQL
290e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
290f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
29100 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
29110 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
29120 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
29130 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64  );.  }.  goto vd
29140 62 65 5f 65 72 72 6f 72 5f 68 61 6c 74 3b 0a 0a  be_error_halt;..
29150 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
29160 65 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 33  e if the sqlite3
29170 5f 69 6e 74 65 72 72 75 70 74 28 29 20 41 50 49  _interrupt() API
29180 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 72   sets the interr
29190 75 70 74 0a 20 20 2a 2a 20 66 6c 61 67 2e 0a 20  upt.  ** flag.. 
291a0 20 2a 2f 0a 61 62 6f 72 74 5f 64 75 65 5f 74 6f   */.abort_due_to
291b0 5f 69 6e 74 65 72 72 75 70 74 3a 0a 20 20 61 73  _interrupt:.  as
291c0 73 65 72 74 28 20 64 62 2d 3e 75 31 2e 69 73 49  sert( db->u1.isI
291d0 6e 74 65 72 72 75 70 74 65 64 20 29 3b 0a 20 20  nterrupted );.  
291e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
291f0 52 52 55 50 54 3b 0a 20 20 70 2d 3e 72 63 20 3d  RRUPT;.  p->rc =
29200 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 53 65   rc;.  sqlite3Se
29210 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
29220 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
29230 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
29240 29 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 65  );.  goto vdbe_e
29250 72 72 6f 72 5f 68 61 6c 74 3b 0a 7d 0a           rror_halt;.}.