/ Hex Artifact Content
Login

Artifact 708d45a5de83e7033e36a2d6bb0c4acba659878750fbbd42d858abb7c266afe0:


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 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to 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 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a 43  ;.    }.    *(zC
3740: 73 72 2b 2b 29 20 3d 20 63 3b 0a 20 20 20 20 73  sr++) = c;.    s
3750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3760: 31 30 30 2c 20 7a 43 73 72 2c 20 22 25 64 5b 22  100, zCsr, "%d["
3770: 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  , pMem->n);.    
3780: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3790: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
37a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 36     for(i=0; i<16
37b0: 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69   && i<pMem->n; i
37c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
37d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
37e0: 20 7a 43 73 72 2c 20 22 25 30 32 58 22 2c 20 28   zCsr, "%02X", (
37f0: 28 69 6e 74 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20  (int)pMem->z[i] 
3800: 26 20 30 78 46 46 29 29 3b 0a 20 20 20 20 20 20  & 0xFF));.      
3810: 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53  zCsr += sqlite3S
3820: 74 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20  trlen30(zCsr);. 
3830: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3840: 3b 20 69 3c 31 36 20 26 26 20 69 3c 70 4d 65 6d  ; i<16 && i<pMem
3850: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ->n; i++){.     
3860: 20 63 68 61 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e   char z = pMem->
3870: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[i];.      if( 
3880: 7a 3c 33 32 20 7c 7c 20 7a 3e 31 32 36 20 29 20  z<32 || z>126 ) 
3890: 2a 7a 43 73 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20  *zCsr++ = '.';. 
38a0: 20 20 20 20 20 65 6c 73 65 20 2a 7a 43 73 72 2b       else *zCsr+
38b0: 2b 20 3d 20 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  + = z;.    }.   
38c0: 20 2a 28 7a 43 73 72 2b 2b 29 20 3d 20 27 5d 27   *(zCsr++) = ']'
38d0: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
38e0: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
38f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3900: 28 31 30 30 2c 20 7a 43 73 72 2c 22 2b 25 64 7a  (100, zCsr,"+%dz
3910: 22 2c 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29  ",pMem->u.nZero)
3920: 3b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  ;.      zCsr += 
3930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3940: 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCsr);.    }.   
3950: 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20   *zCsr = '\0';. 
3960: 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d   }else if( f & M
3970: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 6e  EM_Str ){.    in
3980: 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 7a 42 75 66  t j, k;.    zBuf
3990: 5b 30 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [0] = ' ';.    i
39a0: 66 28 20 66 20 26 20 4d 45 4d 5f 44 79 6e 20 29  f( f & MEM_Dyn )
39b0: 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  {.      zBuf[1] 
39c0: 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61 73 73  = 'z';.      ass
39d0: 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53  ert( (f & (MEM_S
39e0: 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65 6d 29  tatic|MEM_Ephem)
39f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3a00: 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53 74  e if( f & MEM_St
3a10: 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 7a 42  atic ){.      zB
3a20: 75 66 5b 31 5d 20 3d 20 27 74 27 3b 0a 20 20 20  uf[1] = 't';.   
3a30: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3a40: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
3a50: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
3a60: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
3a70: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
3a80: 7a 42 75 66 5b 31 5d 20 3d 20 27 65 27 3b 0a 20  zBuf[1] = 'e';. 
3a90: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20       assert( (f 
3aa0: 26 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45  & (MEM_Static|ME
3ab0: 4d 5f 44 79 6e 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Dyn))==0 );.  
3ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
3ad0: 42 75 66 5b 31 5d 20 3d 20 27 73 27 3b 0a 20 20  Buf[1] = 's';.  
3ae0: 20 20 7d 0a 20 20 20 20 6b 20 3d 20 32 3b 0a 20    }.    k = 2;. 
3af0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3b00: 6e 74 66 28 31 30 30 2c 20 26 7a 42 75 66 5b 6b  ntf(100, &zBuf[k
3b10: 5d 2c 20 22 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e  ], "%d", pMem->n
3b20: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3b30: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3b40: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3b50: 6b 2b 2b 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  k++] = '[';.    
3b60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 35 20 26 26  for(j=0; j<15 &&
3b70: 20 6a 3c 70 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29   j<pMem->n; j++)
3b80: 7b 0a 20 20 20 20 20 20 75 38 20 63 20 3d 20 70  {.      u8 c = p
3b90: 4d 65 6d 2d 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20  Mem->z[j];.     
3ba0: 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26 26 20   if( c>=0x20 && 
3bb0: 63 3c 30 78 37 66 20 29 7b 0a 20 20 20 20 20 20  c<0x7f ){.      
3bc0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b    zBuf[k++] = c;
3bd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3be0: 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20        zBuf[k++] 
3bf0: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = '.';.      }. 
3c00: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6b 2b     }.    zBuf[k+
3c10: 2b 5d 20 3d 20 27 5d 27 3b 0a 20 20 20 20 73 71  +] = ']';.    sq
3c20: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
3c30: 30 30 2c 26 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63  00,&zBuf[k], enc
3c40: 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d  names[pMem->enc]
3c50: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
3c60: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 42 75  te3Strlen30(&zBu
3c70: 66 5b 6b 5d 29 3b 0a 20 20 20 20 7a 42 75 66 5b  f[k]);.    zBuf[
3c80: 6b 2b 2b 5d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  k++] = 0;.  }.}.
3c90: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
3ca0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3cb0: 2a 20 50 72 69 6e 74 20 74 68 65 20 76 61 6c 75  * Print the valu
3cc0: 65 20 6f 66 20 61 20 72 65 67 69 73 74 65 72 20  e of a register 
3cd0: 66 6f 72 20 74 72 61 63 69 6e 67 20 70 75 72 70  for tracing purp
3ce0: 6f 73 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  oses:.*/.static 
3cf0: 76 6f 69 64 20 6d 65 6d 54 72 61 63 65 50 72 69  void memTracePri
3d00: 6e 74 28 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66  nt(Mem *p){.  if
3d10: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3d20: 5f 55 6e 64 65 66 69 6e 65 64 20 29 7b 0a 20 20  _Undefined ){.  
3d30: 20 20 70 72 69 6e 74 66 28 22 20 75 6e 64 65 66    printf(" undef
3d40: 69 6e 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ined");.  }else 
3d50: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3d60: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70  EM_Null ){.    p
3d70: 72 69 6e 74 66 28 22 20 4e 55 4c 4c 22 29 3b 0a  rintf(" NULL");.
3d80: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e    }else if( (p->
3d90: 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74  flags & (MEM_Int
3da0: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28 4d 45 4d  |MEM_Str))==(MEM
3db0: 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 20 29 7b  _Int|MEM_Str) ){
3dc0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 73 69  .    printf(" si
3dd0: 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29 3b  :%lld", p->u.i);
3de0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3df0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
3e00: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
3e10: 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e 69 29  i:%lld", p->u.i)
3e20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
3e30: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
3e40: 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20 69 66 28  OINT.  }else if(
3e50: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
3e60: 52 65 61 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e  Real ){.    prin
3e70: 74 66 28 22 20 72 3a 25 67 22 2c 20 70 2d 3e 75  tf(" r:%g", p->u
3e80: 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  .r);.#endif.  }e
3e90: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ea0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b   & MEM_RowSet ){
3eb0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 28 72  .    printf(" (r
3ec0: 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d 65 6c 73  owset)");.  }els
3ed0: 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
3ee0: 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [200];.    sqlit
3ef0: 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79 50  e3VdbeMemPrettyP
3f00: 72 69 6e 74 28 70 2c 20 7a 42 75 66 29 3b 0a 20  rint(p, zBuf);. 
3f10: 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
3f20: 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20 20 69 66   zBuf);.  }.  if
3f30: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
3f40: 5f 53 75 62 74 79 70 65 20 29 20 70 72 69 6e 74  _Subtype ) print
3f50: 66 28 22 20 73 75 62 74 79 70 65 3d 30 78 25 30  f(" subtype=0x%0
3f60: 32 78 22 2c 20 70 2d 3e 65 53 75 62 74 79 70 65  2x", p->eSubtype
3f70: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
3f80: 20 72 65 67 69 73 74 65 72 54 72 61 63 65 28 69   registerTrace(i
3f90: 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20 2a 70 29  nt iReg, Mem *p)
3fa0: 7b 0a 20 20 70 72 69 6e 74 66 28 22 52 45 47 5b  {.  printf("REG[
3fb0: 25 64 5d 20 3d 20 22 2c 20 69 52 65 67 29 3b 0a  %d] = ", iReg);.
3fc0: 20 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28    memTracePrint(
3fd0: 70 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  p);.  printf("\n
3fe0: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
3ff0: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
4000: 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  nts(p);.}.#endif
4010: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4020: 44 45 42 55 47 0a 23 20 20 64 65 66 69 6e 65 20  DEBUG.#  define 
4030: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 52  REGISTER_TRACE(R
4040: 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c 61 67 73  ,M) if(db->flags
4050: 26 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63  &SQLITE_VdbeTrac
4060: 65 29 72 65 67 69 73 74 65 72 54 72 61 63 65 28  e)registerTrace(
4070: 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 20 64 65  R,M).#else.#  de
4080: 66 69 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52  fine REGISTER_TR
4090: 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64 69 66 0a  ACE(R,M).#endif.
40a0: 0a 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ..#ifdef VDBE_PR
40b0: 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77  OFILE../* .** hw
40c0: 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69 6e 73 20  time.h contains 
40d0: 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 65 72  inline assembler
40e0: 20 63 6f 64 65 20 66 6f 72 20 69 6d 70 6c 65 6d   code for implem
40f0: 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69 67 68 2d  enting .** high-
4100: 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 69 6d 69  performance timi
4110: 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a  ng routines..*/.
4120: 23 69 6e 63 6c 75 64 65 20 22 68 77 74 69 6d 65  #include "hwtime
4130: 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .h"..#endif..#if
4140: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
4150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4160: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
4170: 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e 20 61 73  rom within an as
4180: 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
4190: 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63 6b 73 20  n. It.** checks 
41a0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
41b0: 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 76 61  .nTransaction va
41c0: 72 69 61 62 6c 65 20 69 73 20 63 6f 72 72 65 63  riable is correc
41d0: 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68  tly set to.** th
41e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d  e number of non-
41f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
4200: 70 6f 69 6e 74 73 20 63 75 72 72 65 6e 74 6c 79  points currently
4210: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
4220: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
4230: 20 61 74 20 73 71 6c 69 74 65 33 2e 70 53 61 76   at sqlite3.pSav
4240: 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55  epoint..** .** U
4250: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  sage:.**.**     
4260: 61 73 73 65 72 74 28 20 63 68 65 63 6b 53 61 76  assert( checkSav
4270: 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64 62 29 20  epointCount(db) 
4280: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  );.*/.static int
4290: 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e 74 43   checkSavepointC
42a0: 6f 75 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ount(sqlite3 *db
42b0: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
42c0: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a    Savepoint *p;.
42d0: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70 53 61 76    for(p=db->pSav
42e0: 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e  epoint; p; p=p->
42f0: 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20 20 61 73  pNext) n++;.  as
4300: 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53  sert( n==(db->nS
4310: 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 69  avepoint + db->i
4320: 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
4330: 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72 65 74 75  point) );.  retu
4340: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
4350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4360: 20 72 65 67 69 73 74 65 72 20 6f 66 20 70 4f 70   register of pOp
4370: 2d 3e 70 32 20 61 66 74 65 72 20 66 69 72 73 74  ->p2 after first
4380: 20 70 72 65 70 61 72 69 6e 67 20 69 74 20 74 6f   preparing it to
4390: 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74   be.** overwritt
43a0: 65 6e 20 77 69 74 68 20 61 6e 20 69 6e 74 65 67  en with an integ
43b0: 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  er value..*/.sta
43c0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
43d0: 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32 50 72 65  INE Mem *out2Pre
43e0: 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72  releaseWithClear
43f0: 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a 20 20 73  (Mem *pOut){.  s
4400: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
4410: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 70 4f  Null(pOut);.  pO
4420: 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
4430: 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  Int;.  return pO
4440: 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20 4d 65 6d  ut;.}.static Mem
4450: 20 2a 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65   *out2Prerelease
4460: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 4f 70  (Vdbe *p, VdbeOp
4470: 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d 20 2a 70   *pOp){.  Mem *p
4480: 4f 75 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Out;.  assert( p
4490: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73  Op->p2>0 );.  as
44a0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
44b0: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
44c0: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75  Cursor) );.  pOu
44d0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70  t = &p->aMem[pOp
44e0: 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p2];.  memAbou
44f0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75  tToChange(p, pOu
4500: 74 29 3b 0a 20 20 69 66 28 20 56 64 62 65 4d 65  t);.  if( VdbeMe
4510: 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29  mDynamic(pOut) )
4520: 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  { /*OPTIMIZATION
4530: 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20  -IF-FALSE*/.    
4540: 72 65 74 75 72 6e 20 6f 75 74 32 50 72 65 72 65  return out2Prere
4550: 6c 65 61 73 65 57 69 74 68 43 6c 65 61 72 28 70  leaseWithClear(p
4560: 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Out);.  }else{. 
4570: 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d     pOut->flags =
4580: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 72 65   MEM_Int;.    re
4590: 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d  turn pOut;.  }.}
45a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
45b0: 20 61 73 20 6d 75 63 68 20 6f 66 20 61 20 56 44   as much of a VD
45c0: 42 45 20 70 72 6f 67 72 61 6d 20 61 73 20 77 65  BE program as we
45d0: 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73 20 69 73   can..** This is
45e0: 20 74 68 65 20 63 6f 72 65 20 6f 66 20 73 71 6c   the core of sql
45f0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 20 0a 2a  ite3_step().  .*
4600: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
4610: 65 45 78 65 63 28 0a 20 20 56 64 62 65 20 2a 70  eExec(.  Vdbe *p
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
4640: 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61 4f 70 20  */.){.  Op *aOp 
4650: 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20 20 20 20  = p->aOp;       
4660: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d     /* Copy of p-
4670: 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f  >aOp */.  Op *pO
4680: 70 20 3d 20 61 4f 70 3b 20 20 20 20 20 20 20 20  p = aOp;        
4690: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
46a0: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 23 69 66  operation */.#if
46b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
46c0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
46d0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
46e0: 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70 3b 20 20    Op *pOrigOp;  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4700: 56 61 6c 75 65 20 6f 66 20 70 4f 70 20 61 74 20  Value of pOp at 
4710: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
4720: 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  oop */.#endif.#i
4730: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4740: 47 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 44 65  G.  int nExtraDe
4750: 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  lete = 0;      /
4760: 2a 20 56 65 72 69 66 69 65 73 20 46 4f 52 44 45  * Verifies FORDE
4770: 4c 45 54 45 20 61 6e 64 20 41 55 58 44 45 4c 45  LETE and AUXDELE
4780: 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23 65 6e 64  TE flags */.#end
4790: 69 66 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  if.  int rc = SQ
47a0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
47b0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
47c0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rn */.  sqlite3 
47d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
47e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
47f0: 73 65 20 2a 2f 0a 20 20 75 38 20 72 65 73 65 74  se */.  u8 reset
4800: 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 20 3d 20  SchemaOnFault = 
4810: 30 3b 20 2f 2a 20 52 65 73 65 74 20 73 63 68 65  0; /* Reset sche
4820: 6d 61 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ma after an erro
4830: 72 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  r if positive */
4840: 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e 67 20 3d  .  u8 encoding =
4850: 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 2f 2a   ENC(db);     /*
4860: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
4870: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
4880: 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 20 20  iCompare = 0;   
4890: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
48a0: 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70 61 72 69   of last compari
48b0: 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  son */.  unsigne
48c0: 64 20 6e 56 6d 53 74 65 70 20 3d 20 30 3b 20 20  d nVmStep = 0;  
48d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
48e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
48f0: 20 73 74 65 70 73 20 2a 2f 0a 23 69 66 6e 64 65   steps */.#ifnde
4900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
4910: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
4920: 20 20 75 6e 73 69 67 6e 65 64 20 6e 50 72 6f 67    unsigned nProg
4930: 72 65 73 73 4c 69 6d 69 74 3b 20 20 20 2f 2a 20  ressLimit;   /* 
4940: 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72 65 73 73  Invoke xProgress
4950: 28 29 20 77 68 65 6e 20 6e 56 6d 53 74 65 70 20  () when nVmStep 
4960: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
4970: 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d  #endif.  Mem *aM
4980: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20  em = p->aMem;   
4990: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
49a0: 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20  ->aMem */.  Mem 
49b0: 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20 20 20 20  *pIn1 = 0;      
49c0: 20 20 20 20 20 20 20 2f 2a 20 31 73 74 20 69 6e         /* 1st in
49d0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
49e0: 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20   Mem *pIn2 = 0; 
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
4a00: 6e 64 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64  nd input operand
4a10: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20   */.  Mem *pIn3 
4a20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
4a30: 20 2f 2a 20 33 72 64 20 69 6e 70 75 74 20 6f 70   /* 3rd input op
4a40: 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  erand */.  Mem *
4a50: 70 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pOut = 0;       
4a60: 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
4a70: 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69 66 64 65  operand */.#ifde
4a80: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
4a90: 20 75 36 34 20 73 74 61 72 74 3b 20 20 20 20 20   u64 start;     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4ab0: 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61  PU clock count a
4ac0: 74 20 73 74 61 72 74 20 6f 66 20 6f 70 63 6f 64  t start of opcod
4ad0: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  e */.#endif.  /*
4ae0: 2a 2a 20 49 4e 53 45 52 54 20 53 54 41 43 4b 20  ** INSERT STACK 
4af0: 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a  UNION HERE ***/.
4b00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4b10: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4b20: 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74  RUN );  /* sqlit
4b30: 65 33 5f 73 74 65 70 28 29 20 76 65 72 69 66 69  e3_step() verifi
4b40: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c  es this */.  sql
4b50: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
4b60: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
4b70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
4b80: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
4b90: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
4ba0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
4bb0: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
4bc0: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
4bd0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
4be0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
4bf0: 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e  .  */.    goto n
4c00: 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73  o_mem;.  }.  ass
4c10: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
4c20: 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
4c30: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xff)==SQLITE_BU
4c40: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
4c50: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 7c 7c 20  p->bIsReader || 
4c60: 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29  p->readOnly!=0 )
4c70: 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  ;.  p->iCurrentT
4c80: 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ime = 0;.  asser
4c90: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30  t( p->explain==0
4ca0: 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   );.  p->pResult
4cb0: 53 65 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  Set = 0;.  db->b
4cc0: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
4cd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = 0;.  if( db->
4ce0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
4cf0: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
4d00: 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a  e_to_interrupt;.
4d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54    sqlite3VdbeIOT
4d20: 72 61 63 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e  raceSql(p);.#ifn
4d30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4d40: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
4d50: 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  K.  if( db->xPro
4d60: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 75 33 32  gress ){.    u32
4d70: 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f   iPrior = p->aCo
4d80: 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d  unter[SQLITE_STM
4d90: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d  TSTATUS_VM_STEP]
4da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  ;.    assert( 0 
4db0: 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f  < db->nProgressO
4dc0: 70 73 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72  ps );.    nProgr
4dd0: 65 73 73 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e  essLimit = db->n
4de0: 50 72 6f 67 72 65 73 73 4f 70 73 20 2d 20 28 69  ProgressOps - (i
4df0: 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f  Prior % db->nPro
4e00: 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 7d 65 6c  gressOps);.  }el
4e10: 73 65 7b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73  se{.    nProgres
4e20: 73 4c 69 6d 69 74 20 3d 20 30 78 66 66 66 66 66  sLimit = 0xfffff
4e30: 66 66 66 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  fff;.  }.#endif.
4e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4e50: 42 55 47 0a 20 20 73 71 6c 69 74 65 33 42 65 67  BUG.  sqlite3Beg
4e60: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
4e70: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63 3d 3d 30  ;.  if( p->pc==0
4e80: 0a 20 20 20 26 26 20 28 70 2d 3e 64 62 2d 3e 66  .   && (p->db->f
4e90: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 56  lags & (SQLITE_V
4ea0: 64 62 65 4c 69 73 74 69 6e 67 7c 53 51 4c 49 54  dbeListing|SQLIT
4eb0: 45 5f 56 64 62 65 45 51 50 7c 53 51 4c 49 54 45  E_VdbeEQP|SQLITE
4ec0: 5f 56 64 62 65 54 72 61 63 65 29 29 21 3d 30 0a  _VdbeTrace))!=0.
4ed0: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a    ){.    int i;.
4ee0: 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
4ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4f00: 65 50 72 69 6e 74 53 71 6c 28 70 29 3b 0a 20 20  ePrintSql(p);.  
4f10: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
4f20: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
4f30: 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20 20 20 20  Listing ){.     
4f40: 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 50 72   printf("VDBE Pr
4f50: 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a 5c 6e  ogram Listing:\n
4f60: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
4f70: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
4f80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4f90: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74  e3VdbePrintOp(st
4fa0: 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70 5b 69 5d  dout, i, &aOp[i]
4fb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4fc0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
4fd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4fe0: 64 62 65 45 51 50 20 29 7b 0a 20 20 20 20 20 20  dbeEQP ){.      
4ff0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
5000: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
5010: 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f 70 63 6f   if( aOp[i].opco
5020: 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de==OP_Explain )
5030: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
5040: 6f 6e 63 65 20 29 20 70 72 69 6e 74 66 28 22 56  once ) printf("V
5050: 44 42 45 20 51 75 65 72 79 20 50 6c 61 6e 3a 5c  DBE Query Plan:\
5060: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n");.          p
5070: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 4f  rintf("%s\n", aO
5080: 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20 20 20 20  p[i].p4.z);.    
5090: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
50a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
50b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
50c0: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
50d0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 20  QLITE_VdbeTrace 
50e0: 29 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20  )  printf("VDBE 
50f0: 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20 20 7d 0a  Trace:\n");.  }.
5100: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
5110: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 65 6e 64  gnMalloc();.#end
5120: 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f  if.  for(pOp=&aO
5130: 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20 70 4f 70  p[p->pc]; 1; pOp
5140: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45 72 72 6f  ++){.    /* Erro
5150: 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  rs are detected 
5160: 62 79 20 69 6e 64 69 76 69 64 75 61 6c 20 6f 70  by individual op
5170: 63 6f 64 65 73 2c 20 77 69 74 68 20 61 6e 20 69  codes, with an i
5180: 6d 6d 65 64 69 61 74 65 0a 20 20 20 20 2a 2a 20  mmediate.    ** 
5190: 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72 74 5f 64  jumps to abort_d
51a0: 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20 2a 2f 0a  ue_to_error. */.
51b0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
51c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
51d0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 3d 61    assert( pOp>=a
51e0: 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f 70 5b 70  Op && pOp<&aOp[p
51f0: 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64 65 66 20  ->nOp]);.#ifdef 
5200: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 20  VDBE_PROFILE.   
5210: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
5220: 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66  Hwtime();.#endif
5230: 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a  .    nVmStep++;.
5240: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5250: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
5260: 41 54 55 53 0a 20 20 20 20 69 66 28 20 70 2d 3e  ATUS.    if( p->
5270: 61 6e 45 78 65 63 20 29 20 70 2d 3e 61 6e 45 78  anExec ) p->anEx
5280: 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70  ec[(int)(pOp-aOp
5290: 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )]++;.#endif..  
52a0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
52b0: 74 72 61 63 69 6e 67 20 69 66 20 53 51 4c 49 54  tracing if SQLIT
52c0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
52d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65  ed..    */.#ifde
52e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
52f0: 20 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73     if( db->flags
5300: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
5310: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ace ){.      sql
5320: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
5330: 73 74 64 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f  stdout, (int)(pO
5340: 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a  p - aOp), pOp);.
5350: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
5360: 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63     ..    /* Chec
5370: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
5380: 65 65 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  eed to simulate 
5390: 61 6e 20 69 6e 74 65 72 72 75 70 74 2e 20 20 54  an interrupt.  T
53a0: 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
53b0: 0a 20 20 20 20 2a 2a 20 69 66 20 77 65 20 68 61  .    ** if we ha
53c0: 76 65 20 61 20 73 70 65 63 69 61 6c 20 74 65 73  ve a special tes
53d0: 74 20 62 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a  t build..    */.
53e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
53f0: 53 54 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ST.    if( sqlit
5400: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
5410: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  nt>0 ){.      sq
5420: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
5430: 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69  count--;.      i
5440: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  f( sqlite3_inter
5450: 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b  rupt_count==0 ){
5460: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5470: 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a  _interrupt(db);.
5480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
5490: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e  ndif..    /* San
54a0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
54b0: 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 73 20 2a  other operands *
54c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
54d0: 44 45 42 55 47 0a 20 20 20 20 7b 0a 20 20 20 20  DEBUG.    {.    
54e0: 20 20 75 38 20 6f 70 50 72 6f 70 65 72 74 79 20    u8 opProperty 
54f0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
5500: 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63  roperty[pOp->opc
5510: 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ode];.      if( 
5520: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
5530: 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20  FLG_IN1)!=0 ){. 
5540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5550: 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20  Op->p1>0 );.    
5560: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5570: 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p1<=(p->nMem+1 
5580: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5590: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
55a0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
55b0: 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20  m[pOp->p1]) );. 
55c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
55d0: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
55e0: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
55f0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a  em[pOp->p1]) );.
5600: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
5610: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20  _TRACE(pOp->p1, 
5620: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b  &aMem[pOp->p1]);
5630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5640: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5650: 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29   OPFLG_IN2)!=0 )
5660: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5670: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
5680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5690: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p2<=(p->nMem
56a0: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
56b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
56c0: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
56d0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29  aMem[pOp->p2]) )
56e0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
56f0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
5700: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
5710: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20  &aMem[pOp->p2]) 
5720: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
5730: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
5740: 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  2, &aMem[pOp->p2
5750: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5760: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5770: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d  y & OPFLG_IN3)!=
5780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
5790: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29  ert( pOp->p3>0 )
57a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
57b0: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
57c0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
57d0: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  or) );.        a
57e0: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
57f0: 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  d(&aMem[pOp->p3]
5800: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
5810: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
5820: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
5830: 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  ts(&aMem[pOp->p3
5840: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ]) );.        RE
5850: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
5860: 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p3, &aMem[pOp-
5870: 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p3]);.      }. 
5880: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
5890: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54  erty & OPFLG_OUT
58a0: 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)!=0 ){.       
58b0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
58c0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
58d0: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28  sert( pOp->p2<=(
58e0: 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
58f0: 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
5900: 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61     memAboutToCha
5910: 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70  nge(p, &aMem[pOp
5920: 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ->p2]);.      }.
5930: 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f        if( (opPro
5940: 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55  perty & OPFLG_OU
5950: 54 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  T3)!=0 ){.      
5960: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5970: 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  3>0 );.        a
5980: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
5990: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
59a0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
59b0: 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68      memAboutToCh
59c0: 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f  ange(p, &aMem[pO
59d0: 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p3]);.      }
59e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
59f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5a00: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
5a10: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
5a20: 0a 20 20 20 20 70 4f 72 69 67 4f 70 20 3d 20 70  .    pOrigOp = p
5a30: 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  Op;.#endif.  .  
5a40: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f    switch( pOp->o
5a50: 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a  pcode ){../*****
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74  ********.** What
5ab0: 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61   follows is a ma
5ac0: 73 73 69 76 65 20 73 77 69 74 63 68 20 73 74 61  ssive switch sta
5ad0: 74 65 6d 65 6e 74 20 77 68 65 72 65 20 65 61 63  tement where eac
5ae0: 68 20 63 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74  h case implement
5af0: 73 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  s a.** separate 
5b00: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  instruction in t
5b10: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
5b20: 6e 65 2e 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f  ne.  If we follo
5b30: 77 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69  w the usual.** i
5b40: 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65  ndentation conve
5b50: 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20 63 61 73  ntions, each cas
5b60: 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
5b70: 6e 74 65 64 20 62 79 20 36 20 73 70 61 63 65 73  nted by 6 spaces
5b80: 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61 74 20 69  .  But.** that i
5b90: 73 20 61 20 6c 6f 74 20 6f 66 20 77 61 73 74 65  s a lot of waste
5ba0: 64 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 6c  d space on the l
5bb0: 65 66 74 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20  eft margin.  So 
5bc0: 74 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 0a  the code within.
5bd0: 2a 2a 20 74 68 65 20 73 77 69 74 63 68 20 73 74  ** the switch st
5be0: 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65  atement will bre
5bf0: 61 6b 20 77 69 74 68 20 63 6f 6e 76 65 6e 74 69  ak with conventi
5c00: 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75 73 68 2d  on and be flush-
5c10: 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a  left. Another.**
5c20: 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69   big comment (si
5c30: 6d 69 6c 61 72 20 74 6f 20 74 68 69 73 20 6f 6e  milar to this on
5c40: 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65  e) will mark the
5c50: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
5c60: 64 65 20 77 68 65 72 65 0a 2a 2a 20 77 65 20 74  de where.** we t
5c70: 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74  ransition back t
5c80: 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61  o normal indenta
5c90: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5ca0: 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66 20 65 61  formatting of ea
5cb0: 63 68 20 63 61 73 65 20 69 73 20 69 6d 70 6f 72  ch case is impor
5cc0: 74 61 6e 74 2e 20 20 54 68 65 20 6d 61 6b 65 66  tant.  The makef
5cd0: 69 6c 65 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a  ile for SQLite.*
5ce0: 2a 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  * generates two 
5cf0: 43 20 66 69 6c 65 73 20 22 6f 70 63 6f 64 65 73  C files "opcodes
5d00: 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f 64 65 73  .h" and "opcodes
5d10: 2e 63 22 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  .c" by scanning 
5d20: 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f  this.** file loo
5d30: 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65 73 20 74  king for lines t
5d40: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
5d50: 63 61 73 65 20 4f 50 5f 22 2e 20 20 54 68 65 20  case OP_".  The 
5d60: 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a  opcodes.h files.
5d70: 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65  ** will be fille
5d80: 64 20 77 69 74 68 20 23 64 65 66 69 6e 65 73 20  d with #defines 
5d90: 74 68 61 74 20 67 69 76 65 20 75 6e 69 71 75 65  that give unique
5da0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
5db0: 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64  to each.** opcod
5dc0: 65 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  e and the opcode
5dd0: 73 2e 63 20 66 69 6c 65 20 69 73 20 66 69 6c 6c  s.c file is fill
5de0: 65 64 20 77 69 74 68 20 61 6e 20 61 72 72 61 79  ed with an array
5df0: 20 6f 66 20 73 74 72 69 6e 67 73 20 77 68 65 72   of strings wher
5e00: 65 0a 2a 2a 20 65 61 63 68 20 73 74 72 69 6e 67  e.** each string
5e10: 20 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63   is the symbolic
5e20: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
5e30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f  rresponding opco
5e40: 64 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  de.  If the.** c
5e50: 61 73 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ase statement is
5e60: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
5e70: 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  omment of the fo
5e80: 72 6d 20 22 2f 23 20 73 61 6d 65 20 61 73 20 2e  rm "/# same as .
5e90: 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63  .. #/".** that c
5ea0: 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  omment is used t
5eb0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
5ec0: 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
5ed0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a   of the opcode..
5ee0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77  **.** Other keyw
5ef0: 6f 72 64 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ords in the comm
5f00: 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ent that follows
5f10: 20 65 61 63 68 20 63 61 73 65 20 61 72 65 20 75   each case are u
5f20: 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72  sed to.** constr
5f30: 75 63 74 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e  uct the OPFLG_IN
5f40: 49 54 49 41 4c 49 5a 45 52 20 76 61 6c 75 65 20  ITIALIZER value 
5f50: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
5f60: 20 6f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b   opcodeProperty[
5f70: 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69  ]..** Keywords i
5f80: 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32  nclude: in1, in2
5f90: 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74  , in3, out2, out
5fa0: 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d  3.  See.** the m
5fb0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
5fc0: 69 70 74 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ipt for addition
5fd0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
5fe0: 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74  **.** Documentat
5ff0: 69 6f 6e 20 61 62 6f 75 74 20 56 44 42 45 20 6f  ion about VDBE o
6000: 70 63 6f 64 65 73 20 69 73 20 67 65 6e 65 72 61  pcodes is genera
6010: 74 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20  ted by scanning 
6020: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72  this file.** for
6030: 20 6c 69 6e 65 73 20 6f 66 20 74 68 61 74 20 63   lines of that c
6040: 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22  ontain "Opcode:"
6050: 2e 20 20 54 68 61 74 20 6c 69 6e 65 20 61 6e 64  .  That line and
6060: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a   all subsequent.
6070: 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73  ** comment lines
6080: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
6090: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74   generation of t
60a0: 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64  he opcode.html d
60b0: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  ocumentation.** 
60c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d  file..**.** SUMM
60d0: 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46  ARY:.**.**     F
60e0: 6f 72 6d 61 74 74 69 6e 67 20 69 73 20 69 6d 70  ormatting is imp
60f0: 6f 72 74 61 6e 74 20 74 6f 20 73 63 72 69 70 74  ortant to script
6100: 73 20 74 68 61 74 20 73 63 61 6e 20 74 68 69 73  s that scan this
6110: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f   file..**     Do
6120: 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72 6f   not deviate fro
6130: 6d 20 74 68 65 20 66 6f 72 6d 61 74 74 69 6e 67  m the formatting
6140: 20 73 74 79 6c 65 20 63 75 72 72 65 6e 74 6c 79   style currently
6150: 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a   in use..**.****
6160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
61a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f  *********/../* O
61b0: 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50  pcode:  Goto * P
61c0: 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e  2 * * *.**.** An
61d0: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
61e0: 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20 50  ump to address P
61f0: 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 69  2..** The next i
6200: 6e 73 74 72 75 63 74 69 6f 6e 20 65 78 65 63 75  nstruction execu
6210: 74 65 64 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  ted will be .** 
6220: 74 68 65 20 6f 6e 65 20 61 74 20 69 6e 64 65 78  the one at index
6230: 20 50 32 20 66 72 6f 6d 20 74 68 65 20 62 65 67   P2 from the beg
6240: 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
6250: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
6260: 54 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  The P1 parameter
6270: 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
6280: 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70   used by this op
6290: 63 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  code.  However, 
62a0: 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d  it.** is sometim
62b0: 65 73 20 73 65 74 20 74 6f 20 31 20 69 6e 73 74  es set to 1 inst
62c0: 65 61 64 20 6f 66 20 30 20 61 73 20 61 20 68 69  ead of 0 as a hi
62d0: 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e  nt to the comman
62e0: 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20  d-line shell.** 
62f0: 74 68 61 74 20 74 68 69 73 20 47 6f 74 6f 20 69  that this Goto i
6300: 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  s the bottom of 
6310: 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68 61 74 20  a loop and that 
6320: 74 68 65 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50  the lines from P
6330: 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65  2 down.** to the
6340: 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20 73 68   current line sh
6350: 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64  ould be indented
6360: 20 66 6f 72 20 45 58 50 4c 41 49 4e 20 6f 75 74   for EXPLAIN out
6370: 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  put..*/.case OP_
6380: 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Goto: {         
6390: 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a      /* jump */.j
63a0: 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68  ump_to_p2_and_ch
63b0: 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
63c0: 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  t:.  pOp = &aOp[
63d0: 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20  pOp->p2 - 1];.. 
63e0: 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61 74   /* Opcodes that
63f0: 20 61 72 65 20 75 73 65 64 20 61 73 20 74 68 65   are used as the
6400: 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f   bottom of a loo
6410: 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50  p (OP_Next, OP_P
6420: 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65  rev,.  ** OP_VNe
6430: 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72  xt, or OP_Sorter
6440: 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68  Next) all jump h
6450: 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f  ere upon.  ** co
6460: 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b  mpletion.  Check
6470: 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c 69 74   to see if sqlit
6480: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29 20 68  e3_interrupt() h
6490: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20  as been called. 
64a0: 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 72   ** or if the pr
64b0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
64c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 76 6f  needs to be invo
64d0: 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ked. .  **.  ** 
64e0: 54 68 69 73 20 63 6f 64 65 20 75 73 65 73 20 75  This code uses u
64f0: 6e 73 74 72 75 63 74 75 72 65 64 20 22 67 6f 74  nstructured "got
6500: 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  o" statements an
6510: 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20  d does not look 
6520: 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20  clean..  ** But 
6530: 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75 65 20  that is not due 
6540: 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67  to sloppy coding
6550: 20 68 61 62 69 74 73 2e 20 54 68 65 20 63 6f 64   habits. The cod
6560: 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 68 69  e is written thi
6570: 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72 20 70  s.  ** way for p
6580: 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61  erformance, to a
6590: 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 72  void having to r
65a0: 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75 70 74  un the interrupt
65b0: 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a 20 20   and progress.  
65c0: 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65 76 65  ** checks on eve
65d0: 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ry opcode.  This
65e0: 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33 5f 73   helps sqlite3_s
65f0: 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61 62 6f  tep() to run abo
6600: 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73  ut 1.5%.  ** fas
6610: 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ter according to
6620: 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f   "valgrind --too
6630: 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20 2a 2f  l=cachegrind" */
6640: 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  .check_for_inter
6650: 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e  rupt:.  if( db->
6660: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
6670: 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
6680: 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a  e_to_interrupt;.
6690: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
66a0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
66b0: 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20  LBACK.  /* Call 
66c0: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
66d0: 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73 20 63  lback if it is c
66e0: 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 74 68  onfigured and th
66f0: 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d 62 65  e required numbe
6700: 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f  r.  ** of VDBE o
6710: 70 73 20 68 61 76 65 20 62 65 65 6e 20 65 78 65  ps have been exe
6720: 63 75 74 65 64 20 28 65 69 74 68 65 72 20 73 69  cuted (either si
6730: 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63 61 74  nce this invocat
6740: 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69  ion of.  ** sqli
6750: 74 65 33 56 64 62 65 45 78 65 63 28 29 20 6f 72  te3VdbeExec() or
6760: 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69 6d 65   since last time
6770: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
6780: 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c 6c 65  llback was calle
6790: 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  d)..  ** If the 
67a0: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
67b0: 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
67c0: 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76 69 72  ro, exit the vir
67d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77 69 74  tual machine wit
67e0: 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72 6e 20  h.  ** a return 
67f0: 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  code SQLITE_ABOR
6800: 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56  T..  */.  if( nV
6810: 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73  mStep>=nProgress
6820: 4c 69 6d 69 74 20 26 26 20 64 62 2d 3e 78 50 72  Limit && db->xPr
6830: 6f 67 72 65 73 73 21 3d 30 20 29 7b 0a 20 20 20  ogress!=0 ){.   
6840: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 50 72   assert( db->nPr
6850: 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a  ogressOps!=0 );.
6860: 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d      nProgressLim
6870: 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64  it = nVmStep + d
6880: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
6890: 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e  - (nVmStep%db->n
68a0: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
68b0: 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72    if( db->xProgr
68c0: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
68d0: 73 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 72  sArg) ){.      r
68e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
68f0: 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
6900: 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
6910: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6920: 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65 61 6b  endif.  .  break
6930: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
6940: 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a 20 2a   Gosub P1 P2 * *
6950: 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74   *.**.** Write t
6960: 68 65 20 63 75 72 72 65 6e 74 20 61 64 64 72 65  he current addre
6970: 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74 65 72  ss onto register
6980: 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20   P1.** and then 
6990: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
69a0: 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  P2..*/.case OP_G
69b0: 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20 20 20  osub: {         
69c0: 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
69d0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
69e0: 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70  0 && pOp->p1<=(p
69f0: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
6a00: 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31  ursor) );.  pIn1
6a10: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6a20: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56 64 62  ];.  assert( Vdb
6a30: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31  eMemDynamic(pIn1
6a40: 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f  )==0 );.  memAbo
6a50: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 49  utToChange(p, pI
6a60: 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  n1);.  pIn1->fla
6a70: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6a80: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
6a90: 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45  )(pOp-aOp);.  RE
6aa0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
6ab0: 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20  ->p1, pIn1);..  
6ac0: 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65  /* Most jump ope
6ad0: 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74  rations do a got
6ae0: 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74 20 69  o to this spot i
6af0: 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64 61 74  n order to updat
6b00: 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70 20 70  e.  ** the pOp p
6b10: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f  ointer. */.jump_
6b20: 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26  to_p2:.  pOp = &
6b30: 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d  aOp[pOp->p2 - 1]
6b40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6b50: 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75 72 6e   Opcode:  Return
6b60: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
6b70: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65  * Jump to the ne
6b80: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  xt instruction a
6b90: 66 74 65 72 20 74 68 65 20 61 64 64 72 65 73 73  fter the address
6ba0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
6bb0: 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a    After.** the j
6bc0: 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50 31  ump, register P1
6bd0: 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e   becomes undefin
6be0: 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ed..*/.case OP_R
6bf0: 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20 20 20  eturn: {        
6c00: 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70     /* in1 */.  p
6c10: 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
6c20: 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
6c30: 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  pIn1->flags==MEM
6c40: 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20  _Int );.  pOp = 
6c50: 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b  &aOp[pIn1->u.i];
6c60: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
6c70: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
6c80: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
6c90: 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75  pcode: InitCorou
6ca0: 74 69 6e 65 20 50 31 20 50 32 20 50 33 20 2a 20  tine P1 P2 P3 * 
6cb0: 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72  *.**.** Set up r
6cc0: 65 67 69 73 74 65 72 20 50 31 20 73 6f 20 74 68  egister P1 so th
6cd0: 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65 6c 64  at it will Yield
6ce0: 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   to the coroutin
6cf0: 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61 74 20  e.** located at 
6d00: 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a  address P3..**.*
6d10: 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65 6e 20  * If P2!=0 then 
6d20: 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d  the coroutine im
6d30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d  plementation imm
6d40: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73  ediately follows
6d50: 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  .** this opcode.
6d60: 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74    So jump over t
6d70: 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70  he coroutine imp
6d80: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a  lementation to.*
6d90: 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a  * address P2..**
6da0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e  .** See also: En
6db0: 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61  dCoroutine.*/.ca
6dc0: 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  se OP_InitCorout
6dd0: 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75  ine: {     /* ju
6de0: 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  mp */.  assert( 
6df0: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f  pOp->p1>0 &&  pO
6e00: 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
6e10: 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
6e20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
6e30: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p2>=0 && pOp->
6e40: 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61  p2<p->nOp );.  a
6e50: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d  ssert( pOp->p3>=
6e60: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e  0 && pOp->p3<p->
6e70: 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  nOp );.  pOut = 
6e80: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6e90: 20 20 61 73 73 65 72 74 28 20 21 56 64 62 65 4d    assert( !VdbeM
6ea0: 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74 29 20  emDynamic(pOut) 
6eb0: 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
6ec0: 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20   pOp->p3 - 1;.  
6ed0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
6ee0: 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70  M_Int;.  if( pOp
6ef0: 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70  ->p2 ) goto jump
6f00: 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
6f10: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
6f20: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50 31 20  EndCoroutine P1 
6f30: 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  * * * *.**.** Th
6f40: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  e instruction at
6f50: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e 20   the address in 
6f60: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 61  register P1 is a
6f70: 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20   Yield..** Jump 
6f80: 74 6f 20 74 68 65 20 50 32 20 70 61 72 61 6d 65  to the P2 parame
6f90: 74 65 72 20 6f 66 20 74 68 61 74 20 59 69 65 6c  ter of that Yiel
6fa0: 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  d..** After the 
6fb0: 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20 50  jump, register P
6fc0: 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66 69  1 becomes undefi
6fd0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ned..**.** See a
6fe0: 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69  lso: InitCorouti
6ff0: 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e  ne.*/.case OP_En
7000: 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20  dCoroutine: {   
7010: 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a          /* in1 *
7020: 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43 61 6c  /.  VdbeOp *pCal
7030: 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  ler;.  pIn1 = &a
7040: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
7050: 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
7060: 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
7070: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
7080: 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e  u.i>=0 && pIn1->
7090: 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  u.i<p->nOp );.  
70a0: 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70  pCaller = &aOp[p
70b0: 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73  In1->u.i];.  ass
70c0: 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70  ert( pCaller->op
70d0: 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29  code==OP_Yield )
70e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 61 6c  ;.  assert( pCal
70f0: 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43  ler->p2>=0 && pC
7100: 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70  aller->p2<p->nOp
7110: 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70   );.  pOp = &aOp
7120: 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31  [pCaller->p2 - 1
7130: 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ];.  pIn1->flags
7140: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
7150: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
7160: 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c 64 20   Opcode:  Yield 
7170: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
7180: 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f 67 72  * Swap the progr
7190: 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74 68 20  am counter with 
71a0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
71b0: 69 73 74 65 72 20 50 31 2e 20 20 54 68 69 73 0a  ister P1.  This.
71c0: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
71d0: 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20 74 6f  t of yielding to
71e0: 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a   a coroutine..**
71f0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72 6f 75  .** If the corou
7200: 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c 61 75  tine that is lau
7210: 6e 63 68 65 64 20 62 79 20 74 68 69 73 20 69 6e  nched by this in
7220: 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 77  struction ends w
7230: 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20  ith.** Yield or 
7240: 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74  Return then cont
7250: 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65 78 74  inue to the next
7260: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42   instruction.  B
7270: 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72  ut if.** the cor
7280: 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65 64 20  outine launched 
7290: 62 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  by this instruct
72a0: 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a  ion ends with.**
72b0: 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74   EndCoroutine, t
72c0: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 20 72  hen jump to P2 r
72d0: 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  ather than conti
72e0: 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a  nuing with the.*
72f0: 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  * next instructi
7300: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
7310: 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  so: InitCoroutin
7320: 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65  e.*/.case OP_Yie
7330: 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ld: {           
7340: 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f   /* in1, jump */
7350: 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b 0a 20  .  int pcDest;. 
7360: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
7370: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
7380: 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
7390: 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70  (pIn1)==0 );.  p
73a0: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  In1->flags = MEM
73b0: 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74 20 3d  _Int;.  pcDest =
73c0: 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b   (int)pIn1->u.i;
73d0: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28  .  pIn1->u.i = (
73e0: 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
73f0: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
7400: 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29  E(pOp->p1, pIn1)
7410: 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70  ;.  pOp = &aOp[p
7420: 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b  cDest];.  break;
7430: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20  .}../* Opcode:  
7440: 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31 20 50  HaltIfNull  P1 P
7450: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
7460: 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 33 5d  nopsis: if r[P3]
7470: 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a  =null halt.**.**
7480: 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65   Check the value
7490: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
74a0: 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c 4c 20    If it is NULL 
74b0: 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a  then Halt using.
74c0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 31 2c  ** parameter P1,
74d0: 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73 20 69   P2, and P4 as i
74e0: 66 20 74 68 69 73 20 77 65 72 65 20 61 20 48 61  f this were a Ha
74f0: 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  lt instruction. 
7500: 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   If the.** value
7510: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
7520: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
7530: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7540: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68  s a no-op..** Th
7550: 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 73  e P5 parameter s
7560: 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63  hould be 1..*/.c
7570: 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  ase OP_HaltIfNul
7580: 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33  l: {      /* in3
7590: 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   */.  pIn3 = &aM
75a0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
75b0: 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
75c0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
75d0: 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c   break;.  /* Fal
75e0: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
75f0: 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f 2a 20  P_Halt */.}../* 
7600: 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20 50 31  Opcode:  Halt P1
7610: 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a 0a 2a   P2 * P4 P5.**.*
7620: 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61 74 65  * Exit immediate
7630: 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20 63 75  ly.  All open cu
7640: 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65 20 63  rsors, etc are c
7650: 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  losed.** automat
7660: 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 50 31  ically..**.** P1
7670: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 63   is the result c
7680: 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
7690: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20  sqlite3_exec(), 
76a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29 2c  sqlite3_reset(),
76b0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 5f 66  .** or sqlite3_f
76c0: 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f 72 20  inalize().  For 
76d0: 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c 20 74  a normal halt, t
76e0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 53 51  his should be SQ
76f0: 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a 2a 20  LITE_OK (0)..** 
7700: 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74 20 63  For errors, it c
7710: 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72  an be some other
7720: 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31 21 3d   value.  If P1!=
7730: 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c 20 64  0 then P2 will d
7740: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74  etermine.** whet
7750: 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 72 6f  her or not to ro
7760: 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72 72 65  llback the curre
7770: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
7780: 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b   Do not rollback
7790: 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f 46 61  .** if P2==OE_Fa
77a0: 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c 6c 62  il. Do the rollb
77b0: 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f 52 6f  ack if P2==OE_Ro
77c0: 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32 3d 3d  llback.  If P2==
77d0: 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74 68 65  OE_Abort,.** the
77e0: 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c 20 63  n back out all c
77f0: 68 61 6e 67 65 73 20 74 68 61 74 20 68 61 76 65  hanges that have
7800: 20 6f 63 63 75 72 72 65 64 20 64 75 72 69 6e 67   occurred during
7810: 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20   this execution 
7820: 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 2c 20  of the.** VDBE, 
7830: 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c 6c 62  but do not rollb
7840: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
7850: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50  ion. .**.** If P
7860: 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68  4 is not null th
7870: 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f  en it is an erro
7880: 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
7890: 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20 61 20  ..**.** P5 is a 
78a0: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 30 20  value between 0 
78b0: 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69 76 65  and 4, inclusive
78c0: 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  , that modifies 
78d0: 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a  the P4 string..*
78e0: 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e 6f 20  *.**    0:  (no 
78f0: 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20 31 3a  change).**    1:
7900: 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 74 72    NOT NULL contr
7910: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a  aint failed: P4.
7920: 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51 55 45  **    2:  UNIQUE
7930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
7940: 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33 3a 20  ed: P4.**    3: 
7950: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
7960: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20  t failed: P4.** 
7970: 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e 20 4b     4:  FOREIGN K
7980: 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
7990: 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a 20 49  iled: P4.**.** I
79a0: 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P5 is not zero
79b0: 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c 4c 2c   and P4 is NULL,
79c0: 20 74 68 65 6e 20 65 76 65 72 79 74 68 69 6e 67   then everything
79d0: 20 61 66 74 65 72 20 74 68 65 20 22 3a 22 20 69   after the ":" i
79e0: 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a 2a  s.** omitted..**
79f0: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6e 20  .** There is an 
7a00: 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20 30 20  implied "Halt 0 
7a10: 30 20 30 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  0 0" instruction
7a20: 20 69 6e 73 65 72 74 65 64 20 61 74 20 74 68 65   inserted at the
7a30: 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a 2a 20   very end of.** 
7a40: 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e 20 20  every program.  
7a50: 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74 20 74  So a jump past t
7a60: 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75 63 74  he last instruct
7a70: 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ion of the progr
7a80: 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73 61 6d  am.** is the sam
7a90: 65 20 61 73 20 65 78 65 63 75 74 69 6e 67 20 48  e as executing H
7aa0: 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  alt..*/.case OP_
7ab0: 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65 46 72  Halt: {.  VdbeFr
7ac0: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
7ad0: 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78 20 3d  nt pcx;..  pcx =
7ae0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
7af0: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
7b00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
7b10: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
7b20: 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75 62 2d  /* Halt the sub-
7b30: 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72 6e 20  program. Return 
7b40: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 70  control to the p
7b50: 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a 2f 0a  arent frame. */.
7b60: 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70 2d 3e      pFrame = p->
7b70: 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  pFrame;.    p->p
7b80: 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 2d 3e  Frame = pFrame->
7b90: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 2d 3e  pParent;.    p->
7ba0: 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20 73 71  nFrame--;.    sq
7bb0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
7bc0: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
7bd0: 67 65 29 3b 0a 20 20 20 20 70 63 78 20 3d 20 73  ge);.    pcx = s
7be0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
7bf0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
7c00: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
7c10: 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
7c20: 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
7c30: 6f 6e 20 70 63 78 20 69 73 20 74 68 65 20 4f 50  on pcx is the OP
7c40: 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20 69 6e  _Program that in
7c50: 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d 70 72  voked the sub-pr
7c60: 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a 2a 20  ogram .      ** 
7c70: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
7c80: 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65 20 70  halted. If the p
7c90: 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66  2 instruction of
7ca0: 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a 20 20   this OP_Halt.  
7cb0: 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
7cc0: 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f 45 5f  on is set to OE_
7cd0: 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74 68 65  Ignore, then the
7ce0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
7cf0: 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  throwing.      *
7d00: 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78 63 65  * an IGNORE exce
7d10: 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ption. In this c
7d20: 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  ase jump to the 
7d30: 61 64 64 72 65 73 73 20 73 70 65 63 69 66 69 65  address specifie
7d40: 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 74 68  d.      ** as th
7d50: 65 20 70 32 20 6f 66 20 74 68 65 20 63 61 6c 6c  e p2 of the call
7d60: 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 2e 20  ing OP_Program. 
7d70: 20 2a 2f 0a 20 20 20 20 20 20 70 63 78 20 3d 20   */.      pcx = 
7d80: 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32 2d 31  p->aOp[pcx].p2-1
7d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f 70 20  ;.    }.    aOp 
7da0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 61 4d  = p->aOp;.    aM
7db0: 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20  em = p->aMem;.  
7dc0: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 78    pOp = &aOp[pcx
7dd0: 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
7de0: 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f 70 2d  }.  p->rc = pOp-
7df0: 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  >p1;.  p->errorA
7e00: 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f 70 2d  ction = (u8)pOp-
7e10: 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 70  >p2;.  p->pc = p
7e20: 63 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  cx;.  assert( pO
7e30: 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20 69 66  p->p5<=4 );.  if
7e40: 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 69  ( p->rc ){.    i
7e50: 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  f( pOp->p5 ){.  
7e60: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7e70: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
7e80: 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54 20  Type[] = { "NOT 
7e90: 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22 2c  NULL", "UNIQUE",
7ea0: 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20 20 20   "CHECK",.      
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 20 20 20 22 46 4f 52 45 49 47 4e 20         "FOREIGN 
7ee0: 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20 74 65  KEY" };.      te
7ef0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d  stcase( pOp->p5=
7f00: 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
7f10: 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 32  case( pOp->p5==2
7f20: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f30: 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33 20 29  se( pOp->p5==3 )
7f40: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7f50: 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b 0a  ( pOp->p5==4 );.
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20 63 6f  eError(p, "%s co
7f80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7f90: 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e 70 35  , azType[pOp->p5
7fa0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1]);.      if( 
7fb0: 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20 20  pOp->p4.z ){.   
7fc0: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
7fd0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7fe0: 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c 20 70  (db, "%z: %s", p
7ff0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d 3e  ->zErrMsg, pOp->
8000: 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p4.z);.      }. 
8010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8020: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
8030: 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  (p, "%s", pOp->p
8040: 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  4.z);.    }.    
8050: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70 2d  sqlite3_log(pOp-
8060: 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20 25  >p1, "abort at %
8070: 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c 20  d in [%s]: %s", 
8080: 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70 2d  pcx, p->zSql, p-
8090: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20  >zErrMsg);.  }. 
80a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
80b0: 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73 65  eHalt(p);.  asse
80c0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  rt( rc==SQLITE_B
80d0: 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
80e0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
80f0: 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
8100: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
8110: 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  Y ){.    p->rc =
8120: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8130: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8140: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8150: 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
8160: 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
8170: 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  INT );.    asser
8180: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
8190: 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   || db->nDeferre
81a0: 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e 6e  dCons>0 || db->n
81b0: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3e  DeferredImmCons>
81c0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  0 );.    rc = p-
81d0: 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52 52  >rc ? SQLITE_ERR
81e0: 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  OR : SQLITE_DONE
81f0: 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64 62  ;.  }.  goto vdb
8200: 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20  e_return;.}../* 
8210: 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72 20  Opcode: Integer 
8220: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
8230: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50  ynopsis: r[P2]=P
8240: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d 62  1.**.** The 32-b
8250: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
8260: 20 50 31 20 69 73 20 77 72 69 74 74 65 6e 20 69   P1 is written i
8270: 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
8280: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65  .*/.case OP_Inte
8290: 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20 2f  ger: {         /
82a0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74  * out2 */.  pOut
82b0: 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
82c0: 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75  e(p, pOp);.  pOu
82d0: 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  t->u.i = pOp->p1
82e0: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
82f0: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20 2a   Opcode: Int64 *
8300: 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
8310: 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34  nopsis: r[P2]=P4
8320: 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70  .**.** P4 is a p
8330: 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62  ointer to a 64-b
8340: 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
8350: 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20  ..** Write that 
8360: 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73  value into regis
8370: 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
8380: 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20 20  OP_Int64: {     
8390: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
83a0: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
83b0: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
83c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
83d0: 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b 0a 20  >p4.pI64!=0 );. 
83e0: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70 4f   pOut->u.i = *pO
83f0: 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72  p->p4.pI64;.  br
8400: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
8410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
8420: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
8430: 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32 20  code: Real * P2 
8440: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
8450: 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a  is: r[P2]=P4.**.
8460: 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
8470: 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 66  er to a 64-bit f
8480: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
8490: 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68  lue..** Write th
84a0: 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65  at value into re
84b0: 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61  gister P2..*/.ca
84c0: 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20 20  se OP_Real: {   
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
84e0: 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f 75   as TK_FLOAT, ou
84f0: 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f  t2 */.  pOut = o
8500: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
8510: 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66   pOp);.  pOut->f
8520: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
8530: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
8540: 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e 70  te3IsNaN(*pOp->p
8550: 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70 4f  4.pReal) );.  pO
8560: 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d 3e  ut->u.r = *pOp->
8570: 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65 61  p4.pReal;.  brea
8580: 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
8590: 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38 20  Opcode: String8 
85a0: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  * P2 * P4 *.** S
85b0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 27  ynopsis: r[P2]='
85c0: 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69  P4'.**.** P4 poi
85d0: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  nts to a nul ter
85e0: 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73 74  minated UTF-8 st
85f0: 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f 64  ring. This opcod
8600: 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  e is transformed
8610: 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74 72 69   .** into a Stri
8620: 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f 72 65  ng opcode before
8630: 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64 20   it is executed 
8640: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
8650: 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a 20 74  me.  During.** t
8660: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
8670: 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  on, the length o
8680: 66 20 73 74 72 69 6e 67 20 50 34 20 69 73 20 63  f string P4 is c
8690: 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74 6f 72  omputed and stor
86a0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50 31 20  ed.** as the P1 
86b0: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63 61  parameter..*/.ca
86c0: 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a 20 7b  se OP_String8: {
86d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
86e0: 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c 20 6f   as TK_STRING, o
86f0: 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ut2 */.  assert(
8700: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b   pOp->p4.z!=0 );
8710: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8720: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8730: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
8740: 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20 70  = OP_String;.  p
8750: 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65 33  Op->p1 = sqlite3
8760: 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70 34  Strlen30(pOp->p4
8770: 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  .z);..#ifndef SQ
8780: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
8790: 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21 3d    if( encoding!=
87a0: 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20  SQLITE_UTF8 ){. 
87b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
87c0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75  dbeMemSetStr(pOu
87d0: 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d 31  t, pOp->p4.z, -1
87e0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
87f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
8800: 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
8810: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
8820: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b  SQLITE_TOOBIG );
8830: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8840: 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62 65 43  OK!=sqlite3VdbeC
8850: 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f  hangeEncoding(pO
8860: 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29 20  ut, encoding) ) 
8870: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
8880: 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e 73   assert( pOut->s
8890: 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 4f 75  zMalloc>0 && pOu
88a0: 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f 75 74  t->zMalloc==pOut
88b0: 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ->z );.    asser
88c0: 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  t( VdbeMemDynami
88d0: 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a 20 20  c(pOut)==0 );.  
88e0: 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f 63    pOut->szMalloc
88f0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
8900: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74 61  flags |= MEM_Sta
8910: 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  tic;.    if( pOp
8920: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59 4e  ->p4type==P4_DYN
8930: 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73 71  AMIC ){.      sq
8940: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8950: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
8960: 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  }.    pOp->p4typ
8970: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
8980: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
8990: 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 70  pOut->z;.    pOp
89a0: 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b 0a  ->p1 = pOut->n;.
89b0: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
89c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49  rc==SQLITE_TOOBI
89d0: 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  G );.#endif.  if
89e0: 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61 4c  ( pOp->p1>db->aL
89f0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8a00: 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
8a10: 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
8a20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d   }.  assert( rc=
8a30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8a40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
8a50: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
8a60: 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a 7d  , OP_String */.}
8a70: 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .  ./* Opcode: S
8a80: 74 72 69 6e 67 20 50 31 20 50 32 20 50 33 20 50  tring P1 P2 P3 P
8a90: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
8aa0: 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28 6c 65  : r[P2]='P4' (le
8ab0: 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  n=P1).**.** The 
8ac0: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34 20  string value P4 
8ad0: 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62 79  of length P1 (by
8ae0: 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20 69  tes) is stored i
8af0: 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
8b00: 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 6e 6f  *.** If P3 is no
8b10: 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 63  t zero and the c
8b20: 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74  ontent of regist
8b30: 65 72 20 50 33 20 69 73 20 65 71 75 61 6c 20 74  er P3 is equal t
8b40: 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  o P5, then.** th
8b50: 65 20 64 61 74 61 74 79 70 65 20 6f 66 20 74 68  e datatype of th
8b60: 65 20 72 65 67 69 73 74 65 72 20 50 32 20 69 73  e register P2 is
8b70: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 42 4c   converted to BL
8b80: 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74  OB.  The content
8b90: 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20   is.** the same 
8ba0: 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79 74 65  sequence of byte
8bb0: 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 20  s, it is merely 
8bc0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
8bd0: 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a 2a 2a   BLOB instead.**
8be0: 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20 61 73   of a string, as
8bf0: 20 69 66 20 69 74 20 68 61 64 20 62 65 65 6e 20   if it had been 
8c00: 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65 72 20  CAST.  In other 
8c10: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69 66 28  words:.**.** if(
8c20: 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67 5b 50   P3!=0 and reg[P
8c30: 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50 32 5d  3]==P5 ) reg[P2]
8c40: 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50 32 5d   := CAST(reg[P2]
8c50: 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63 61 73   as BLOB).*/.cas
8c60: 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 20 20  e OP_String: {  
8c70: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
8c80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
8c90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70  ->p4.z!=0 );.  p
8ca0: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
8cb0: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
8cc0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
8cd0: 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69 63  M_Str|MEM_Static
8ce0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75  |MEM_Term;.  pOu
8cf0: 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  t->z = pOp->p4.z
8d00: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70 4f  ;.  pOut->n = pO
8d10: 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e 65  p->p1;.  pOut->e
8d20: 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20  nc = encoding;. 
8d30: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
8d40: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69 66 6e  SIZE(pOut);.#ifn
8d50: 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f  def SQLITE_LIKE_
8d60: 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f  DOESNT_MATCH_BLO
8d70: 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  BS.  if( pOp->p3
8d80: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
8d90: 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  ( pOp->p3<=(p->n
8da0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
8db0: 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 33 20  or) );.    pIn3 
8dc0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
8dd0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
8de0: 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
8df0: 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Int );.    if( p
8e00: 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d 3e 70  In3->u.i==pOp->p
8e10: 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  5 ) pOut->flags 
8e20: 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53  = MEM_Blob|MEM_S
8e30: 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 72 65    }.#endif.  bre
8e50: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
8e60: 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50 33 20  : Null P1 P2 P3 
8e70: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
8e80: 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a   r[P2..P3]=NULL.
8e90: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e 55  **.** Write a NU
8ea0: 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  LL into register
8eb0: 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72 65  s P2.  If P3 gre
8ec0: 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74 68  ater than P2, th
8ed0: 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a 2a  en also write.**
8ee0: 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73   NULL into regis
8ef0: 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72 79  ter P3 and every
8f00: 20 72 65 67 69 73 74 65 72 20 69 6e 20 62 65 74   register in bet
8f10: 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e 20  ween P2 and P3. 
8f20: 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65 73   If P3.** is les
8f30: 73 20 74 68 61 6e 20 50 32 20 28 74 79 70 69 63  s than P2 (typic
8f40: 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f 29  ally P3 is zero)
8f50: 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69 73   then only regis
8f60: 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65 74  ter P2 is.** set
8f70: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
8f80: 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  If the P1 value 
8f90: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
8fa0: 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 4d  n also set the M
8fb0: 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61 67 20  EM_Cleared flag 
8fc0: 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c 20  so that.** NULL 
8fd0: 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f 74 20  values will not 
8fe0: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 65 76  compare equal ev
8ff0: 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e 55 4c  en if SQLITE_NUL
9000: 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a 2a 2a  LEQ is set on.**
9010: 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45 71 2e   OP_Ne or OP_Eq.
9020: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
9030: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  : {           /*
9040: 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20 63   out2 */.  int c
9050: 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46 6c  nt;.  u16 nullFl
9060: 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  ag;.  pOut = out
9070: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
9080: 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70 4f 70  Op);.  cnt = pOp
9090: 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20 20  ->p3-pOp->p2;.  
90a0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
90b0: 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
90c0: 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
90d0: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75 6c  Out->flags = nul
90e0: 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70 31 20  lFlag = pOp->p1 
90f0: 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  ? (MEM_Null|MEM_
9100: 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d 5f 4e  Cleared) : MEM_N
9110: 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  ull;.  pOut->n =
9120: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63 6e 74   0;.  while( cnt
9130: 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2b 2b  >0 ){.    pOut++
9140: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
9150: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
9160: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9170: 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
9180: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  ;.    pOut->flag
9190: 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20 20  s = nullFlag;.  
91a0: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
91b0: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20     cnt--;.  }.  
91c0: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
91d0: 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20 50 31  ode: SoftNull P1
91e0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f   * * * *.** Syno
91f0: 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c 4c  psis: r[P1]=NULL
9200: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67 69 73  .**.** Set regis
9210: 74 65 72 20 50 31 20 74 6f 20 68 61 76 65 20 74  ter P1 to have t
9220: 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 61 73  he value NULL as
9230: 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f 50 5f   seen by the OP_
9240: 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20 69 6e  MakeRecord.** in
9250: 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74 20 64  struction, but d
9260: 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20 73  o not free any s
9270: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d 65  tring or blob me
9280: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
9290: 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 67 69  with.** the regi
92a0: 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20 69 66  ster, so that if
92b0: 20 74 68 65 20 76 61 6c 75 65 20 77 61 73 20 61   the value was a
92c0: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
92d0: 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65 76  that was.** prev
92e0: 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20 75 73  iously copied us
92f0: 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20 74 68  ing OP_SCopy, th
9300: 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20 63 6f  e copies will co
9310: 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76 61 6c  ntinue to be val
9320: 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  id..*/.case OP_S
9330: 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73 73  oftNull: {.  ass
9340: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
9350: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
9360: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9370: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
9380: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
9390: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
93a0: 28 70 4f 75 74 2d 3e 66 6c 61 67 73 26 7e 28 4d  (pOut->flags&~(M
93b0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 7c 4d 45 4d  EM_Undefined|MEM
93c0: 5f 41 66 66 4d 61 73 6b 29 29 7c 4d 45 4d 5f 4e  _AffMask))|MEM_N
93d0: 75 6c 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ull;.  break;.}.
93e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 6c 6f 62  ./* Opcode: Blob
93f0: 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a   P1 P2 * P4 *.**
9400: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
9410: 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a 2a 2a 0a  =P4 (len=P1).**.
9420: 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74 6f 20  ** P4 points to 
9430: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 50  a blob of data P
9440: 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 53  1 bytes long.  S
9450: 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20 62 6c 6f  tore this.** blo
9460: 62 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  b in register P2
9470: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 6c 6f  ..*/.case OP_Blo
9480: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
9490: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
94a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
94b0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   <= SQLITE_MAX_L
94c0: 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f 75 74 20  ENGTH );.  pOut 
94d0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
94e0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69  (p, pOp);.  sqli
94f0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
9500: 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a  (pOut, pOp->p4.z
9510: 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 30 29  , pOp->p1, 0, 0)
9520: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
9530: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
9540: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
9550: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
9560: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61  }../* Opcode: Va
9570: 72 69 61 62 6c 65 20 50 31 20 50 32 20 2a 20 50  riable P1 P2 * P
9580: 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
9590: 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65 74 65 72   r[P2]=parameter
95a0: 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a 20 54 72  (P1,P4).**.** Tr
95b0: 61 6e 73 66 65 72 20 74 68 65 20 76 61 6c 75 65  ansfer the value
95c0: 73 20 6f 66 20 62 6f 75 6e 64 20 70 61 72 61 6d  s of bound param
95d0: 65 74 65 72 20 50 31 20 69 6e 74 6f 20 72 65 67  eter P1 into reg
95e0: 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a 2a 20 49  ister P2.**.** I
95f0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
9600: 69 73 20 6e 61 6d 65 64 2c 20 74 68 65 6e 20 69  is named, then i
9610: 74 73 20 6e 61 6d 65 20 61 70 70 65 61 72 73 20  ts name appears 
9620: 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65 20 50 34  in P4..** The P4
9630: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 62   value is used b
9640: 79 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  y sqlite3_bind_p
9650: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29 2e  arameter_name().
9660: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 72 69  .*/.case OP_Vari
9670: 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
9680: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
9690: 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20 20 20 20  Mem *pVar;      
96a0: 20 2f 2a 20 56 61 6c 75 65 20 62 65 69 6e 67 20   /* Value being 
96b0: 74 72 61 6e 73 66 65 72 72 65 64 20 2a 2f 0a 0a  transferred */..
96c0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
96d0: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
96e0: 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20 61 73 73  p->nVar );.  ass
96f0: 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  ert( pOp->p4.z==
9700: 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 7a 3d 3d  0 || pOp->p4.z==
9710: 73 71 6c 69 74 65 33 56 4c 69 73 74 4e 75 6d 54  sqlite3VListNumT
9720: 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69 73 74 2c  oName(p->pVList,
9730: 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 70 56  pOp->p1) );.  pV
9740: 61 72 20 3d 20 26 70 2d 3e 61 56 61 72 5b 70 4f  ar = &p->aVar[pO
9750: 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 69 66  p->p1 - 1];.  if
9760: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
9770: 54 6f 6f 42 69 67 28 70 56 61 72 29 20 29 7b 0a  TooBig(pVar) ){.
9780: 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
9790: 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26  ;.  }.  pOut = &
97a0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
97b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
97c0: 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c  hallowCopy(pOut,
97d0: 20 70 56 61 72 2c 20 4d 45 4d 5f 53 74 61 74 69   pVar, MEM_Stati
97e0: 63 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  c);.  UPDATE_MAX
97f0: 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
9800: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9810: 4f 70 63 6f 64 65 3a 20 4d 6f 76 65 20 50 31 20  Opcode: Move P1 
9820: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9830: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 5d 3d  opsis: r[P2@P3]=
9840: 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d  r[P1@P3].**.** M
9850: 6f 76 65 20 74 68 65 20 50 33 20 76 61 6c 75 65  ove the P3 value
9860: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
9870: 2e 2e 50 31 2b 50 33 2d 31 20 6f 76 65 72 20 69  ..P1+P3-1 over i
9880: 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  nto.** registers
9890: 20 50 32 2e 2e 50 32 2b 50 33 2d 31 2e 20 20 52   P2..P2+P3-1.  R
98a0: 65 67 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b  egisters P1..P1+
98b0: 50 33 2d 31 20 61 72 65 0a 2a 2a 20 6c 65 66 74  P3-1 are.** left
98c0: 20 68 6f 6c 64 69 6e 67 20 61 20 4e 55 4c 4c 2e   holding a NULL.
98d0: 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
98e0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 20 72 61   for register ra
98f0: 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e 50 31 2b 50  nges.** P1..P1+P
9900: 33 2d 31 20 61 6e 64 20 50 32 2e 2e 50 32 2b 50  3-1 and P2..P2+P
9910: 33 2d 31 20 74 6f 20 6f 76 65 72 6c 61 70 2e 20  3-1 to overlap. 
9920: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 0a   It is an error.
9930: 2a 2a 20 66 6f 72 20 50 33 20 74 6f 20 62 65 20  ** for P3 to be 
9940: 6c 65 73 73 20 74 68 61 6e 20 31 2e 0a 2a 2f 0a  less than 1..*/.
9950: 63 61 73 65 20 4f 50 5f 4d 6f 76 65 3a 20 7b 0a  case OP_Move: {.
9960: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9980: 72 65 67 69 73 74 65 72 73 20 6c 65 66 74 20 74  registers left t
9990: 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
99a0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p1;          /* 
99b0: 52 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79  Register to copy
99c0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 70   from */.  int p
99d0: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  2;          /* R
99e0: 65 67 69 73 74 65 72 20 74 6f 20 63 6f 70 79 20  egister to copy 
99f0: 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d 20 70 4f 70  to */..  n = pOp
9a00: 2d 3e 70 33 3b 0a 20 20 70 31 20 3d 20 70 4f 70  ->p3;.  p1 = pOp
9a10: 2d 3e 70 31 3b 0a 20 20 70 32 20 3d 20 70 4f 70  ->p1;.  p2 = pOp
9a20: 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p2;.  assert( 
9a30: 6e 3e 30 20 26 26 20 70 31 3e 30 20 26 26 20 70  n>0 && p1>0 && p
9a40: 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  2>0 );.  assert(
9a50: 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c 20 70 32 2b   p1+n<=p2 || p2+
9a60: 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20 70 49 6e 31  n<=p1 );..  pIn1
9a70: 20 3d 20 26 61 4d 65 6d 5b 70 31 5d 3b 0a 20 20   = &aMem[p1];.  
9a80: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pOut = &aMem[p2]
9a90: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
9aa0: 72 74 28 20 70 4f 75 74 3c 3d 26 61 4d 65 6d 5b  rt( pOut<=&aMem[
9ab0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9ac0: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9ad0: 20 61 73 73 65 72 74 28 20 70 49 6e 31 3c 3d 26   assert( pIn1<=&
9ae0: 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20  aMem[(p->nMem+1 
9af0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29  - p->nCursor)] )
9b00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
9b10: 6d 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29  mIsValid(pIn1) )
9b20: 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  ;.    memAboutTo
9b30: 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
9b40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9b50: 4d 65 6d 4d 6f 76 65 28 70 4f 75 74 2c 20 70 49  MemMove(pOut, pI
9b60: 6e 31 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  n1);.#ifdef SQLI
9b70: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28  TE_DEBUG.    if(
9b80: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
9b90: 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d 20 26 26 20  m>=&aMem[p1] && 
9ba0: 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d  pOut->pScopyFrom
9bb0: 3c 70 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 70  <pOut ){.      p
9bc0: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9bd0: 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d 20 70 31 3b  += pOp->p2 - p1;
9be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9bf0: 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65    Deephemeralize
9c00: 28 70 4f 75 74 29 3b 0a 20 20 20 20 52 45 47 49  (pOut);.    REGI
9c10: 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 2b 2c  STER_TRACE(p2++,
9c20: 20 70 4f 75 74 29 3b 0a 20 20 20 20 70 49 6e 31   pOut);.    pIn1
9c30: 2b 2b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a  ++;.    pOut++;.
9c40: 20 20 7d 77 68 69 6c 65 28 20 2d 2d 6e 20 29 3b    }while( --n );
9c50: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
9c60: 4f 70 63 6f 64 65 3a 20 43 6f 70 79 20 50 31 20  Opcode: Copy P1 
9c70: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
9c80: 6f 70 73 69 73 3a 20 72 5b 50 32 40 50 33 2b 31  opsis: r[P2@P3+1
9c90: 5d 3d 72 5b 50 31 40 50 33 2b 31 5d 0a 2a 2a 0a  ]=r[P1@P3+1].**.
9ca0: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
9cb0: 66 20 72 65 67 69 73 74 65 72 73 20 50 31 2e 2e  f registers P1..
9cc0: 50 31 2b 50 33 20 69 6e 74 6f 20 72 65 67 69 73  P1+P3 into regis
9cd0: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2e 0a  ters P2..P2+P3..
9ce0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
9cf0: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 64  uction makes a d
9d00: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
9d10: 76 61 6c 75 65 2e 20 20 41 20 64 75 70 6c 69 63  value.  A duplic
9d20: 61 74 65 0a 2a 2a 20 69 73 20 6d 61 64 65 20 6f  ate.** is made o
9d30: 66 20 61 6e 79 20 73 74 72 69 6e 67 20 6f 72 20  f any string or 
9d40: 62 6c 6f 62 20 63 6f 6e 73 74 61 6e 74 2e 20 20  blob constant.  
9d50: 53 65 65 20 61 6c 73 6f 20 4f 50 5f 53 43 6f 70  See also OP_SCop
9d60: 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  y..*/.case OP_Co
9d70: 70 79 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  py: {.  int n;..
9d80: 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20    n = pOp->p3;. 
9d90: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
9da0: 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d  p->p1];.  pOut =
9db0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
9dc0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21  .  assert( pOut!
9dd0: 3d 70 49 6e 31 20 29 3b 0a 20 20 77 68 69 6c 65  =pIn1 );.  while
9de0: 28 20 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( 1 ){.    sqlit
9df0: 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
9e00: 43 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c  Copy(pOut, pIn1,
9e10: 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
9e20: 20 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65 28   Deephemeralize(
9e30: 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  pOut);.#ifdef SQ
9e40: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70  LITE_DEBUG.    p
9e50: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20  Out->pScopyFrom 
9e60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
9e70: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
9e80: 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2d 6e  Op->p2+pOp->p3-n
9e90: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  , pOut);.    if(
9ea0: 20 28 6e 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (n--)==0 ) brea
9eb0: 6b 3b 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20  k;.    pOut++;. 
9ec0: 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d 0a 20     pIn1++;.  }. 
9ed0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
9ee0: 63 6f 64 65 3a 20 53 43 6f 70 79 20 50 31 20 50  code: SCopy P1 P
9ef0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
9f00: 73 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d  sis: r[P2]=r[P1]
9f10: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 73 68  .**.** Make a sh
9f20: 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 72 65  allow copy of re
9f30: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
9f40: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
9f50: 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
9f60: 6f 6e 20 6d 61 6b 65 73 20 61 20 73 68 61 6c 6c  on makes a shall
9f70: 6f 77 20 63 6f 70 79 20 6f 66 20 74 68 65 20 76  ow copy of the v
9f80: 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 76 61  alue.  If the va
9f90: 6c 75 65 0a 2a 2a 20 69 73 20 61 20 73 74 72 69  lue.** is a stri
9fa0: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 74 68 65 6e  ng or blob, then
9fb0: 20 74 68 65 20 63 6f 70 79 20 69 73 20 6f 6e 6c   the copy is onl
9fc0: 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
9fd0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 61  he.** original a
9fe0: 6e 64 20 68 65 6e 63 65 20 69 66 20 74 68 65 20  nd hence if the 
9ff0: 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65 73  original changes
a000: 20 73 6f 20 77 69 6c 6c 20 74 68 65 20 63 6f 70   so will the cop
a010: 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c 20 69 66 20  y..** Worse, if 
a020: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 73 20  the original is 
a030: 64 65 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  deallocated, the
a040: 20 63 6f 70 79 20 62 65 63 6f 6d 65 73 20 69 6e   copy becomes in
a050: 76 61 6c 69 64 2e 0a 2a 2a 20 54 68 75 73 20 74  valid..** Thus t
a060: 68 65 20 70 72 6f 67 72 61 6d 20 6d 75 73 74 20  he program must 
a070: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
a080: 68 65 20 6f 72 69 67 69 6e 61 6c 20 77 69 6c 6c  he original will
a090: 20 6e 6f 74 20 63 68 61 6e 67 65 0a 2a 2a 20 64   not change.** d
a0a0: 75 72 69 6e 67 20 74 68 65 20 6c 69 66 65 74 69  uring the lifeti
a0b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 70 79 2e 20  me of the copy. 
a0c0: 20 55 73 65 20 4f 50 5f 43 6f 70 79 20 74 6f 20   Use OP_Copy to 
a0d0: 6d 61 6b 65 20 61 20 63 6f 6d 70 6c 65 74 65 0a  make a complete.
a0e0: 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65  ** copy..*/.case
a0f0: 20 4f 50 5f 53 43 6f 70 79 3a 20 7b 20 20 20 20   OP_SCopy: {    
a100: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
a110: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
a120: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
a130: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a140: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
a150: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 73  Out!=pIn1 );.  s
a160: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
a170: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
a180: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
a190: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a1a0: 45 42 55 47 0a 20 20 69 66 28 20 70 4f 75 74 2d  EBUG.  if( pOut-
a1b0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3d 3d 30 20 29  >pScopyFrom==0 )
a1c0: 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f   pOut->pScopyFro
a1d0: 6d 20 3d 20 70 49 6e 31 3b 0a 23 65 6e 64 69 66  m = pIn1;.#endif
a1e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
a1f0: 4f 70 63 6f 64 65 3a 20 49 6e 74 43 6f 70 79 20  Opcode: IntCopy 
a200: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
a210: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
a220: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  [P1].**.** Trans
a230: 66 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 20  fer the integer 
a240: 76 61 6c 75 65 20 68 65 6c 64 20 69 6e 20 72 65  value held in re
a250: 67 69 73 74 65 72 20 50 31 20 69 6e 74 6f 20 72  gister P1 into r
a260: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
a270: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
a280: 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
a290: 66 20 53 43 6f 70 79 20 74 68 61 74 20 77 6f 72  f SCopy that wor
a2a0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 69 6e 74 65  ks only for inte
a2b0: 67 65 72 0a 2a 2a 20 76 61 6c 75 65 73 2e 0a 2a  ger.** values..*
a2c0: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 43 6f 70  /.case OP_IntCop
a2d0: 79 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  y: {            
a2e0: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e  /* out2 */.  pIn
a2f0: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
a300: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  1];.  assert( (p
a310: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
a320: 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 70 4f  _Int)!=0 );.  pO
a330: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
a340: 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p2];.  sqlite3Vd
a350: 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4f  beMemSetInt64(pO
a360: 75 74 2c 20 70 49 6e 31 2d 3e 75 2e 69 29 3b 0a  ut, pIn1->u.i);.
a370: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
a380: 70 63 6f 64 65 3a 20 52 65 73 75 6c 74 52 6f 77  pcode: ResultRow
a390: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
a3a0: 53 79 6e 6f 70 73 69 73 3a 20 6f 75 74 70 75 74  Synopsis: output
a3b0: 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a 0a 2a 2a 20  =r[P1@P2].**.** 
a3c0: 54 68 65 20 72 65 67 69 73 74 65 72 73 20 50 31  The registers P1
a3d0: 20 74 68 72 6f 75 67 68 20 50 31 2b 50 32 2d 31   through P1+P2-1
a3e0: 20 63 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c   contain a singl
a3f0: 65 20 72 6f 77 20 6f 66 0a 2a 2a 20 72 65 73 75  e row of.** resu
a400: 6c 74 73 2e 20 54 68 69 73 20 6f 70 63 6f 64 65  lts. This opcode
a410: 20 63 61 75 73 65 73 20 74 68 65 20 73 71 6c 69   causes the sqli
a420: 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 20  te3_step() call 
a430: 74 6f 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20  to terminate.** 
a440: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 52  with an SQLITE_R
a450: 4f 57 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  OW return code a
a460: 6e 64 20 69 74 20 73 65 74 73 20 75 70 20 74 68  nd it sets up th
a470: 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 0a 2a  e sqlite3_stmt.*
a480: 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 70  * structure to p
a490: 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74 6f  rovide access to
a4a0: 20 74 68 65 20 72 28 50 31 29 2e 2e 72 28 50 31   the r(P1)..r(P1
a4b0: 2b 50 32 2d 31 29 20 76 61 6c 75 65 73 20 61 73  +P2-1) values as
a4c0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 72  .** the result r
a4d0: 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  ow..*/.case OP_R
a4e0: 65 73 75 6c 74 52 6f 77 3a 20 7b 0a 20 20 4d 65  esultRow: {.  Me
a4f0: 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 69  m *pMem;.  int i
a500: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
a510: 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e  ResColumn==pOp->
a520: 70 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p2 );.  assert( 
a530: 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20 20 61  pOp->p1>0 );.  a
a540: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 2b 70  ssert( pOp->p1+p
a550: 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p2<=(p->nMem
a560: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
a570: 2b 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  +1 );..#ifndef S
a580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
a590: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f  ESS_CALLBACK.  /
a5a0: 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 67 72 65  * Run the progre
a5b0: 73 73 20 63 6f 75 6e 74 65 72 20 6a 75 73 74 20  ss counter just 
a5c0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
a5d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
a5e0: 3e 78 50 72 6f 67 72 65 73 73 21 3d 30 0a 20 20  >xProgress!=0.  
a5f0: 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72   && nVmStep>=nPr
a600: 6f 67 72 65 73 73 4c 69 6d 69 74 20 0a 20 20 20  ogressLimit .   
a610: 26 26 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73  && db->xProgress
a620: 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72  (db->pProgressAr
a630: 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  g)!=0.  ){.    r
a640: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
a650: 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 61  RUPT;.    goto a
a660: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
a670: 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  r;.  }.#endif.. 
a680: 20 2f 2a 20 49 66 20 74 68 69 73 20 73 74 61 74   /* If this stat
a690: 65 6d 65 6e 74 20 68 61 73 20 76 69 6f 6c 61 74  ement has violat
a6a0: 65 64 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  ed immediate for
a6b0: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
a6c0: 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a 20 6e 6f  ints, do.  ** no
a6d0: 74 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  t return the num
a6e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6d 6f 64 69  ber of rows modi
a6f0: 66 69 65 64 2e 20 41 6e 64 20 64 6f 20 6e 6f 74  fied. And do not
a700: 20 52 45 4c 45 41 53 45 20 74 68 65 20 73 74 61   RELEASE the sta
a710: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
a720: 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e 65 65 64  saction. It need
a730: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
a740: 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 53  ack.  */.  if( S
a750: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
a760: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a770: 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a 20 20 20  Fk(p, 0)) ){.   
a780: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 66 6c 61   assert( db->fla
a790: 67 73 26 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52  gs&SQLITE_CountR
a7a0: 6f 77 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ows );.    asser
a7b0: 74 28 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  t( p->usesStmtJo
a7c0: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 67 6f 74  urnal );.    got
a7d0: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
a7e0: 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
a7f0: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 43 6f  If the SQLITE_Co
a800: 75 6e 74 52 6f 77 73 20 66 6c 61 67 20 69 73 20  untRows flag is 
a810: 73 65 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  set in sqlite3.f
a820: 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68 65 6e 20  lags mask, then 
a830: 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61 74 65 6d  .  ** DML statem
a840: 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74 68 69 73  ents invoke this
a850: 20 6f 70 63 6f 64 65 20 74 6f 20 72 65 74 75 72   opcode to retur
a860: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
a870: 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  rows .  ** modif
a880: 69 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ied to the user.
a890: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
a8a0: 79 20 77 61 79 20 74 68 61 74 20 61 20 56 4d 20  y way that a VM 
a8b0: 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65 6e 73 20  that.  ** opens 
a8c0: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
a8d0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 69 6e 76 6f  saction may invo
a8e0: 6b 65 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a  ke this opcode..
a8f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
a900: 65 20 74 68 69 73 20 69 73 20 73 75 63 68 20 61  e this is such a
a910: 20 73 74 61 74 65 6d 65 6e 74 2c 20 63 6c 6f 73   statement, clos
a920: 65 20 61 6e 79 20 73 74 61 74 65 6d 65 6e 74 20  e any statement 
a930: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
a940: 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
a950: 56 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  VM before return
a960: 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  ing control to t
a970: 68 65 20 75 73 65 72 2e 20 54 68 69 73 20 69 73  he user. This is
a980: 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72 65 20   to.  ** ensure 
a990: 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 2d 74  that statement-t
a9a0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
a9b0: 61 6c 77 61 79 73 20 6e 65 73 74 65 64 2c 20 6e  always nested, n
a9c0: 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 2e 0a  ot overlapping..
a9d0: 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 6e    ** If the open
a9e0: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
a9f0: 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6c  action is not cl
aa00: 6f 73 65 64 20 68 65 72 65 2c 20 74 68 65 6e 20  osed here, then 
aa10: 74 68 65 20 75 73 65 72 0a 20 20 2a 2a 20 6d 61  the user.  ** ma
aa20: 79 20 73 74 65 70 20 61 6e 6f 74 68 65 72 20 56  y step another V
aa30: 4d 20 74 68 61 74 20 6f 70 65 6e 73 20 69 74 73  M that opens its
aa40: 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e 74 20 74   own statement t
aa50: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
aa60: 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61 64 20 74  .  ** may lead t
aa70: 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 73 74  o overlapping st
aa80: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
aa90: 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ions..  **.  ** 
aaa0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  The statement tr
aab0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 76  ansaction is nev
aac0: 65 72 20 61 20 74 6f 70 2d 6c 65 76 65 6c 20 74  er a top-level t
aad0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 48 65 6e  ransaction.  Hen
aae0: 63 65 0a 20 20 2a 2a 20 74 68 65 20 52 45 4c 45  ce.  ** the RELE
aaf0: 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f 77 20 63  ASE call below c
ab00: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 20  an never fail.. 
ab10: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ab20: 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 7c  >iStatement==0 |
ab30: 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  | db->flags&SQLI
ab40: 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b 0a  TE_CountRows );.
ab50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
ab60: 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
ab70: 28 70 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  (p, SAVEPOINT_RE
ab80: 4c 45 41 53 45 29 3b 0a 20 20 61 73 73 65 72 74  LEASE);.  assert
ab90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
aba0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64  );..  /* Invalid
abb0: 61 74 65 20 61 6c 6c 20 65 70 68 65 6d 65 72 61  ate all ephemera
abc0: 6c 20 63 75 72 73 6f 72 20 72 6f 77 20 63 61 63  l cursor row cac
abd0: 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63 61 63 68  hes */.  p->cach
abe0: 65 43 74 72 20 3d 20 28 70 2d 3e 63 61 63 68 65  eCtr = (p->cache
abf0: 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a 20 20 2f  Ctr + 2)|1;..  /
ac00: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
ac10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 63  results of the c
ac20: 75 72 72 65 6e 74 20 72 6f 77 20 61 72 65 20 5c  urrent row are \
ac30: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  000 terminated. 
ac40: 20 2a 2a 20 61 6e 64 20 68 61 76 65 20 61 6e 20   ** and have an 
ac50: 61 73 73 69 67 6e 65 64 20 74 79 70 65 2e 20 20  assigned type.  
ac60: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
ac70: 64 65 2d 65 70 68 65 6d 65 72 61 6c 69 7a 65 64  de-ephemeralized
ac80: 20 61 73 0a 20 20 2a 2a 20 61 20 73 69 64 65 20   as.  ** a side 
ac90: 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 70  effect..  */.  p
aca0: 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74  Mem = p->pResult
acb0: 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Set = &aMem[pOp-
acc0: 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >p1];.  for(i=0;
acd0: 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69 2b 2b 29   i<pOp->p2; i++)
ace0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  {.    assert( me
acf0: 6d 49 73 56 61 6c 69 64 28 26 70 4d 65 6d 5b 69  mIsValid(&pMem[i
ad00: 5d 29 20 29 3b 0a 20 20 20 20 44 65 65 70 68 65  ]) );.    Deephe
ad10: 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65 6d 5b 69  meralize(&pMem[i
ad20: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
ad30: 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26  (pMem[i].flags &
ad40: 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d 30 0a 20   MEM_Ephem)==0. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
ad60: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20 26 20 28  Mem[i].flags & (
ad70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
ad80: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ))==0 );.    sql
ad90: 69 74 65 33 56 64 62 65 4d 65 6d 4e 75 6c 54 65  ite3VdbeMemNulTe
ada0: 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d 5b 69 5d  rminate(&pMem[i]
adb0: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
adc0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2b 69 2c  TRACE(pOp->p1+i,
add0: 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 7d 0a   &pMem[i]);.  }.
ade0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
adf0: 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 6e 6f  Failed ) goto no
ae00: 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20 64 62 2d  _mem;..  if( db-
ae10: 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49 54 45  >mTrace & SQLITE
ae20: 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b 0a 20 20  _TRACE_ROW ){.  
ae30: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
ae40: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 2c 20 64  ITE_TRACE_ROW, d
ae50: 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 70 2c  b->pTraceArg, p,
ae60: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52   0);.  }..  /* R
ae70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 4f 57  eturn SQLITE_ROW
ae80: 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63 20 3d 20  .  */.  p->pc = 
ae90: 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
aea0: 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20 53 51 4c   + 1;.  rc = SQL
aeb0: 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f 74 6f 20  ITE_ROW;.  goto 
aec0: 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a  vdbe_return;.}..
aed0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6e 63 61  /* Opcode: Conca
aee0: 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
aef0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
af00: 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d 0a 2a 2a  ]=r[P2]+r[P1].**
af10: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 65 78 74  .** Add the text
af20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
af30: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
af40: 74 68 65 20 74 65 78 74 20 69 6e 0a 2a 2a 20 72  the text in.** r
af50: 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 73  egister P2 and s
af60: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
af70: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
af80: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  ** If either the
af90: 20 50 31 20 6f 72 20 50 32 20 74 65 78 74 20 61   P1 or P2 text a
afa0: 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f  re NULL then sto
afb0: 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33 2e 0a 2a  re NULL in P3..*
afc0: 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50 32 20 7c  *.**   P3 = P2 |
afd0: 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  | P1.**.** It is
afe0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 50 31 20   illegal for P1 
aff0: 61 6e 64 20 50 33 20 74 6f 20 62 65 20 74 68 65  and P3 to be the
b000: 20 73 61 6d 65 20 72 65 67 69 73 74 65 72 2e 20   same register. 
b010: 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a 20 69 66  Sometimes,.** if
b020: 20 50 33 20 69 73 20 74 68 65 20 73 61 6d 65 20   P3 is the same 
b030: 72 65 67 69 73 74 65 72 20 61 73 20 50 32 2c 20  register as P2, 
b040: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
b050: 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a 20 74 6f  on is able.** to
b060: 20 61 76 6f 69 64 20 61 20 6d 65 6d 63 70 79 28   avoid a memcpy(
b070: 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f  )..*/.case OP_Co
b080: 6e 63 61 74 3a 20 7b 20 20 20 20 20 20 20 20 20  ncat: {         
b090: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
b0a0: 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20 69 6e 32  CONCAT, in1, in2
b0b0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34 20  , out3 */.  i64 
b0c0: 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e 31 20 3d  nByte;..  pIn1 =
b0d0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
b0e0: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
b0f0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74  pOp->p2];.  pOut
b100: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
b110: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
b120: 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20 69 66 28  1!=pOut );.  if(
b130: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20   (pIn1->flags | 
b140: 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  pIn2->flags) & M
b150: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 73  EM_Null ){.    s
b160: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
b170: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20 20  Null(pOut);.    
b180: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
b190: 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 31   ExpandBlob(pIn1
b1a0: 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c 6f 62 28  ) || ExpandBlob(
b1b0: 70 49 6e 32 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pIn2) ) goto no_
b1c0: 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  mem;.  Stringify
b1d0: 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
b1e0: 3b 0a 20 20 53 74 72 69 6e 67 69 66 79 28 70 49  ;.  Stringify(pI
b1f0: 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  n2, encoding);. 
b200: 20 6e 42 79 74 65 20 3d 20 70 49 6e 31 2d 3e 6e   nByte = pIn1->n
b210: 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 69 66   + pIn2->n;.  if
b220: 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61 4c 69 6d  ( nByte>db->aLim
b230: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
b240: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67  LENGTH] ){.    g
b250: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
b260: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
b270: 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75 74 2c 20  beMemGrow(pOut, 
b280: 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c 20 70 4f  (int)nByte+2, pO
b290: 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a 20 20 20  ut==pIn2) ){.   
b2a0: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
b2b0: 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  }.  MemSetTypeFl
b2c0: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 53 74 72  ag(pOut, MEM_Str
b2d0: 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 70  );.  if( pOut!=p
b2e0: 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  In2 ){.    memcp
b2f0: 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49 6e 32 2d  y(pOut->z, pIn2-
b300: 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b 0a 20 20  >z, pIn2->n);.  
b310: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 4f 75 74  }.  memcpy(&pOut
b320: 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c 20 70 49  ->z[pIn2->n], pI
b330: 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e 6e 29 3b  n1->z, pIn1->n);
b340: 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65  .  pOut->z[nByte
b350: 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e  ]=0;.  pOut->z[n
b360: 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  Byte+1] = 0;.  p
b370: 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Out->flags |= ME
b380: 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e  M_Term;.  pOut->
b390: 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a  n = (int)nByte;.
b3a0: 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e    pOut->enc = en
b3b0: 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41 54 45  coding;.  UPDATE
b3c0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
b3d0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
b3e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 64 64 20  ./* Opcode: Add 
b3f0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
b400: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
b410: 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]+r[P2].**.*
b420: 2a 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20  * Add the value 
b430: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 74  in register P1 t
b440: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
b450: 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e  egister P2.** an
b460: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
b470: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
b480: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
b490: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
b4a0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
b4b0: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
b4c0: 20 4d 75 6c 74 69 70 6c 79 20 50 31 20 50 32 20   Multiply P1 P2 
b4d0: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b4e0: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2a  is: r[P3]=r[P1]*
b4f0: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d  r[P2].**.**.** M
b500: 75 6c 74 69 70 6c 79 20 74 68 65 20 76 61 6c 75  ultiply the valu
b510: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
b520: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e   by the value in
b530: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20   register P2.** 
b540: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
b550: 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72  sult in register
b560: 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65   P3..** If eithe
b570: 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c  r input is NULL,
b580: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
b590: 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ULL..*/./* Opcod
b5a0: 65 3a 20 53 75 62 74 72 61 63 74 20 50 31 20 50  e: Subtract P1 P
b5b0: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
b5c0: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
b5d0: 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 75  ]-r[P1].**.** Su
b5e0: 62 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  btract the value
b5f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b600: 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 65 20 69  from the value i
b610: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b620: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b630: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b640: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b650: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b660: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b670: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b680: 64 65 3a 20 44 69 76 69 64 65 20 50 31 20 50 32  de: Divide P1 P2
b690: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b6a0: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
b6b0: 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 44 69 76  /r[P1].**.** Div
b6c0: 69 64 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ide the value in
b6d0: 20 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20   register P1 by 
b6e0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b6f0: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
b700: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b710: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20   in register P3 
b720: 28 50 33 3d 50 32 2f 50 31 29 2e 20 49 66 20 74  (P3=P2/P1). If t
b730: 68 65 20 76 61 6c 75 65 20 69 6e 20 0a 2a 2a 20  he value in .** 
b740: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
b750: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ero, then the re
b760: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 49 66  sult is NULL. If
b770: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
b780: 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 72   .** NULL, the r
b790: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b7a0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6d  /./* Opcode: Rem
b7b0: 61 69 6e 64 65 72 20 50 31 20 50 32 20 50 33 20  ainder P1 P2 P3 
b7c0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
b7d0: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25 72 5b 50   r[P3]=r[P2]%r[P
b7e0: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  1].**.** Compute
b7f0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 61   the remainder a
b800: 66 74 65 72 20 69 6e 74 65 67 65 72 20 72 65 67  fter integer reg
b810: 69 73 74 65 72 20 50 32 20 69 73 20 64 69 76 69  ister P2 is divi
b820: 64 65 64 20 62 79 20 0a 2a 2a 20 72 65 67 69 73  ded by .** regis
b830: 74 65 72 20 50 31 20 61 6e 64 20 73 74 6f 72 65  ter P1 and store
b840: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
b850: 65 67 69 73 74 65 72 20 50 33 2e 20 0a 2a 2a 20  egister P3. .** 
b860: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  If the value in 
b870: 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 7a  register P1 is z
b880: 65 72 6f 20 74 68 65 20 72 65 73 75 6c 74 20 69  ero the result i
b890: 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66 20 65 69  s NULL..** If ei
b8a0: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
b8b0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b8c0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
b8d0: 65 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20  e OP_Add:       
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b8f0: 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55 53 2c 20  ame as TK_PLUS, 
b900: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
b910: 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61  /.case OP_Subtra
b920: 63 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ct:             
b930: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4d   /* same as TK_M
b940: 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  INUS, in1, in2, 
b950: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
b960: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 20 20 20  Multiply:       
b970: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
b980: 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e 31 2c 20  s TK_STAR, in1, 
b990: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
b9a0: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 20 20 20  e OP_Divide:    
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
b9c0: 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41 53 48 2c  ame as TK_SLASH,
b9d0: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
b9e0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6d 61 69  */.case OP_Remai
b9f0: 6e 64 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20  nder: {         
ba00: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
ba10: 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  REM, in1, in2, o
ba20: 75 74 33 20 2a 2f 0a 20 20 63 68 61 72 20 62 49  ut3 */.  char bI
ba30: 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53 74 61 72  ntint;   /* Star
ba40: 74 65 64 20 6f 75 74 20 61 73 20 74 77 6f 20 69  ted out as two i
ba50: 6e 74 65 67 65 72 20 6f 70 65 72 61 6e 64 73 20  nteger operands 
ba60: 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b 20  */.  u16 flags; 
ba70: 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
ba80: 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20 66 72 6f   MEM_* flags fro
ba90: 6d 20 62 6f 74 68 20 69 6e 70 75 74 73 20 2a 2f  m both inputs */
baa0: 0a 20 20 75 31 36 20 74 79 70 65 31 3b 20 20 20  .  u16 type1;   
bab0: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79     /* Numeric ty
bac0: 70 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61  pe of left opera
bad0: 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65  nd */.  u16 type
bae0: 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72  2;      /* Numer
baf0: 69 63 20 74 79 70 65 20 6f 66 20 72 69 67 68 74  ic type of right
bb00: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36   operand */.  i6
bb10: 34 20 69 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  4 iA;         /*
bb20: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f   Integer value o
bb30: 66 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  f left operand *
bb40: 2f 0a 20 20 69 36 34 20 69 42 3b 20 20 20 20 20  /.  i64 iB;     
bb50: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 76      /* Integer v
bb60: 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f 70  alue of right op
bb70: 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c  erand */.  doubl
bb80: 65 20 72 41 3b 20 20 20 20 20 20 2f 2a 20 52 65  e rA;      /* Re
bb90: 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  al value of left
bba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
bbb0: 75 62 6c 65 20 72 42 3b 20 20 20 20 20 20 2f 2a  uble rB;      /*
bbc0: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 72   Real value of r
bbd0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
bbe0: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
bbf0: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74 79 70 65  pOp->p1];.  type
bc00: 31 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28  1 = numericType(
bc10: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32 20 3d 20  pIn1);.  pIn2 = 
bc20: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
bc30: 20 20 74 79 70 65 32 20 3d 20 6e 75 6d 65 72 69    type2 = numeri
bc40: 63 54 79 70 65 28 70 49 6e 32 29 3b 0a 20 20 70  cType(pIn2);.  p
bc50: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
bc60: 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 20 3d 20  >p3];.  flags = 
bc70: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49  pIn1->flags | pI
bc80: 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  n2->flags;.  if(
bc90: 20 28 74 79 70 65 31 20 26 20 74 79 70 65 32 20   (type1 & type2 
bca0: 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
bcb0: 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d 3e  .    iA = pIn1->
bcc0: 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70 49  u.i;.    iB = pI
bcd0: 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49 6e  n2->u.i;.    bIn
bce0: 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73 77  tint = 1;.    sw
bcf0: 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  itch( pOp->opcod
bd00: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
bd10: 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69 66  OP_Add:       if
bd20: 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74 36  ( sqlite3AddInt6
bd30: 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f  4(&iB,iA) ) goto
bd40: 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b   fp_math;  break
bd50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
bd60: 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20 73  Subtract:  if( s
bd70: 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28 26  qlite3SubInt64(&
bd80: 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70  iB,iA) ) goto fp
bd90: 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20  _math;  break;. 
bda0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
bdb0: 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c 69  tiply:  if( sqli
bdc0: 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42 2c  te3MulInt64(&iB,
bdd0: 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61  iA) ) goto fp_ma
bde0: 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  th;  break;.    
bdf0: 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65    case OP_Divide
be00: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
be10: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
be20: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
be30: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
be40: 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69 42  if( iA==-1 && iB
be50: 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
be60: 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b   ) goto fp_math;
be70: 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20 69  .        iB /= i
be80: 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  A;.        break
be90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bea0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
beb0: 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20 67     if( iA==0 ) g
bec0: 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72  oto arithmetic_r
bed0: 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20  esult_is_null;. 
bee0: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 2d         if( iA==-
bef0: 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20 20  1 ) iA = 1;.    
bf00: 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20 20      iB %= iA;.  
bf10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
bf30: 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a 20  Out->u.i = iB;. 
bf40: 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
bf50: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
bf60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66  ;.  }else if( (f
bf70: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
bf80: 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  !=0 ){.    goto 
bf90: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
bfa0: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 7d 65 6c  t_is_null;.  }el
bfb0: 73 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20  se{.    bIntint 
bfc0: 3d 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20  = 0;.fp_math:.  
bfd0: 20 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64    rA = sqlite3Vd
bfe0: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31  beRealValue(pIn1
bff0: 29 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69  );.    rB = sqli
c000: 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65  te3VdbeRealValue
c010: 28 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74  (pIn2);.    swit
c020: 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ch( pOp->opcode 
c030: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
c040: 5f 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42  _Add:         rB
c050: 20 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72   += rA;       br
c060: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c070: 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20  OP_Subtract:    
c080: 72 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20  rB -= rA;       
c090: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c0a0: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
c0b0: 20 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20    rB *= rA;     
c0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c0d0: 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b  ase OP_Divide: {
c0e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75  .        /* (dou
c0f0: 62 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66  ble)0 In case of
c100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
c110: 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a  ATING_POINT... *
c120: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41  /.        if( rA
c130: 3d 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f  ==(double)0 ) go
c140: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c150: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c160: 20 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a        rB /= rA;.
c170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
c190: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
c1a0: 69 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20  iA = (i64)rA;.  
c1b0: 20 20 20 20 20 20 69 42 20 3d 20 28 69 36 34 29        iB = (i64)
c1c0: 72 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rB;.        if( 
c1d0: 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69  iA==0 ) goto ari
c1e0: 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69  thmetic_result_i
c1f0: 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  s_null;.        
c200: 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20  if( iA==-1 ) iA 
c210: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20  = 1;.        rB 
c220: 3d 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20  = (double)(iB % 
c230: 69 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  iA);.        bre
c240: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c250: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c260: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c270: 49 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  INT.    pOut->u.
c280: 69 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53  i = rB;.    MemS
c290: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
c2a0: 20 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65   MEM_Int);.#else
c2b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c2c0: 49 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20  IsNaN(rB) ){.   
c2d0: 20 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74     goto arithmet
c2e0: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c2f0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  l;.    }.    pOu
c300: 74 2d 3e 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20  t->u.r = rB;.   
c310: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
c320: 70 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b  pOut, MEM_Real);
c330: 0a 20 20 20 20 69 66 28 20 28 28 74 79 70 65 31  .    if( ((type1
c340: 7c 74 79 70 65 32 29 26 4d 45 4d 5f 52 65 61 6c  |type2)&MEM_Real
c350: 29 3d 3d 30 20 26 26 20 21 62 49 6e 74 69 6e 74  )==0 && !bIntint
c360: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c370: 33 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69  3VdbeIntegerAffi
c380: 6e 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20  nity(pOut);.    
c390: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62  }.#endif.  }.  b
c3a0: 72 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69  reak;..arithmeti
c3b0: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c3c0: 3a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  :.  sqlite3VdbeM
c3d0: 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
c3e0: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
c3f0: 4f 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20  Opcode: CollSeq 
c400: 50 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20  P1 * * P4.**.** 
c410: 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  P4 is a pointer 
c420: 74 6f 20 61 20 43 6f 6c 6c 53 65 71 20 6f 62 6a  to a CollSeq obj
c430: 65 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74  ect. If the next
c440: 20 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20   call to a user 
c450: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61  function.** or a
c460: 67 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73  ggregate calls s
c470: 71 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c  qlite3GetFuncCol
c480: 6c 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c  lSeq(), this col
c490: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c4a0: 77 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72  will.** be retur
c4b0: 6e 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  ned. This is use
c4c0: 64 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69  d by the built-i
c4d0: 6e 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61  n min(), max() a
c4e0: 6e 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66  nd nullif().** f
c4f0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
c500: 49 66 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72  If P1 is not zer
c510: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  o, then it is a 
c520: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 61 20  register that a 
c530: 73 75 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29  subsequent min()
c540: 20 6f 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67   or.** max() agg
c550: 72 65 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20  regate will set 
c560: 74 6f 20 31 20 69 66 20 74 68 65 20 63 75 72 72  to 1 if the curr
c570: 65 6e 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74  ent row is not t
c580: 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a  he minimum or.**
c590: 20 6d 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50   maximum.  The P
c5a0: 31 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  1 register is in
c5b0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62  itialized to 0 b
c5c0: 79 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  y this instructi
c5d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  on..**.** The in
c5e0: 74 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20  terface used by 
c5f0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c600: 6f 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d  on of the aforem
c610: 65 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f  entioned functio
c620: 6e 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76  ns.** to retriev
c630: 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  e the collation 
c640: 73 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20  sequence set by 
c650: 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e  this opcode is n
c660: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
c670: 70 75 62 6c 69 63 6c 79 2e 20 20 4f 6e 6c 79 20  publicly.  Only 
c680: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c690: 6e 73 20 68 61 76 65 20 61 63 63 65 73 73 20 74  ns have access t
c6a0: 6f 20 74 68 69 73 20 66 65 61 74 75 72 65 2e 0a  o this feature..
c6b0: 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53  */.case OP_CollS
c6c0: 65 71 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  eq: {.  assert( 
c6d0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
c6e0: 43 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 69 66 28  COLLSEQ );.  if(
c6f0: 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
c700: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
c710: 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70  tInt64(&aMem[pOp
c720: 2d 3e 70 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20  ->p1], 0);.  }. 
c730: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
c740: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
c750: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
c760: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
c770: 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]&r[P2].**.** T
c780: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
c790: 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75   AND of the valu
c7a0: 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  es in register P
c7b0: 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20  1 and P2 and.** 
c7c0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
c7d0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
c7e0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
c7f0: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
c800: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
c810: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .*/./* Opcode: B
c820: 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20  itOr P1 P2 P3 * 
c830: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
c840: 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d  [P3]=r[P1]|r[P2]
c850: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
c860: 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20 74  bit-wise OR of t
c870: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
c880: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
c890: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
c8a0: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
c8b0: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
c8c0: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
c8d0: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
c8e0: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
c8f0: 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20  code: ShiftLeft 
c900: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
c910: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
c920: 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]<<r[P1].**.
c930: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
c940: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
c950: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
c960: 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a 20   left by the.** 
c970: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73  number of bits s
c980: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
c990: 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73  integer in regis
c9a0: 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65  ter P1..** Store
c9b0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
c9c0: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
c9d0: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
c9e0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
c9f0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
ca00: 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 52  * Opcode: ShiftR
ca10: 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a 20  ight P1 P2 P3 * 
ca20: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
ca30: 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50 31  [P3]=r[P2]>>r[P1
ca40: 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68  ].**.** Shift th
ca50: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
ca60: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74  in register P2 t
ca70: 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 20 74  o the right by t
ca80: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
ca90: 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62  bits specified b
caa0: 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  y the integer in
cab0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
cac0: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
cad0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
cae0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
caf0: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
cb00: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
cb10: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  ..*/.case OP_Bit
cb20: 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  And:            
cb30: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
cb40: 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20  TK_BITAND, in1, 
cb50: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
cb60: 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20 20  e OP_BitOr:     
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb80: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f 52  same as TK_BITOR
cb90: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
cba0: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
cbb0: 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20 20  tLeft:          
cbc0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
cbd0: 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_LSHIFT, in1, i
cbe0: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
cbf0: 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20   OP_ShiftRight: 
cc00: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
cc10: 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46 54  ame as TK_RSHIFT
cc20: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
cc30: 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a 20 20   */.  i64 iA;.  
cc40: 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20 69 42  u64 uA;.  i64 iB
cc50: 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49  ;.  u8 op;..  pI
cc60: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
cc70: 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
cc80: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
cc90: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
cca0: 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49  ->p3];.  if( (pI
ccb0: 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32  n1->flags | pIn2
ccc0: 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e  ->flags) & MEM_N
ccd0: 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ull ){.    sqlit
cce0: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
ccf0: 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61  (pOut);.    brea
cd00: 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20 73 71  k;.  }.  iA = sq
cd10: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
cd20: 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20  e(pIn2);.  iB = 
cd30: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
cd40: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20  lue(pIn1);.  op 
cd50: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
cd60: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41   if( op==OP_BitA
cd70: 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26 3d 20  nd ){.    iA &= 
cd80: 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  iB;.  }else if( 
cd90: 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a  op==OP_BitOr ){.
cda0: 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20      iA |= iB;.  
cdb0: 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d 30 20  }else if( iB!=0 
cdc0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
cdd0: 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  p==OP_ShiftRight
cde0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74   || op==OP_Shift
cdf0: 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Left );..    /* 
ce00: 49 66 20 73 68 69 66 74 69 6e 67 20 62 79 20 61  If shifting by a
ce10: 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75 6e 74   negative amount
ce20: 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65 20 6f  , shift in the o
ce30: 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 20 2a  ther direction *
ce40: 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30 20 29  /.    if( iB<0 )
ce50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ce60: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d 3d 4f  OP_ShiftRight==O
ce70: 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20 29 3b  P_ShiftLeft+1 );
ce80: 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50  .      op = 2*OP
ce90: 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31 20 2d  _ShiftLeft + 1 -
cea0: 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20 3d 20   op;.      iB = 
ceb0: 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a  iB>(-64) ? -iB :
cec0: 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   64;.    }..    
ced0: 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20  if( iB>=64 ){.  
cee0: 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d 30 20      iA = (iA>=0 
cef0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  || op==OP_ShiftL
cf00: 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20  eft) ? 0 : -1;. 
cf10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf20: 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69 41 2c  memcpy(&uA, &iA,
cf30: 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20   sizeof(uA));.  
cf40: 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53      if( op==OP_S
cf50: 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20 20 20  hiftLeft ){.    
cf60: 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20      uA <<= iB;. 
cf70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cf80: 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20      uA >>= iB;. 
cf90: 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65         /* Sign-e
cfa0: 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67 68 74  xtend on a right
cfb0: 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65 67 61   shift of a nega
cfc0: 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  tive number */. 
cfd0: 20 20 20 20 20 20 20 69 66 28 20 69 41 3c 30 20         if( iA<0 
cfe0: 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36 34 29  ) uA |= ((((u64)
cff0: 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33 32 29  0xffffffff)<<32)
d000: 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c 3c 20  |0xffffffff) << 
d010: 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d  (64-iB);.      }
d020: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 69  .      memcpy(&i
d030: 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66 28 69  A, &uA, sizeof(i
d040: 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  A));.    }.  }. 
d050: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b   pOut->u.i = iA;
d060: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
d070: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
d080: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
d090: 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20   Opcode: AddImm 
d0a0: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
d0b0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d  Synopsis: r[P1]=
d0c0: 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a 20  r[P1]+P2.** .** 
d0d0: 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  Add the constant
d0e0: 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75 65   P2 to the value
d0f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
d100: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
d110: 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65  s always an inte
d120: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f  ger..**.** To fo
d130: 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65 72  rce any register
d140: 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
d150: 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a  r, just add 0..*
d160: 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d  /.case OP_AddImm
d170: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
d180: 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  * in1 */.  pIn1 
d190: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
d1a0: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
d1b0: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
d1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
d1d0: 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b  ntegerify(pIn1);
d1e0: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20  .  pIn1->u.i += 
d1f0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b  pOp->p2;.  break
d200: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
d210: 4d 75 73 74 42 65 49 6e 74 20 50 31 20 50 32 20  MustBeInt P1 P2 
d220: 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72  * * *.** .** For
d230: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
d240: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
d250: 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  e an integer.  I
d260: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
d270: 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 6e 20 69  n P1 is not an i
d280: 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f  nteger and canno
d290: 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
d2a0: 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  nto an integer.*
d2b0: 2a 20 77 69 74 68 6f 75 74 20 64 61 74 61 20 6c  * without data l
d2c0: 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  oss, then jump i
d2d0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
d2e0: 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a  , or if P2==0.**
d2f0: 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45   raise an SQLITE
d300: 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 65 70 74  _MISMATCH except
d310: 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
d320: 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 20 20 20  MustBeInt: {    
d330: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
d340: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
d350: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
d360: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
d370: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
d380: 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66  0 ){.    applyAf
d390: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
d3a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
d3b0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
d3c0: 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
d3d0: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pIn1->flags&MEM
d3e0: 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b 0a 20 20  _Int)==0, 2);.  
d3f0: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
d400: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
d410: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
d420: 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p2==0 ){.    
d430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d440: 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  MISMATCH;.      
d450: 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
d460: 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
d470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d480: 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
d490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d4a0: 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46   }.  MemSetTypeF
d4b0: 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e  lag(pIn1, MEM_In
d4c0: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
d4d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d4e0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
d4f0: 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  NT./* Opcode: Re
d500: 61 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a 20  alAffinity P1 * 
d510: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72  * * *.**.** If r
d520: 65 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64 73  egister P1 holds
d530: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 76   an integer conv
d540: 65 72 74 20 69 74 20 74 6f 20 61 20 72 65 61 6c  ert it to a real
d550: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
d560: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
d570: 64 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  d when extractin
d580: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
d590: 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  om a column that
d5a0: 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66 66  .** has REAL aff
d5b0: 69 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f 6c  inity.  Such col
d5c0: 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20 73  umn values may s
d5d0: 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  till be stored a
d5e0: 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20 66  s.** integers, f
d5f0: 6f 72 20 73 70 61 63 65 20 65 66 66 69 63 69 65  or space efficie
d600: 6e 63 79 2c 20 62 75 74 20 61 66 74 65 72 20 65  ncy, but after e
d610: 78 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61 6e  xtraction we wan
d620: 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76  t them.** to hav
d630: 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76 61  e only a real va
d640: 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lue..*/.case OP_
d650: 52 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20  RealAffinity: { 
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e   /* in1 */.  pIn
d680: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
d690: 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  1];.  if( pIn1->
d6a0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
d6b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d6c0: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e  beMemRealify(pIn
d6d0: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
d6e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
d6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
d700: 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  AST./* Opcode: C
d710: 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ast P1 P2 * * *.
d720: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66  ** Synopsis: aff
d730: 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a  inity(r[P1]).**.
d740: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
d750: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
d760: 31 20 74 6f 20 62 65 20 74 68 65 20 74 79 70 65  1 to be the type
d770: 20 64 65 66 69 6e 65 64 20 62 79 20 50 32 2e 0a   defined by P2..
d780: 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  ** .** <ul>.** <
d790: 6c 69 3e 20 50 32 3d 3d 27 41 27 20 26 72 61 72  li> P2=='A' &rar
d7a0: 72 3b 20 42 4c 4f 42 0a 2a 2a 20 3c 6c 69 3e 20  r; BLOB.** <li> 
d7b0: 50 32 3d 3d 27 42 27 20 26 72 61 72 72 3b 20 54  P2=='B' &rarr; T
d7c0: 45 58 54 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d  EXT.** <li> P2==
d7d0: 27 43 27 20 26 72 61 72 72 3b 20 4e 55 4d 45 52  'C' &rarr; NUMER
d7e0: 49 43 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27  IC.** <li> P2=='
d7f0: 44 27 20 26 72 61 72 72 3b 20 49 4e 54 45 47 45  D' &rarr; INTEGE
d800: 52 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 45  R.** <li> P2=='E
d810: 27 20 26 72 61 72 72 3b 20 52 45 41 4c 0a 2a 2a  ' &rarr; REAL.**
d820: 20 3c 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e   </ul>.**.** A N
d830: 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74  ULL value is not
d840: 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73   changed by this
d850: 20 72 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65   routine.  It re
d860: 6d 61 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63  mains NULL..*/.c
d870: 61 73 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20  ase OP_Cast: {  
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65  /* in1 */.  asse
d8a0: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c  rt( pOp->p2>=SQL
d8b0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20  ITE_AFF_BLOB && 
d8c0: 70 4f 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f  pOp->p2<=SQLITE_
d8d0: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65  AFF_REAL );.  te
d8e0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d  stcase( pOp->p2=
d8f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
d900: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d910: 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f  pOp->p2==SQLITE_
d920: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65  AFF_BLOB );.  te
d930: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d  stcase( pOp->p2=
d940: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
d950: 52 49 43 20 29 3b 0a 20 20 74 65 73 74 63 61 73  RIC );.  testcas
d960: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
d970: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
d980: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
d990: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
d9a0: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31  F_REAL );.  pIn1
d9b0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
d9c0: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
d9d0: 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a  hange(p, pIn1);.
d9e0: 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f    rc = ExpandBlo
d9f0: 62 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74  b(pIn1);.  sqlit
da00: 65 33 56 64 62 65 4d 65 6d 43 61 73 74 28 70 49  e3VdbeMemCast(pI
da10: 6e 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63  n1, pOp->p2, enc
da20: 6f 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45  oding);.  UPDATE
da30: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49  _MAX_BLOBSIZE(pI
da40: 6e 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  n1);.  if( rc ) 
da50: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
da60: 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
da70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
da80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a  LITE_OMIT_CAST *
da90: 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71  /../* Opcode: Eq
daa0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
dab0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
dac0: 72 5b 50 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a  r[P3]==r[P1].**.
dad0: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
dae0: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
daf0: 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66  r P1 and P3.  If
db00: 20 72 65 67 28 50 33 29 3d 3d 72 65 67 28 50 31   reg(P3)==reg(P1
db10: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74  ) then.** jump t
db20: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f  o address P2.  O
db30: 72 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  r if the SQLITE_
db40: 53 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20  STOREP2 flag is 
db50: 73 65 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a  set in P5, then.
db60: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
db70: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
db80: 6e 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  n in register P2
db90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
dba0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74  TE_AFF_MASK port
dbb0: 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62  ion of P5 must b
dbc0: 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  e an affinity ch
dbd0: 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c  aracter -.** SQL
dbe0: 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51  ITE_AFF_TEXT, SQ
dbf0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
dc00: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  , and so forth. 
dc10: 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
dc20: 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65  de .** to coerce
dc30: 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63   both inputs acc
dc40: 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61  ording to this a
dc50: 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74  ffinity before t
dc60: 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  he.** comparison
dc70: 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65   is made. If the
dc80: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
dc90: 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e   is 0x00, then n
dca0: 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69  umeric.** affini
dcb0: 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65  ty is used. Note
dcc0: 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e 69   that the affini
dcd0: 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61  ty conversions a
dce0: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63  re stored.** bac
dcf0: 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74  k into the input
dd00: 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
dd10: 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f  d P3.  So this o
dd20: 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a  pcode can cause.
dd30: 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63 68  ** persistent ch
dd40: 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74 65  anges to registe
dd50: 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a  rs P1 and P3..**
dd60: 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e  .** Once any con
dd70: 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61  versions have ta
dd80: 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e  ken place, and n
dd90: 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73 20  either value is 
dda0: 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61  NULL, .** the va
ddb0: 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65  lues are compare
ddc0: 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  d. If both value
ddd0: 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e  s are blobs then
dde0: 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20   memcmp() is.** 
ddf0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
de00: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
de10: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
de20: 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73    If both values
de30: 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68  .** are text, th
de40: 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  en the appropria
de50: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  te collating fun
de60: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
de70: 69 6e 0a 2a 2a 20 50 34 20 69 73 20 75 73 65 64  in.** P4 is used
de80: 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61   to do the compa
de90: 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73  rison.  If P4 is
dea0: 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 74   not specified t
deb0: 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20  hen.** memcmp() 
dec0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
ded0: 72 65 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20  re text string. 
dee0: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
def0: 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20  are.** numeric, 
df00: 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63  then a numeric c
df10: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65  omparison is use
df20: 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20 76 61  d. If the two va
df30: 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64  lues.** are of d
df40: 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20  ifferent types, 
df50: 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65  then numbers are
df60: 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73   considered less
df70: 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73   than.** strings
df80: 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65   and strings are
df90: 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73   considered less
dfa0: 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a   than blobs..**.
dfb0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c  ** If SQLITE_NUL
dfc0: 4c 45 51 20 69 73 20 73 65 74 20 69 6e 20 50 35  LEQ is set in P5
dfd0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
dfe0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
dff0: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a  s always either.
e000: 2a 2a 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65  ** true or false
e010: 20 61 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55   and is never NU
e020: 4c 4c 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65  LL.  If both ope
e030: 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74  rands are NULL t
e040: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
e050: 2a 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  * of comparison 
e060: 69 73 20 74 72 75 65 2e 20 20 49 66 20 65 69 74  is true.  If eit
e070: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
e080: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ULL then the res
e090: 75 6c 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ult is false..**
e0a0: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72   If neither oper
e0b0: 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20  and is NULL the 
e0c0: 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 61  result is the sa
e0d0: 6d 65 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62  me as it would b
e0e0: 65 20 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49  e if.** the SQLI
e0f0: 54 45 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77  TE_NULLEQ flag w
e100: 65 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  ere omitted from
e110: 20 50 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f   P5..**.** If bo
e120: 74 68 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  th SQLITE_STOREP
e130: 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45  2 and SQLITE_KEE
e140: 50 4e 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20  PNULL flags are 
e150: 73 65 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  set then the.** 
e160: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d  content of r[P2]
e170: 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64   is only changed
e180: 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75   if the new valu
e190: 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28  e is NULL or 0 (
e1a0: 66 61 6c 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74  false)..** In ot
e1b0: 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69  her words, a pri
e1c0: 6f 72 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77  or r[P2] value w
e1d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77  ill not be overw
e1e0: 72 69 74 74 65 6e 20 62 79 20 31 20 28 74 72 75  ritten by 1 (tru
e1f0: 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  e)..*/./* Opcode
e200: 3a 20 4e 65 20 50 31 20 50 32 20 50 33 20 50 34  : Ne P1 P2 P3 P4
e210: 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
e220: 20 49 46 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d   IF r[P3]!=r[P1]
e230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
e240: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
e250: 45 71 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Eq opcode except
e260: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
e270: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
e280: 65 20 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65  e operands in re
e290: 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
e2a0: 33 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e  3 are not equal.
e2b0: 20 20 53 65 65 20 74 68 65 20 45 71 20 6f 70 63    See the Eq opc
e2c0: 6f 64 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74  ode for.** addit
e2d0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
e2e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68  n..**.** If both
e2f0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
e300: 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e  and SQLITE_KEEPN
e310: 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65  ULL flags are se
e320: 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  t then the.** co
e330: 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69  ntent of r[P2] i
e340: 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
e350: 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  f the new value 
e360: 69 73 20 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72  is NULL or 1 (tr
e370: 75 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ue)..** In other
e380: 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20   words, a prior 
e390: 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c  r[P2] value will
e3a0: 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74   not be overwrit
e3b0: 74 65 6e 20 62 79 20 30 20 28 66 61 6c 73 65 29  ten by 0 (false)
e3c0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
e3d0: 4c 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Lt P1 P2 P3 P4 P
e3e0: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
e3f0: 46 20 72 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a  F r[P3]<r[P1].**
e400: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
e410: 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74  values in regist
e420: 65 72 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49  er P1 and P3.  I
e430: 66 20 72 65 67 28 50 33 29 3c 72 65 67 28 50 31  f reg(P3)<reg(P1
e440: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74  ) then.** jump t
e450: 6f 20 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f  o address P2.  O
e460: 72 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  r if the SQLITE_
e470: 53 54 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20  STOREP2 flag is 
e480: 73 65 74 20 69 6e 20 50 35 20 73 74 6f 72 65 0a  set in P5 store.
e490: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
e4a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f   comparison (0 o
e4b0: 72 20 31 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74  r 1 or NULL) int
e4c0: 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
e4d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
e4e0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69  TE_JUMPIFNULL bi
e4f0: 74 20 6f 66 20 50 35 20 69 73 20 73 65 74 20 61  t of P5 is set a
e500: 6e 64 20 65 69 74 68 65 72 20 72 65 67 28 50 31  nd either reg(P1
e510: 29 20 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20  ) or.** reg(P3) 
e520: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  is NULL then the
e530: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20   take the jump. 
e540: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a   If the SQLITE_J
e550: 55 4d 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69  UMPIFNULL .** bi
e560: 74 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  t is clear then 
e570: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
e580: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e590: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
e5a0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
e5b0: 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20  K portion of P5 
e5c0: 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e  must be an affin
e5d0: 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a  ity character -.
e5e0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ** SQLITE_AFF_TE
e5f0: 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  XT, SQLITE_AFF_I
e600: 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66  NTEGER, and so f
e610: 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74  orth. An attempt
e620: 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20   is made .** to 
e630: 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75  coerce both inpu
e640: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
e650: 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65  this affinity be
e660: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  fore the.** comp
e670: 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20  arison is made. 
e680: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  If the SQLITE_AF
e690: 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20  F_MASK is 0x00, 
e6a0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20  then numeric.** 
e6b0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
e6c0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  . Note that the 
e6d0: 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73  affinity convers
e6e0: 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ions are stored.
e6f0: 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ** back into the
e700: 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
e710: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20   P1 and P3.  So 
e720: 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20  this opcode can 
e730: 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74  cause.** persist
e740: 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72  ent changes to r
e750: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
e760: 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  P3..**.** Once a
e770: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68  ny conversions h
e780: 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c  ave taken place,
e790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c   and neither val
e7a0: 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20  ue is NULL, .** 
e7b0: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63  the values are c
e7c0: 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68  ompared. If both
e7d0: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62   values are blob
e7e0: 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20  s then memcmp() 
e7f0: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  is.** used to de
e800: 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75  termine the resu
e810: 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  lts of the compa
e820: 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20  rison.  If both 
e830: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65  values.** are te
e840: 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70  xt, then the app
e850: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
e860: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  ng function spec
e870: 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69  ified in.** P4 i
e880: 73 20 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  s  used to do th
e890: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49  e comparison.  I
e8a0: 66 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63  f P4 is not spec
e8b0: 69 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65  ified then.** me
e8c0: 6d 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74  mcmp() is used t
e8d0: 6f 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73  o compare text s
e8e0: 74 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20  tring.  If both 
e8f0: 76 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75  values are.** nu
e900: 6d 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75  meric, then a nu
e910: 6d 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e  meric comparison
e920: 20 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65   is used. If the
e930: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
e940: 72 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  re of different 
e950: 74 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62  types, then numb
e960: 65 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ers are consider
e970: 65 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  ed less than.** 
e980: 73 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69  strings and stri
e990: 6e 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ngs are consider
e9a0: 65 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f  ed less than blo
e9b0: 62 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  bs..*/./* Opcode
e9c0: 3a 20 4c 65 20 50 31 20 50 32 20 50 33 20 50 34  : Le P1 P2 P3 P4
e9d0: 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
e9e0: 20 49 46 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d   IF r[P3]<=r[P1]
e9f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
ea00: 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20  s just like the 
ea10: 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74  Lt opcode except
ea20: 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69   that the jump i
ea30: 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68  s taken if.** th
ea40: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
ea50: 69 73 74 65 72 20 50 33 20 69 73 20 6c 65 73 73  ister P3 is less
ea60: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
ea70: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
ea80: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
ea90: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
eaa0: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
eab0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
eac0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74  */./* Opcode: Gt
ead0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
eae0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
eaf0: 72 5b 50 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P3]>r[P1].**.*
eb00: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
eb10: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
eb20: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
eb30: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
eb40: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
eb50: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
eb60: 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74   P3 is greater t
eb70: 68 61 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  han the content 
eb80: 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  of.** register P
eb90: 31 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f  1.  See the Lt o
eba0: 70 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69  pcode for additi
ebb0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
ebc0: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
ebd0: 47 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Ge P1 P2 P3 P4 P
ebe0: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
ebf0: 46 20 72 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a  F r[P3]>=r[P1].*
ec00: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
ec10: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
ec20: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
ec30: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
ec40: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
ec50: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
ec60: 74 65 72 20 50 33 20 69 73 20 67 72 65 61 74 65  ter P3 is greate
ec70: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
ec80: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
ec90: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  f.** register P1
eca0: 2e 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70  .  See the Lt op
ecb0: 63 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f  code for additio
ecc0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
ecd0: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20  .*/.case OP_Eq: 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ecf0: 20 73 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20   same as TK_EQ, 
ed00: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
ed10: 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20  /.case OP_Ne:   
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
ed30: 61 6d 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75  ame as TK_NE, ju
ed40: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
ed50: 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20  case OP_Lt:     
ed60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
ed70: 65 20 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70  e as TK_LT, jump
ed80: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
ed90: 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20  se OP_Le:       
eda0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
edb0: 61 73 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20  as TK_LE, jump, 
edc0: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
edd0: 20 4f 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20   OP_Gt:         
ede0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
edf0: 20 54 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e   TK_GT, jump, in
ee00: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
ee10: 50 5f 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20  P_Ge: {         
ee20: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ee30: 4b 5f 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_GE, jump, in1,
ee40: 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65   in3 */.  int re
ee50: 73 2c 20 72 65 73 32 3b 20 20 20 20 20 20 2f 2a  s, res2;      /*
ee60: 20 52 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   Result of the c
ee70: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e  omparison of pIn
ee80: 31 20 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a  1 against pIn3 *
ee90: 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74  /.  char affinit
eea0: 79 3b 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e  y;      /* Affin
eeb0: 69 74 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63  ity to use for c
eec0: 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75  omparison */.  u
eed0: 31 36 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20  16 flags1;      
eee0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e     /* Copy of in
eef0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
ef00: 49 6e 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20  In1->flags */.  
ef10: 75 31 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20  u16 flags3;     
ef20: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69      /* Copy of i
ef30: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
ef40: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a  pIn3->flags */..
ef50: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
ef60: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20  Op->p1];.  pIn3 
ef70: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
ef80: 3b 0a 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e  ;.  flags1 = pIn
ef90: 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67  1->flags;.  flag
efa0: 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73  s3 = pIn3->flags
efb0: 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 31 20  ;.  if( (flags1 
efc0: 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75  | flags3)&MEM_Nu
efd0: 6c 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65  ll ){.    /* One
efe0: 20 6f 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64   or both operand
eff0: 73 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  s are NULL */.  
f000: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
f010: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b  SQLITE_NULLEQ ){
f020: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c  .      /* If SQL
f030: 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65  ITE_NULLEQ is se
f040: 74 20 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e  t (which will on
f050: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
f060: 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20   operator is.   
f070: 20 20 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f     ** OP_Eq or O
f080: 50 5f 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20  P_Ne) then take 
f090: 74 68 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20  the jump or not 
f0a0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
f0b0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ther.      ** or
f0c0: 20 6e 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e   not both operan
f0d0: 64 73 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20  ds are null..   
f0e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
f0f0: 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
f100: 3d 4f 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f  =OP_Eq || pOp->o
f110: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  pcode==OP_Ne );.
f120: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 66        assert( (f
f130: 6c 61 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61  lags1 & MEM_Clea
f140: 72 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  red)==0 );.     
f150: 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70   assert( (pOp->p
f160: 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  5 & SQLITE_JUMPI
f170: 46 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20  FNULL)==0 );.   
f180: 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 26 66     if( (flags1&f
f190: 6c 61 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21  lags3&MEM_Null)!
f1a0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c  =0.       && (fl
f1b0: 61 67 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64  ags3&MEM_Cleared
f1c0: 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
f1d0: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20        res = 0;  
f1e0: 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
f1f0: 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d  equal */.      }
f200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
f210: 73 20 3d 20 31 3b 20 20 2f 2a 20 4f 70 65 72 61  s = 1;  /* Opera
f220: 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  nds are not equa
f230: 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  l */.      }.   
f240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
f250: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
f260: 73 20 63 6c 65 61 72 20 61 6e 64 20 61 74 20 6c  s clear and at l
f270: 65 61 73 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64  east one operand
f280: 20 69 73 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20   is NULL,.      
f290: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
f2a0: 6c 74 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c  lt is always NUL
f2b0: 4c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  L..      ** The 
f2c0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
f2d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50   the SQLITE_JUMP
f2e0: 49 46 4e 55 4c 4c 20 62 69 74 20 69 73 20 73 65  IFNULL bit is se
f2f0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
f300: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
f310: 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29  SQLITE_STOREP2 )
f320: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d  {.        pOut =
f330: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
f340: 0a 20 20 20 20 20 20 20 20 69 43 6f 6d 70 61 72  .        iCompar
f350: 65 20 3d 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65  e = 1;    /* Ope
f360: 72 61 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71  rands are not eq
f370: 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ual */.        m
f380: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
f390: 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20  p, pOut);.      
f3a0: 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
f3b0: 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  (pOut, MEM_Null)
f3c0: 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53 54  ;.        REGIST
f3d0: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
f3e0: 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  , pOut);.      }
f3f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
f400: 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c  beBranchTaken(2,
f410: 33 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  3);.        if( 
f420: 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
f430: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20  _JUMPIFNULL ){. 
f440: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75           goto ju
f450: 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20  mp_to_p2;.      
f460: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e   }else{.    /* N
f490: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
f4a0: 73 20 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f  s NULL.  Do a co
f4b0: 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20  mparison. */.   
f4c0: 20 61 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d   affinity = pOp-
f4d0: 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46  >p5 & SQLITE_AFF
f4e0: 5f 4d 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61  _MASK;.    if( a
f4f0: 66 66 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f  ffinity>=SQLITE_
f500: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
f510: 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31       if( (flags1
f520: 20 7c 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53   | flags3)&MEM_S
f530: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  tr ){.        if
f540: 28 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d  ( (flags1 & (MEM
f550: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45  _Int|MEM_Real|ME
f560: 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72  M_Str))==MEM_Str
f570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
f580: 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
f590: 74 79 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20  ty(pIn1,0);.    
f5a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f5b0: 66 6c 61 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c  flags3!=pIn3->fl
f5c0: 61 67 73 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62  ags ); /* Possib
f5d0: 6c 65 20 69 66 20 70 49 6e 31 3d 3d 70 49 6e 33  le if pIn1==pIn3
f5e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6c   */.          fl
f5f0: 61 67 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61  ags3 = pIn3->fla
f600: 67 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  gs;.        }.  
f610: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
f620: 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  3 & (MEM_Int|MEM
f630: 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d  _Real|MEM_Str))=
f640: 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  =MEM_Str ){.    
f650: 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72        applyNumer
f660: 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c  icAffinity(pIn3,
f670: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
f680: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 48      }.      /* H
f690: 61 6e 64 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e  andle the common
f6a0: 20 63 61 73 65 20 6f 66 20 69 6e 74 65 67 65 72   case of integer
f6b0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 68 65 72 65   comparison here
f6c0: 2c 20 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a  , as an.      **
f6d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
f6e0: 6f 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  o avoid a call t
f6f0: 6f 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  o sqlite3MemComp
f700: 61 72 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 69  are() */.      i
f710: 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
f720: 26 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  & pIn3->flags & 
f730: 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
f740: 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d         if( pIn3-
f750: 3e 75 2e 69 20 3e 20 70 49 6e 31 2d 3e 75 2e 69  >u.i > pIn1->u.i
f760: 20 29 7b 20 72 65 73 20 3d 20 2b 31 3b 20 67 6f   ){ res = +1; go
f770: 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d  to compare_op; }
f780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
f790: 33 2d 3e 75 2e 69 20 3c 20 70 49 6e 31 2d 3e 75  3->u.i < pIn1->u
f7a0: 2e 69 20 29 7b 20 72 65 73 20 3d 20 2d 31 3b 20  .i ){ res = -1; 
f7b0: 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b  goto compare_op;
f7c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d   }.        res =
f7d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
f7e0: 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 0a 20 20 20   compare_op;.   
f7f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
f800: 66 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  f( affinity==SQL
f810: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a  ITE_AFF_TEXT ){.
f820: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
f830: 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
f840: 26 26 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45  && (flags1 & (ME
f850: 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29  M_Int|MEM_Real))
f860: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
f870: 65 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66  estcase( pIn1->f
f880: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
f890: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f8a0: 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  se( pIn1->flags 
f8b0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
f8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f8d0: 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49  eMemStringify(pI
f8e0: 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29  n1, encoding, 1)
f8f0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f900: 73 65 28 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f  se( (flags1&MEM_
f910: 44 79 6e 29 20 21 3d 20 28 70 49 6e 31 2d 3e 66  Dyn) != (pIn1->f
f920: 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b  lags&MEM_Dyn) );
f930: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 31 20  .        flags1 
f940: 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  = (pIn1->flags &
f950: 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20   ~MEM_TypeMask) 
f960: 7c 20 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f  | (flags1 & MEM_
f970: 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20  TypeMask);.     
f980: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 21     assert( pIn1!
f990: 3d 70 49 6e 33 20 29 3b 0a 20 20 20 20 20 20 7d  =pIn3 );.      }
f9a0: 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67  .      if( (flag
f9b0: 73 33 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  s3 & MEM_Str)==0
f9c0: 20 26 26 20 28 66 6c 61 67 73 33 20 26 20 28 4d   && (flags3 & (M
f9d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
f9e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f9f0: 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e  testcase( pIn3->
fa00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
fa10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
fa20: 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ase( pIn3->flags
fa30: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
fa40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
fa50: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
fa60: 49 6e 33 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31  In3, encoding, 1
fa70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
fa80: 61 73 65 28 20 28 66 6c 61 67 73 33 26 4d 45 4d  ase( (flags3&MEM
fa90: 5f 44 79 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e  _Dyn) != (pIn3->
faa0: 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29  flags&MEM_Dyn) )
fab0: 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 33  ;.        flags3
fac0: 20 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20   = (pIn3->flags 
fad0: 26 20 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29  & ~MEM_TypeMask)
fae0: 20 7c 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d   | (flags3 & MEM
faf0: 5f 54 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20  _TypeMask);.    
fb00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
fb10: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
fb20: 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c  e==P4_COLLSEQ ||
fb30: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d   pOp->p4.pColl==
fb40: 30 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 73  0 );.    res = s
fb50: 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
fb60: 28 70 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70  (pIn3, pIn1, pOp
fb70: 2d 3e 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d  ->p4.pColl);.  }
fb80: 0a 63 6f 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 73  .compare_op:.  s
fb90: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
fba0: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f  de ){.    case O
fbb0: 50 5f 45 71 3a 20 20 20 20 72 65 73 32 20 3d 20  P_Eq:    res2 = 
fbc0: 72 65 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61  res==0;     brea
fbd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  k;.    case OP_N
fbe0: 65 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73  e:    res2 = res
fbf0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
fc00: 20 20 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20      case OP_Lt: 
fc10: 20 20 20 72 65 73 32 20 3d 20 72 65 73 3c 30 3b     res2 = res<0;
fc20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fc30: 20 63 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20   case OP_Le:    
fc40: 72 65 73 32 20 3d 20 72 65 73 3c 3d 30 3b 20 20  res2 = res<=0;  
fc50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fc60: 73 65 20 4f 50 5f 47 74 3a 20 20 20 20 72 65 73  se OP_Gt:    res
fc70: 32 20 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20  2 = res>0;      
fc80: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
fc90: 6c 74 3a 20 20 20 20 20 20 20 72 65 73 32 20 3d  lt:       res2 =
fca0: 20 72 65 73 3e 3d 30 3b 20 20 20 20 20 62 72 65   res>=0;     bre
fcb0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e  ak;.  }..  /* Un
fcc0: 64 6f 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  do any changes m
fcd0: 61 64 65 20 62 79 20 61 70 70 6c 79 41 66 66 69  ade by applyAffi
fce0: 6e 69 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e  nity() to the in
fcf0: 70 75 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a  put registers. *
fd00: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 6e  /.  assert( (pIn
fd10: 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  1->flags & MEM_D
fd20: 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26  yn) == (flags1 &
fd30: 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70   MEM_Dyn) );.  p
fd40: 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  In1->flags = fla
fd50: 67 73 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28  gs1;.  assert( (
fd60: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
fd70: 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73  M_Dyn) == (flags
fd80: 33 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a  3 & MEM_Dyn) );.
fd90: 20 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20    pIn3->flags = 
fda0: 66 6c 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70  flags3;..  if( p
fdb0: 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f  Op->p5 & SQLITE_
fdc0: 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70  STOREP2 ){.    p
fdd0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
fde0: 3e 70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61  >p2];.    iCompa
fdf0: 72 65 20 3d 20 72 65 73 3b 0a 20 20 20 20 72 65  re = res;.    re
fe00: 73 32 20 3d 20 72 65 73 32 21 3d 30 3b 20 20 2f  s2 = res2!=0;  /
fe10: 2a 20 46 6f 72 20 74 68 69 73 20 70 61 74 68 20  * For this path 
fe20: 72 65 73 32 20 6d 75 73 74 20 62 65 20 65 78 61  res2 must be exa
fe30: 63 74 6c 79 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ctly 0 or 1 */. 
fe40: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20     if( (pOp->p5 
fe50: 26 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  & SQLITE_KEEPNUL
fe60: 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  L)!=0 ){.      /
fe70: 2a 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66  * The KEEPNULL f
fe80: 6c 61 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f  lag prevents OP_
fe90: 45 71 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74  Eq from overwrit
fea0: 69 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20  ing a NULL with 
feb0: 31 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70  1.      ** and p
fec0: 72 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72  revents OP_Ne fr
fed0: 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e  om overwriting N
fee0: 55 4c 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69  ULL with 0.  Thi
fef0: 73 20 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  s flag.      ** 
ff00: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20  is only used in 
ff10: 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 65  contexts where e
ff20: 69 74 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20  ither:.      ** 
ff30: 20 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20    (1) op==OP_Eq 
ff40: 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20  && (r[P2]==NULL 
ff50: 7c 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20  || r[P2]==0).   
ff60: 20 20 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d     **   (2) op==
ff70: 4f 50 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d  OP_Ne && (r[P2]=
ff80: 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d  =NULL || r[P2]==
ff90: 31 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  1).      ** Ther
ffa0: 65 66 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20  efore it is not 
ffb0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 68 65  necessary to che
ffc0: 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ck the content o
ffd0: 66 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20  f r[P2] for.    
ffe0: 20 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20    ** NULL. */.  
fff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
10000 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c  >opcode==OP_Ne |
10010 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
10020 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
10030 73 65 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c  sert( res2==0 ||
10040 20 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20   res2==1 );.    
10050 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
10060 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 && pOp->opco
10070 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  de==OP_Eq );.   
10080 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
10090 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==1 && pOp->opc
100a0 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  ode==OP_Eq );.  
100b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
100c0 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==0 && pOp->op
100d0 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  code==OP_Ne );. 
100e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
100f0 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f  es2==1 && pOp->o
10100 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  pcode==OP_Ne );.
10110 20 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e        if( (pOp->
10120 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d  opcode==OP_Eq)==
10130 72 65 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  res2 ) break;.  
10140 20 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74    }.    memAbout
10150 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
10160 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  );.    MemSetTyp
10170 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
10180 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Int);.    pOut->
10190 75 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20  u.i = res2;.    
101a0 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
101b0 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
101c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
101d0 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
101e0 3d 30 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  =0, (pOp->p5 & S
101f0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a  QLITE_NULLEQ)?2:
10200 33 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32  3);.    if( res2
10210 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a   ){.      goto j
10220 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d  ump_to_p2;.    }
10230 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
10240 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65  ./* Opcode: Else
10250 4e 6f 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a  NotEq * P2 * * *
10260 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
10270 64 65 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74  de must immediat
10280 65 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50  ely follow an OP
10290 5f 4c 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d  _Lt or OP_Gt com
102a0 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
102b0 2e 0a 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f  ..** If result o
102c0 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61  f an OP_Eq compa
102d0 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d  rison on the sam
102e0 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a  e two operands.*
102f0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20  * would have be 
10300 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30  NULL or false (0
10310 29 2c 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d  ), then then jum
10320 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20  p to P2. .** If 
10330 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  the result of an
10340 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f   OP_Eq compariso
10350 6e 20 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65  n on the two pre
10360 76 69 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a  vious operands.*
10370 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
10380 6e 20 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e  n true (1), then
10390 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
103a0 2f 0a 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f  /.case OP_ElseNo
103b0 74 45 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  tEq: {       /* 
103c0 73 61 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50  same as TK_ESCAP
103d0 45 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  E, jump */.  ass
103e0 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a  ert( pOp>aOp );.
103f0 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
10400 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20  ].opcode==OP_Lt 
10410 7c 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  || pOp[-1].opcod
10420 65 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  e==OP_Gt );.  as
10430 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35  sert( pOp[-1].p5
10440 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
10450 32 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  2 );.  VdbeBranc
10460 68 54 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21  hTaken(iCompare!
10470 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43  =0, 2);.  if( iC
10480 6f 6d 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f  ompare!=0 ) goto
10490 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
104a0 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
104b0 6f 64 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e  ode: Permutation
104c0 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
104d0 2a 20 53 65 74 20 74 68 65 20 70 65 72 6d 75 74  * Set the permut
104e0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  ation used by th
104f0 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65  e OP_Compare ope
10500 72 61 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78  rator in the nex
10510 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
10520 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  .  The permutati
10530 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
10540 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a  the P4 operand..
10550 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
10560 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
10570 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
10580 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68  xt OP_Compare th
10590 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50  at has.** the OP
105a0 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
105b0 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69   set in P5. Typi
105c0 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72  cally the OP_Per
105d0 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mutation should 
105e0 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69  .** occur immedi
105f0 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
10600 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
10610 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69  *.** The first i
10620 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 50 34  nteger in the P4
10630 20 69 6e 74 65 67 65 72 20 61 72 72 61 79 20 69   integer array i
10640 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
10650 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64  the array.** and
10660 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65   does not become
10670 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 65 72   part of the per
10680 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  mutation..*/.cas
10690 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
106a0 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
106b0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
106c0 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65  TARRAY );.  asse
106d0 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29  rt( pOp->p4.ai )
106e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
106f0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  1].opcode==OP_Co
10700 6d 70 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72  mpare );.  asser
10710 74 28 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f  t( pOp[1].p5 & O
10720 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b  PFLAG_PERMUTE );
10730 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
10740 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20  Opcode: Compare 
10750 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
10760 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31  * Synopsis: r[P1
10770 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33  @P3] <-> r[P2@P3
10780 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ].**.** Compare 
10790 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
107a0 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
107b0 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
107c0 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
107d0 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
107e0 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
107f0 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
10800 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
10810 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
10820 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
10830 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
10840 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
10850 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
10860 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
10870 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
10880 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72   order of compar
10890 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72  ison is.** deter
108a0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  mined by the mos
108b0 74 20 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d  t recent OP_Perm
108c0 75 74 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  utation operator
108d0 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46  .  If the.** OPF
108e0 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
108f0 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72  is clear, then r
10900 65 67 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70  egister are comp
10910 61 72 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69  ared in sequenti
10920 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a  al.** order..**.
10930 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e  ** P4 is a KeyIn
10940 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
10950 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74  t defines collat
10960 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e  ing sequences an
10970 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73  d sort.** orders
10980 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
10990 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74  son.  The permut
109a0 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f  ation applies to
109b0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e   registers.** on
109c0 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ly.  The KeyInfo
109d0 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73   elements are us
109e0 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e  ed sequentially.
109f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
10a00 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20  rison is a sort 
10a10 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e  comparison, so N
10a20 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75  ULLs compare equ
10a30 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65  al,.** NULLs are
10a40 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65   less than numbe
10a50 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  rs, numbers are 
10a60 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67  less than string
10a70 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67  s,.** and string
10a80 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
10a90 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  blobs..*/.case O
10aa0 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69  P_Compare: {.  i
10ab0 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
10ac0 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70   int p1;.  int p
10ad0 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  2;.  const KeyIn
10ae0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
10af0 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53  int idx;.  CollS
10b00 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
10b10 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
10b20 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68  nce to use on th
10b30 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  is term */.  int
10b40 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
10b50 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43  /* True for DESC
10b60 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65  ENDING sort orde
10b70 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  r */.  int *aPer
10b80 6d 75 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  mute;     /* The
10b90 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a   permutation */.
10ba0 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20  .  if( (pOp->p5 
10bb0 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  & OPFLAG_PERMUTE
10bc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72  )==0 ){.    aPer
10bd0 6d 75 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  mute = 0;.  }els
10be0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10bf0 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  Op>aOp );.    as
10c00 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
10c10 63 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61  code==OP_Permuta
10c20 74 69 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  tion );.    asse
10c30 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79  rt( pOp[-1].p4ty
10c40 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20  pe==P4_INTARRAY 
10c50 29 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20  );.    aPermute 
10c60 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20  = pOp[-1].p4.ai 
10c70 2b 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  + 1;.    assert(
10c80 20 61 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a   aPermute!=0 );.
10c90 20 20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70    }.  n = pOp->p
10ca0 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  3;.  pKeyInfo = 
10cb0 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
10cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
10cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
10ce0 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31  yInfo!=0 );.  p1
10cf0 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32   = pOp->p1;.  p2
10d00 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64   = pOp->p2;.#ifd
10d10 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10d20 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
10d30 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20  {.    int k, mx 
10d40 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
10d50 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20  ; k<n; k++) if( 
10d60 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29  aPermute[k]>mx )
10d70 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b   mx = aPermute[k
10d80 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
10d90 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70  1>0 && p1+mx<=(p
10da0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
10db0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20  ursor)+1 );.    
10dc0 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
10dd0 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p2+mx<=(p->nMem+
10de0 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
10df0 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1 );.  }else{.  
10e00 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26    assert( p1>0 &
10e10 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p1+n<=(p->nMem
10e20 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
10e30 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
10e40 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d  ( p2>0 && p2+n<=
10e50 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
10e60 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
10e70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10e80 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f  TE_DEBUG */.  fo
10e90 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
10ea0 7b 0a 20 20 20 20 69 64 78 20 3d 20 61 50 65 72  {.    idx = aPer
10eb0 6d 75 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b  mute ? aPermute[
10ec0 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65  i] : i;.    asse
10ed0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
10ee0 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b  aMem[p1+idx]) );
10ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
10f00 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32  IsValid(&aMem[p2
10f10 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45  +idx]) );.    RE
10f20 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b  GISTER_TRACE(p1+
10f30 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64  idx, &aMem[p1+id
10f40 78 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  x]);.    REGISTE
10f50 52 5f 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20  R_TRACE(p2+idx, 
10f60 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a  &aMem[p2+idx]);.
10f70 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b      assert( i<pK
10f80 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29  eyInfo->nField )
10f90 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b  ;.    pColl = pK
10fa0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
10fb0 3b 0a 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65  ;.    bRev = pKe
10fc0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
10fd0 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61  r[i];.    iCompa
10fe0 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  re = sqlite3MemC
10ff0 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b  ompare(&aMem[p1+
11000 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69  idx], &aMem[p2+i
11010 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20  dx], pColl);.   
11020 20 69 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b   if( iCompare ){
11030 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 76 20  .      if( bRev 
11040 29 20 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43  ) iCompare = -iC
11050 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72  ompare;.      br
11060 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
11070 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
11080 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32  code: Jump P1 P2
11090 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
110a0 6d 70 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75  mp to the instru
110b0 63 74 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73  ction at address
110c0 20 50 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64   P1, P2, or P3 d
110d0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
110e0 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f  her.** in the mo
110f0 73 74 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d  st recent OP_Com
11100 70 61 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  pare instruction
11110 20 74 68 65 20 50 31 20 76 65 63 74 6f 72 20 77   the P1 vector w
11120 61 73 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  as less than.** 
11130 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
11140 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 50 32  ater than the P2
11150 20 76 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74   vector, respect
11160 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ively..*/.case O
11170 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20  P_Jump: {       
11180 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
11190 0a 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c  .  if( iCompare<
111a0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61  0 ){.    VdbeBra
111b0 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29 3b 20 70  nchTaken(0,3); p
111c0 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70  Op = &aOp[pOp->p
111d0 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20  1 - 1];.  }else 
111e0 69 66 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20  if( iCompare==0 
111f0 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
11200 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20 70 4f 70  hTaken(1,3); pOp
11210 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20   = &aOp[pOp->p2 
11220 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  - 1];.  }else{. 
11230 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
11240 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20 3d 20 26  en(2,3); pOp = &
11250 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d  aOp[pOp->p3 - 1]
11260 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
11270 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64  ../* Opcode: And
11280 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
11290 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
112a0 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d  =(r[P1] && r[P2]
112b0 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  ).**.** Take the
112c0 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20   logical AND of 
112d0 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
112e0 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50  gisters P1 and P
112f0 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74  2 and.** write t
11300 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72  he result into r
11310 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a  egister P3..**.*
11320 2a 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f  * If either P1 o
11330 72 20 50 32 20 69 73 20 30 20 28 66 61 6c 73 65  r P2 is 0 (false
11340 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  ) then the resul
11350 74 20 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a  t is 0 even if.*
11360 2a 20 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75  * the other inpu
11370 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55  t is NULL.  A NU
11380 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74  LL and true or t
11390 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a  wo NULLs give.**
113a0 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a   a NULL output..
113b0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72  */./* Opcode: Or
113c0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
113d0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
113e0 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d  =(r[P1] || r[P2]
113f0 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65  ).**.** Take the
11400 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74   logical OR of t
11410 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
11420 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
11430 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
11440 20 61 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73   answer in regis
11450 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  ter P3..**.** If
11460 20 65 69 74 68 65 72 20 50 31 20 6f 72 20 50 32   either P1 or P2
11470 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75   is nonzero (tru
11480 65 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e) then the resu
11490 6c 74 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a  lt is 1 (true).*
114a0 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74  * even if the ot
114b0 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
114c0 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66  L.  A NULL and f
114d0 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c  alse or two NULL
114e0 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c  s.** give a NULL
114f0 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65   output..*/.case
11500 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20   OP_And:        
11510 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
11520 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e   TK_AND, in1, in
11530 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
11540 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20  OP_Or: {        
11550 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
11560 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c  TK_OR, in1, in2,
11570 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76   out3 */.  int v
11580 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70  1;    /* Left op
11590 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45  erand:  0==FALSE
115a0 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e  , 1==TRUE, 2==UN
115b0 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f  KNOWN or NULL */
115c0 0a 20 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a  .  int v2;    /*
115d0 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20   Right operand: 
115e0 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55  0==FALSE, 1==TRU
115f0 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72  E, 2==UNKNOWN or
11600 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31   NULL */..  pIn1
11610 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
11620 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66  ];.  if( pIn1->f
11630 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
11640 29 7b 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20  ){.    v1 = 2;. 
11650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d   }else{.    v1 =
11660 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
11670 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20  alue(pIn1)!=0;. 
11680 20 7d 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65   }.  pIn2 = &aMe
11690 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66  m[pOp->p2];.  if
116a0 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  ( pIn2->flags & 
116b0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
116c0 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b  v2 = 2;.  }else{
116d0 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
116e0 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49  3VdbeIntValue(pI
116f0 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66  n2)!=0;.  }.  if
11700 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
11710 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61  P_And ){.    sta
11720 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
11730 65 64 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69  ed char and_logi
11740 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c  c[] = { 0, 0, 0,
11750 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20   0, 1, 2, 0, 2, 
11760 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e  2 };.    v1 = an
11770 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d  d_logic[v1*3+v2]
11780 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
11790 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
117a0 67 6e 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67  gned char or_log
117b0 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ic[] = { 0, 1, 2
117c0 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c  , 1, 1, 1, 2, 1,
117d0 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f   2 };.    v1 = o
117e0 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d  r_logic[v1*3+v2]
117f0 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26  ;.  }.  pOut = &
11800 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
11810 20 69 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20   if( v1==2 ){.  
11820 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
11830 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  (pOut, MEM_Null)
11840 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11850 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20  Out->u.i = v1;. 
11860 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61     MemSetTypeFla
11870 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
11880 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
11890 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  ../* Opcode: Not
118a0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
118b0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
118c0 20 21 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e   !r[P1].**.** In
118d0 74 65 72 70 72 65 74 20 74 68 65 20 76 61 6c 75  terpret the valu
118e0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
118f0 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   as a boolean va
11900 6c 75 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a  lue.  Store the.
11910 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c  ** boolean compl
11920 65 6d 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65  ement in registe
11930 72 20 50 32 2e 20 20 49 66 20 74 68 65 20 76 61  r P2.  If the va
11940 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
11950 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20  P1 is .** NULL, 
11960 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73  then a NULL is s
11970 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a  tored in P2..*/.
11980 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20  case OP_Not: {  
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119a0 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c   same as TK_NOT,
119b0 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20   in1, out2 */.  
119c0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
119d0 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
119e0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
119f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
11a00 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
11a10 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
11a20 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
11a30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c   ){.    pOut->fl
11a40 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
11a50 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 21     pOut->u.i = !
11a60 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
11a70 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20  lue(pIn1);.  }. 
11a80 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
11a90 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20  code: BitNot P1 
11aa0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
11ab0 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20 7e 72 5b  psis: r[P1]= ~r[
11ac0 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70  P1].**.** Interp
11ad0 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ret the content 
11ae0 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 61  of register P1 a
11af0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53  s an integer.  S
11b00 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73  tore the.** ones
11b10 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74  -complement of t
11b20 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f  he P1 value into
11b30 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
11b40 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20  f P1 holds.** a 
11b50 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20  NULL then store 
11b60 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f  a NULL in P2..*/
11b70 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a  .case OP_BitNot:
11b80 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
11b90 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54  * same as TK_BIT
11ba0 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a  NOT, in1, out2 *
11bb0 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
11bc0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
11bd0 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
11be0 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2];.  sqlite3Vdb
11bf0 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
11c00 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  );.  if( (pIn1->
11c10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
11c20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74  )==0 ){.    pOut
11c30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
11c40 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  t;.    pOut->u.i
11c50 20 3d 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49   = ~sqlite3VdbeI
11c60 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20  ntValue(pIn1);. 
11c70 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
11c80 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65 20 50  * Opcode: Once P
11c90 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
11ca0 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   Fall through to
11cb0 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
11cc0 63 74 69 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ction the first 
11cd0 74 69 6d 65 20 74 68 69 73 20 6f 70 63 6f 64 65  time this opcode
11ce0 20 69 73 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72   is.** encounter
11cf0 65 64 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  ed on each invoc
11d00 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 79 74  ation of the byt
11d10 65 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d 2e 20  e-code program. 
11d20 20 4a 75 6d 70 20 74 6f 20 50 32 0a 2a 2a 20 6f   Jump to P2.** o
11d30 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  n the second and
11d40 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
11d50 65 6e 63 6f 75 6e 74 65 72 73 20 64 75 72 69 6e  encounters durin
11d60 67 20 74 68 65 20 73 61 6d 65 20 69 6e 76 6f 63  g the same invoc
11d70 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 70  ation..**.** Top
11d80 2d 6c 65 76 65 6c 20 70 72 6f 67 72 61 6d 73 20  -level programs 
11d90 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20  determine first 
11da0 69 6e 76 6f 63 61 74 69 6f 6e 20 62 79 20 63 6f  invocation by co
11db0 6d 70 61 72 69 6e 67 20 74 68 65 20 50 31 0a 2a  mparing the P1.*
11dc0 2a 20 6f 70 65 72 61 6e 64 20 61 67 61 69 6e 73  * operand agains
11dd0 74 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  t the P1 operand
11de0 20 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69 74 20   on the OP_Init 
11df0 6f 70 63 6f 64 65 20 61 74 20 74 68 65 20 62 65  opcode at the be
11e00 67 69 6e 6e 69 6e 67 0a 2a 2a 20 6f 66 20 74 68  ginning.** of th
11e10 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 66 20 74  e program.  If t
11e20 68 65 20 50 31 20 76 61 6c 75 65 73 20 64 69 66  he P1 values dif
11e30 66 65 72 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74  fer, then fall t
11e40 68 72 6f 75 67 68 20 61 6e 64 20 6d 61 6b 65 0a  hrough and make.
11e50 2a 2a 20 74 68 65 20 50 31 20 6f 66 20 74 68 69  ** the P1 of thi
11e60 73 20 6f 70 63 6f 64 65 20 65 71 75 61 6c 20 74  s opcode equal t
11e70 6f 20 74 68 65 20 50 31 20 6f 66 20 4f 50 5f 49  o the P1 of OP_I
11e80 6e 69 74 2e 20 20 49 66 20 50 31 20 76 61 6c 75  nit.  If P1 valu
11e90 65 73 20 61 72 65 0a 2a 2a 20 74 68 65 20 73 61  es are.** the sa
11ea0 6d 65 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65  me then take the
11eb0 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   jump..**.** For
11ec0 20 73 75 62 70 72 6f 67 72 61 6d 73 2c 20 74 68   subprograms, th
11ed0 65 72 65 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ere is a bitmask
11ee0 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
11ef0 65 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  e that determine
11f00 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  s.** whether or 
11f10 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 73 68 6f  not the jump sho
11f20 75 6c 64 20 62 65 20 74 61 6b 65 6e 2e 20 20 54  uld be taken.  T
11f30 68 65 20 62 69 74 6d 61 73 6b 20 69 73 20 6e 65  he bitmask is ne
11f40 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63 61 75  cessary.** becau
11f50 73 65 20 74 68 65 20 73 65 6c 66 2d 61 6c 74 65  se the self-alte
11f60 72 69 6e 67 20 63 6f 64 65 20 74 72 69 63 6b 20  ring code trick 
11f70 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 66 6f  does not work fo
11f80 72 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 74  r recursive.** t
11f90 72 69 67 67 65 72 73 2e 0a 2a 2f 0a 63 61 73 65  riggers..*/.case
11fa0 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
11fb0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
11fc0 2a 2f 0a 20 20 75 33 32 20 69 41 64 64 72 3b 20  */.  u32 iAddr; 
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fe0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 69  * Address of thi
11ff0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  s instruction */
12000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
12010 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[0].opcode==OP_
12020 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  Init );.  if( p-
12030 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 69  >pFrame ){.    i
12040 41 64 64 72 20 3d 20 28 69 6e 74 29 28 70 4f 70  Addr = (int)(pOp
12050 20 2d 20 70 2d 3e 61 4f 70 29 3b 0a 20 20 20 20   - p->aOp);.    
12060 69 66 28 20 28 70 2d 3e 70 46 72 61 6d 65 2d 3e  if( (p->pFrame->
12070 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d 20 26  aOnce[iAddr/8] &
12080 20 28 31 3c 3c 28 69 41 64 64 72 20 26 20 37 29   (1<<(iAddr & 7)
12090 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 56  ))!=0 ){.      V
120a0 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31  dbeBranchTaken(1
120b0 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  , 2);.      goto
120c0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
120d0 20 7d 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65   }.    p->pFrame
120e0 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d  ->aOnce[iAddr/8]
120f0 20 7c 3d 20 31 3c 3c 28 69 41 64 64 72 20 26 20   |= 1<<(iAddr & 
12100 37 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  7);.  }else{.   
12110 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70   if( p->aOp[0].p
12120 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  1==pOp->p1 ){.  
12130 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
12140 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  ken(1, 2);.     
12150 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
12160 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 56 64  ;.    }.  }.  Vd
12170 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c  beBranchTaken(0,
12180 20 32 29 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d   2);.  pOp->p1 =
12190 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20   p->aOp[0].p1;. 
121a0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
121b0 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20 50  code: If P1 P2 P
121c0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
121d0 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
121e0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
121f0 50 31 20 69 73 20 74 72 75 65 2e 20 20 54 68 65  P1 is true.  The
12200 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e   value.** is con
12210 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66 20  sidered true if 
12220 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e  it is numeric an
12230 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  d non-zero.  If 
12240 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
12250 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
12260 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
12270 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20   and only if P3 
12280 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
12290 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74  /* Opcode: IfNot
122a0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
122b0 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
122c0 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
122d0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46 61  egister P1 is Fa
122e0 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  lse.  The value.
122f0 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
12300 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
12310 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
12320 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
12330 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
12340 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
12350 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
12360 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73  nd only if P3 is
12370 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61   non-zero..*/.ca
12380 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
12390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
123a0 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
123b0 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
123c0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
123d0 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
123e0 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
123f0 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
12400 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
12410 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20  Null ){.    c = 
12420 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65  pOp->p3;.  }else
12430 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12440 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
12450 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  INT.    c = sqli
12460 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
12470 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a  pIn1)!=0;.#else.
12480 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
12490 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
124a0 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  1)!=0.0;.#endif.
124b0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
124c0 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20  ode==OP_IfNot ) 
124d0 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 56 64  c = !c;.  }.  Vd
124e0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21  beBranchTaken(c!
124f0 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20  =0, 2);.  if( c 
12500 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
12510 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
12520 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
12530 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20  e: IsNull P1 P2 
12540 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
12550 73 3a 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c  s: if r[P1]==NUL
12560 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  L goto P2.**.** 
12570 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
12580 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
12590 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a  ter P1 is NULL..
125a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c  */.case OP_IsNul
125b0 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
125c0 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53  /* same as TK_IS
125d0 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
125e0 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
125f0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
12600 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
12610 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
12620 4d 5f 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a  M_Null)!=0, 2);.
12630 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
12640 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
12650 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
12660 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
12670 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
12680 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
12690 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
126a0 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
126b0 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  NULL goto P2.**.
126c0 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
126d0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
126e0 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74  gister P1 is not
126f0 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65   NULL.  .*/.case
12700 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20   OP_NotNull: {  
12710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
12720 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  e as TK_NOTNULL,
12730 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
12740 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12750 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
12760 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
12770 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
12780 6c 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)==0, 2);.  if(
12790 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
127a0 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
127b0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
127c0 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
127d0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
127e0 49 66 4e 75 6c 6c 52 6f 77 20 50 31 20 50 32 20  IfNullRow P1 P2 
127f0 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
12800 69 73 3a 20 69 66 20 50 31 2e 6e 75 6c 6c 52 6f  is: if P1.nullRo
12810 77 20 74 68 65 6e 20 72 5b 50 33 5d 3d 4e 55 4c  w then r[P3]=NUL
12820 4c 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  L, goto P2.**.**
12830 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 73 6f   Check the curso
12840 72 20 50 31 20 74 6f 20 73 65 65 20 69 66 20 69  r P1 to see if i
12850 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
12860 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 4e 55 4c  ointing at a NUL
12870 4c 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 69 74 20  L row..** If it 
12880 69 73 2c 20 74 68 65 6e 20 73 65 74 20 72 65 67  is, then set reg
12890 69 73 74 65 72 20 50 33 20 74 6f 20 4e 55 4c 4c  ister P3 to NULL
128a0 20 61 6e 64 20 6a 75 6d 70 20 69 6d 6d 65 64 69   and jump immedi
128b0 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20  ately to P2..** 
128c0 49 66 20 50 31 20 69 73 20 6e 6f 74 20 6f 6e 20  If P1 is not on 
128d0 61 20 4e 55 4c 4c 20 72 6f 77 2c 20 74 68 65 6e  a NULL row, then
128e0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 77 69   fall through wi
128f0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 6e 79  thout making any
12900 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a  .** changes..*/.
12910 63 61 73 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f  case OP_IfNullRo
12920 77 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20  w: {         /* 
12930 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
12940 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
12950 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
12960 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
12970 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
12980 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]!=0 );.  if( p-
12990 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d  >apCsr[pOp->p1]-
129a0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
129b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
129c0 74 4e 75 6c 6c 28 61 4d 65 6d 20 2b 20 70 4f 70  tNull(aMem + pOp
129d0 2d 3e 70 33 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ->p3);.    goto 
129e0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
129f0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12a00 70 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31  pcode: Column P1
12a10 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
12a20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
12a30 50 58 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  PX.**.** Interpr
12a40 65 74 20 74 68 65 20 64 61 74 61 20 74 68 61 74  et the data that
12a50 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
12a60 73 20 74 6f 20 61 73 20 61 20 73 74 72 75 63 74  s to as a struct
12a70 75 72 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a  ure built using.
12a80 2a 2a 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ** the MakeRecor
12a90 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
12aa0 28 53 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63  (See the MakeRec
12ab0 6f 72 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  ord opcode for a
12ac0 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66  dditional.** inf
12ad0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
12ae0 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  he format of the
12af0 20 64 61 74 61 2e 29 20 20 45 78 74 72 61 63 74   data.)  Extract
12b00 20 74 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d   the P2-th colum
12b10 6e 0a 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72  n.** from this r
12b20 65 63 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65  ecord.  If there
12b30 20 61 72 65 20 6c 65 73 73 20 74 68 61 74 20 28   are less that (
12b40 50 32 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73  P2+1) .** values
12b50 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20   in the record, 
12b60 65 78 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a  extract a NULL..
12b70 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
12b80 65 78 74 72 61 63 74 65 64 20 69 73 20 73 74 6f  extracted is sto
12b90 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
12ba0 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  P3..**.** If the
12bb0 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
12bc0 20 66 65 77 65 72 20 74 68 61 6e 20 50 32 20 66   fewer than P2 f
12bd0 69 65 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72  ields, then extr
12be0 61 63 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c  act a NULL.  Or,
12bf0 0a 2a 2a 20 69 66 20 74 68 65 20 50 34 20 61 72  .** if the P4 ar
12c00 67 75 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d  gument is a P4_M
12c10 45 4d 20 75 73 65 20 74 68 65 20 76 61 6c 75 65  EM use the value
12c20 20 6f 66 20 74 68 65 20 50 34 20 61 72 67 75 6d   of the P4 argum
12c30 65 6e 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65  ent as.** the re
12c40 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sult..**.** If t
12c50 68 65 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  he OPFLAG_CLEARC
12c60 41 43 48 45 20 62 69 74 20 69 73 20 73 65 74 20  ACHE bit is set 
12c70 6f 6e 20 50 35 20 61 6e 64 20 50 31 20 69 73 20  on P5 and P1 is 
12c80 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63  a pseudo-table c
12c90 75 72 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74  ursor,.** then t
12ca0 68 65 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  he cache of the 
12cb0 63 75 72 73 6f 72 20 69 73 20 72 65 73 65 74 20  cursor is reset 
12cc0 70 72 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74  prior to extract
12cd0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a  ing the column..
12ce0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f  ** The first OP_
12cf0 43 6f 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61  Column against a
12d00 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66   pseudo-table af
12d10 74 65 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ter the value of
12d20 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
12d30 72 65 67 69 73 74 65 72 20 68 61 73 20 63 68 61  register has cha
12d40 6e 67 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65  nged should have
12d50 20 74 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a   this bit set..*
12d60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
12d70 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64  AG_LENGTHARG and
12d80 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
12d90 47 20 62 69 74 73 20 61 72 65 20 73 65 74 20 6f  G bits are set o
12da0 6e 20 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68 65  n P5 then.** the
12db0 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72 61   result is guara
12dc0 6e 74 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65  nteed to only be
12dd0 20 75 73 65 64 20 61 73 20 74 68 65 20 61 72 67   used as the arg
12de0 75 6d 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74  ument of a lengt
12df0 68 28 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66  h().** or typeof
12e00 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73  () function, res
12e10 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
12e20 6c 6f 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65  loading of large
12e30 20 62 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a   blobs can be.**
12e40 20 73 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e   skipped for len
12e50 67 74 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f  gth() and all co
12e60 6e 74 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61  ntent loading ca
12e70 6e 20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72  n be skipped for
12e80 20 74 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61   typeof()..*/.ca
12e90 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a  se OP_Column: {.
12ea0 20 20 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20    int p2;       
12eb0 20 20 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e       /* column n
12ec0 75 6d 62 65 72 20 74 6f 20 72 65 74 72 69 65 76  umber to retriev
12ed0 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  e */.  VdbeCurso
12ee0 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65  r *pC;    /* The
12ef0 20 56 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a   VDBE cursor */.
12f00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73    BtCursor *pCrs
12f10 72 3b 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65  r;   /* The BTre
12f20 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33  e cursor */.  u3
12f30 32 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20  2 *aOffset;     
12f40 20 2f 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69   /* aOffset[i] i
12f50 73 20 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72  s offset to star
12f60 74 20 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d  t of data for i-
12f70 74 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  th column */.  i
12f80 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
12f90 20 20 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20    /* The length 
12fa0 6f 66 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  of the serialize
12fb0 64 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 63  d data for the c
12fc0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
12fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12fe0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12ff0 0a 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20  .  Mem *pDest;  
13000 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
13010 6f 20 77 72 69 74 65 20 74 68 65 20 65 78 74 72  o write the extr
13020 61 63 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20  acted value */. 
13030 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20   Mem sMem;      
13040 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69      /* For stori
13050 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62 65  ng the record be
13060 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
13070 20 63 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61   const u8 *zData
13080 3b 20 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74  ;   /* Part of t
13090 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  he record being 
130a0 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e  decoded */.  con
130b0 73 74 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20  st u8 *zHdr;    
130c0 2f 2a 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64  /* Next unparsed
130d0 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
130e0 64 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  der */.  const u
130f0 38 20 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50  8 *zEndHdr; /* P
13100 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
13110 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 68  byte after the h
13120 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6f  eader */.  u32 o
13130 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
13140 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   Offset into the
13150 20 64 61 74 61 20 2a 2f 0a 20 20 75 36 34 20 6f   data */.  u64 o
13160 66 66 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a  ffset64;      /*
13170 20 36 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a   64-bit offset *
13180 2f 0a 20 20 75 33 32 20 61 76 61 69 6c 3b 20 20  /.  u32 avail;  
13190 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
131a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
131b0 69 6c 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20  ilable data */. 
131c0 20 75 33 32 20 74 3b 20 20 20 20 20 20 20 20 20   u32 t;         
131d0 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 63 6f      /* A type co
131e0 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f  de from the reco
131f0 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d  rd header */.  M
13200 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20  em *pReg;       
13210 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65    /* PseudoTable
13220 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 20   input register 
13230 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70  */..  pC = p->ap
13240 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
13250 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 0a 20  p2 = pOp->p2;.. 
13260 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
13270 72 20 63 61 63 68 65 20 69 73 20 73 74 61 6c 65  r cache is stale
13280 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
13290 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  not currently po
132a0 69 6e 74 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  int at.  ** the 
132b0 63 6f 72 72 65 63 74 20 72 6f 77 29 20 74 68 65  correct row) the
132c0 6e 20 62 72 69 6e 67 20 69 74 20 75 70 2d 74 6f  n bring it up-to
132d0 2d 64 61 74 65 20 62 79 20 64 6f 69 6e 67 20 74  -date by doing t
132e0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 20 20  he necessary .  
132f0 2a 2a 20 42 2d 54 72 65 65 20 73 65 65 6b 2e 20  ** B-Tree seek. 
13300 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
13310 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
13320 6f 28 26 70 43 2c 20 26 70 32 29 3b 0a 20 20 69  o(&pC, &p2);.  i
13330 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
13340 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
13350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
13360 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
13370 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
13380 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
13390 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f  pDest = &aMem[pO
133a0 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p3];.  memAbo
133b0 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44  utToChange(p, pD
133c0 65 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  est);.  assert( 
133d0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
133e0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
133f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13400 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13410 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 20 29   p2<pC->nField )
13420 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43  ;.  aOffset = pC
13430 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 61 73 73  ->aOffset;.  ass
13440 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
13450 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e!=CURTYPE_VTAB 
13460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
13470 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59  >eCurType!=CURTY
13480 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d  PE_PSEUDO || pC-
13490 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 61 73  >nullRow );.  as
134a0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
134b0 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54  pe!=CURTYPE_SORT
134c0 45 52 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 2d  ER );..  if( pC-
134d0 3e 63 61 63 68 65 53 74 61 74 75 73 21 3d 70 2d  >cacheStatus!=p-
134e0 3e 63 61 63 68 65 43 74 72 20 29 7b 20 20 20 20  >cacheCtr ){    
134f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f 50              /*OP
13500 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41  TIMIZATION-IF-FA
13510 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  LSE*/.    if( pC
13520 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
13530 20 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54     if( pC->eCurT
13540 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53 45  ype==CURTYPE_PSE
13550 55 44 4f 20 29 7b 0a 20 20 20 20 20 20 20 20 61  UDO ){.        a
13560 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 73  ssert( pC->uc.ps
13570 65 75 64 6f 54 61 62 6c 65 52 65 67 3e 30 20 29  eudoTableReg>0 )
13580 3b 0a 20 20 20 20 20 20 20 20 70 52 65 67 20 3d  ;.        pReg =
13590 20 26 61 4d 65 6d 5b 70 43 2d 3e 75 63 2e 70 73   &aMem[pC->uc.ps
135a0 65 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20  eudoTableReg];. 
135b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
135c0 52 65 67 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Reg->flags & MEM
135d0 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
135e0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
135f0 6c 69 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20  lid(pReg) );.   
13600 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64       pC->payload
13610 53 69 7a 65 20 3d 20 70 43 2d 3e 73 7a 52 6f 77  Size = pC->szRow
13620 20 3d 20 61 76 61 69 6c 20 3d 20 70 52 65 67 2d   = avail = pReg-
13630 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e  >n;.        pC->
13640 61 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 65 67  aRow = (u8*)pReg
13650 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
13660 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13670 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
13680 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pDest);.        
13690 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f  goto op_column_o
136a0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
136b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 72  }else{.      pCr
136c0 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
136d0 73 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  sor;.      asser
136e0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
136f0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
13700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13710 70 43 72 73 72 20 29 3b 0a 20 20 20 20 20 20 61  pCrsr );.      a
13720 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
13730 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
13740 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20  (pCrsr) );.     
13750 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
13760 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
13770 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72  ayloadSize(pCrsr
13780 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  );.      pC->aRo
13790 77 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  w = sqlite3Btree
137a0 50 61 79 6c 6f 61 64 46 65 74 63 68 28 70 43 72  PayloadFetch(pCr
137b0 73 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20  sr, &avail);.   
137c0 20 20 20 61 73 73 65 72 74 28 20 61 76 61 69 6c     assert( avail
137d0 3c 3d 36 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d  <=65536 );  /* M
137e0 61 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65  aximum page size
137f0 20 69 73 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20   is 64KiB */.   
13800 20 20 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f     if( pC->paylo
13810 61 64 53 69 7a 65 20 3c 3d 20 28 75 33 32 29 61  adSize <= (u32)a
13820 76 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  vail ){.        
13830 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 43 2d 3e  pC->szRow = pC->
13840 70 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20  payloadSize;.   
13850 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d     }else if( pC-
13860 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28  >payloadSize > (
13870 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  u32)db->aLimit[S
13880 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
13890 54 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67  TH] ){.        g
138a0 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20  oto too_big;.   
138b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
138c0 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76    pC->szRow = av
138d0 61 69 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ail;.      }.   
138e0 20 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65   }.    pC->cache
138f0 53 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63 68  Status = p->cach
13900 65 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e 69 48  eCtr;.    pC->iH
13910 64 72 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61  drOffset = getVa
13920 72 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f 77 2c  rint32(pC->aRow,
13930 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 70 43   offset);.    pC
13940 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30  ->nHdrParsed = 0
13950 3b 0a 20 20 20 20 61 4f 66 66 73 65 74 5b 30 5d  ;.    aOffset[0]
13960 20 3d 20 6f 66 66 73 65 74 3b 0a 0a 0a 20 20 20   = offset;...   
13970 20 69 66 28 20 61 76 61 69 6c 3c 6f 66 66 73 65   if( avail<offse
13980 74 20 29 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49  t ){      /*OPTI
13990 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53  MIZATION-IF-FALS
139a0 45 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d  E*/.      /* pC-
139b0 3e 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68  >aRow does not h
139c0 61 76 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ave to hold the 
139d0 65 6e 74 69 72 65 20 72 6f 77 2c 20 62 75 74 20  entire row, but 
139e0 69 74 20 64 6f 65 73 20 61 74 20 6c 65 61 73 74  it does at least
139f0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74  .      ** need t
13a00 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64  o cover the head
13a10 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
13a20 2e 20 20 49 66 20 70 43 2d 3e 61 52 6f 77 20 64  .  If pC->aRow d
13a30 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a  oes not contain.
13a40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d        ** the com
13a50 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 74 68  plete header, th
13a60 65 6e 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72  en set it to zer
13a70 6f 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 68  o, forcing the h
13a80 65 61 64 65 72 20 74 6f 20 62 65 0a 20 20 20 20  eader to be.    
13a90 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
13aa0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20   allocated. */. 
13ab0 20 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20       pC->aRow = 
13ac0 30 3b 0a 20 20 20 20 20 20 70 43 2d 3e 73 7a 52  0;.      pC->szR
13ad0 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ow = 0;..      /
13ae0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f  * Make sure a co
13af0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68  rrupt database h
13b00 61 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20  as not given us 
13b10 61 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64  an oversize head
13b20 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20  er..      ** Do 
13b30 74 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69  this now to avoi
13b40 64 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65  d an oversize me
13b50 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  mory allocation.
13b60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13b70 2a 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20  ** Type entries 
13b80 63 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31  can be between 1
13b90 20 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63   and 5 bytes eac
13ba0 68 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20  h.  But 4 and 5 
13bb0 62 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 79  byte.      ** ty
13bc0 70 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20  pes use so much 
13bd0 64 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20  data space that 
13be0 74 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62  there can only b
13bf0 65 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66  e 4096 and 32 of
13c00 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20  .      ** them, 
13c10 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53  respectively.  S
13c20 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65  o the maximum he
13c30 61 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75  ader length resu
13c40 6c 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 20  lts from a.     
13c50 20 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20   ** 3-byte type 
13c60 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20  for each of the 
13c70 6d 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38  maximum of 32768
13c80 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68   columns plus th
13c90 72 65 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ree.      ** ext
13ca0 72 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65  ra bytes for the
13cb0 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69   header length i
13cc0 74 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20  tself.  32768*3 
13cd0 2b 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20  + 3 = 98307..   
13ce0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13cf0 6f 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 7c  offset > 98307 |
13d00 7c 20 6f 66 66 73 65 74 20 3e 20 70 43 2d 3e 70  | offset > pC->p
13d10 61 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20  ayloadSize ){.  
13d20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13d30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
13d40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
13d50 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
13d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13d70 73 65 20 69 66 28 20 6f 66 66 73 65 74 3e 30 20  se if( offset>0 
13d80 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
13d90 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20  N-IF-TRUE*/.    
13da0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
13db0 6e 67 20 67 6f 74 6f 20 69 73 20 61 6e 20 6f 70  ng goto is an op
13dc0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
13dd0 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61  can be omitted a
13de0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 72  nd.      ** ever
13df0 79 74 68 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c  ything will stil
13e00 6c 20 77 6f 72 6b 2e 20 20 42 75 74 20 4f 50 5f  l work.  But OP_
13e10 43 6f 6c 75 6d 6e 20 69 73 20 6d 65 61 73 75 72  Column is measur
13e20 61 62 6c 79 20 66 61 73 74 65 72 0a 20 20 20 20  ably faster.    
13e30 20 20 2a 2a 20 62 79 20 73 6b 69 70 70 69 6e 67    ** by skipping
13e40 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
13e50 63 6f 6e 64 69 74 69 6f 6e 61 6c 2c 20 77 68 69  conditional, whi
13e60 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 72 75  ch is always tru
13e70 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13e80 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52    zData = pC->aR
13e90 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ow;.      assert
13ea0 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  ( pC->nHdrParsed
13eb0 3c 3d 70 32 20 29 3b 20 20 20 20 20 20 20 20 20  <=p2 );         
13ec0 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73  /* Conditional s
13ed0 6b 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20  kipped */.      
13ee0 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72  goto op_column_r
13ef0 65 61 64 5f 68 65 61 64 65 72 3b 0a 20 20 20 20  ead_header;.    
13f00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
13f10 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 74   sure at least t
13f20 68 65 20 66 69 72 73 74 20 70 32 2b 31 20 65 6e  he first p2+1 en
13f30 74 72 69 65 73 20 6f 66 20 74 68 65 20 68 65 61  tries of the hea
13f40 64 65 72 20 68 61 76 65 20 62 65 65 6e 0a 20 20  der have been.  
13f50 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 76 61  ** parsed and va
13f60 6c 69 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lid information 
13f70 69 73 20 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20  is in aOffset[] 
13f80 61 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e  and pC->aType[].
13f90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e  .  */.  if( pC->
13fa0 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29  nHdrParsed<=p2 )
13fb0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
13fc0 65 20 69 73 20 6d 6f 72 65 20 68 65 61 64 65 72  e is more header
13fd0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70   available for p
13fe0 61 72 73 69 6e 67 20 69 6e 20 74 68 65 20 72 65  arsing in the re
13ff0 63 6f 72 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a  cord, try.    **
14000 20 74 6f 20 65 78 74 72 61 63 74 20 61 64 64 69   to extract addi
14010 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 75 70  tional fields up
14020 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2b   through the p2+
14030 31 2d 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20  1-th field .    
14040 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69  */.    if( pC->i
14050 48 64 72 4f 66 66 73 65 74 3c 61 4f 66 66 73 65  HdrOffset<aOffse
14060 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t[0] ){.      /*
14070 20 4d 61 6b 65 20 73 75 72 65 20 7a 44 61 74 61   Make sure zData
14080 20 70 6f 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67   points to enoug
14090 68 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  h of the record 
140a0 74 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61  to cover the hea
140b0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  der. */.      if
140c0 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b  ( pC->aRow==0 ){
140d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
140e0 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
140f0 28 73 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20  (sMem));.       
14100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
14110 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
14120 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c  ->uc.pCursor, 0,
14130 20 61 4f 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d   aOffset[0], &sM
14140 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  em);.        if(
14150 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14160 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
14170 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
14180 20 20 7a 44 61 74 61 20 3d 20 28 75 38 2a 29 73    zData = (u8*)s
14190 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  Mem.z;.      }el
141a0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74  se{.        zDat
141b0 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20  a = pC->aRow;.  
141c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
141d0 2a 20 46 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54  * Fill in pC->aT
141e0 79 70 65 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73  ype[i] and aOffs
141f0 65 74 5b 69 5d 20 76 61 6c 75 65 73 20 74 68 72  et[i] values thr
14200 6f 75 67 68 20 74 68 65 20 70 32 2d 74 68 20 66  ough the p2-th f
14210 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f  ield. */.    op_
14220 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64  column_read_head
14230 65 72 3a 0a 20 20 20 20 20 20 69 20 3d 20 70 43  er:.      i = pC
14240 2d 3e 6e 48 64 72 50 61 72 73 65 64 3b 0a 20 20  ->nHdrParsed;.  
14250 20 20 20 20 6f 66 66 73 65 74 36 34 20 3d 20 61      offset64 = a
14260 4f 66 66 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20  Offset[i];.     
14270 20 7a 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20   zHdr = zData + 
14280 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a  pC->iHdrOffset;.
14290 20 20 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20        zEndHdr = 
142a0 7a 44 61 74 61 20 2b 20 61 4f 66 66 73 65 74 5b  zData + aOffset[
142b0 30 5d 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  0];.      do{.  
142c0 20 20 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a        if( (t = z
142d0 48 64 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a  Hdr[0])<0x80 ){.
142e0 20 20 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b            zHdr++
142f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
14300 65 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56  et64 += sqlite3V
14310 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c  dbeOneByteSerial
14320 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20  TypeLen(t);.    
14330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14340 20 20 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c       zHdr += sql
14350 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
14360 7a 48 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20  zHdr, &t);.     
14370 20 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d       offset64 +=
14380 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14390 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20  alTypeLen(t);.  
143a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
143b0 70 43 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d  pC->aType[i++] =
143c0 20 74 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66   t;.        aOff
143d0 73 65 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f  set[i] = (u32)(o
143e0 66 66 73 65 74 36 34 20 26 20 30 78 66 66 66 66  ffset64 & 0xffff
143f0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68  ffff);.      }wh
14400 69 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48  ile( i<=p2 && zH
14410 64 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20  dr<zEndHdr );.. 
14420 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
14430 72 64 20 69 73 20 63 6f 72 72 75 70 74 20 69 66  rd is corrupt if
14440 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
14450 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
14460 20 20 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65        ** (1) the
14470 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 68 65   bytes of the he
14480 61 64 65 72 20 65 78 74 65 6e 64 20 70 61 73 74  ader extend past
14490 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 68 65   the declared he
144a0 61 64 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20  ader size.      
144b0 2a 2a 20 28 32 29 20 74 68 65 20 65 6e 74 69 72  ** (2) the entir
144c0 65 20 68 65 61 64 65 72 20 77 61 73 20 75 73 65  e header was use
144d0 64 20 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61  d but not all da
144e0 74 61 20 77 61 73 20 75 73 65 64 0a 20 20 20 20  ta was used.    
144f0 20 20 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64    ** (3) the end
14500 20 6f 66 20 74 68 65 20 64 61 74 61 20 65 78 74   of the data ext
14510 65 6e 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20  ends beyond the 
14520 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72  end of the recor
14530 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14540 20 20 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e    if( (zHdr>=zEn
14550 64 48 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45  dHdr && (zHdr>zE
14560 6e 64 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36  ndHdr || offset6
14570 34 21 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69  4!=pC->payloadSi
14580 7a 65 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ze)).       || (
14590 6f 66 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70  offset64 > pC->p
145a0 61 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20  ayloadSize).    
145b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28    ){.        if(
145c0 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73   pC->aRow==0 ) s
145d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
145e0 65 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20  ease(&sMem);.   
145f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14600 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14610 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
14620 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
14630 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
14640 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20  C->nHdrParsed = 
14650 69 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64  i;.      pC->iHd
14660 72 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 28  rOffset = (u32)(
14670 7a 48 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20  zHdr - zData);. 
14680 20 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f       if( pC->aRo
14690 77 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64  w==0 ) sqlite3Vd
146a0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d  beMemRelease(&sM
146b0 65 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  em);.    }else{.
146c0 20 20 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20        t = 0;.   
146d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66   }..    /* If af
146e0 74 65 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78  ter trying to ex
146f0 74 72 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65  tract new entrie
14700 73 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65  s from the heade
14710 72 2c 20 6e 48 64 72 50 61 72 73 65 64 20 69 73  r, nHdrParsed is
14720 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f  .    ** still no
14730 74 20 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74  t up to p2, that
14740 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14750 72 65 63 6f 72 64 20 68 61 73 20 66 65 77 65 72  record has fewer
14760 20 74 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20   than p2.    ** 
14770 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65  columns.  So the
14780 20 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20   result will be 
14790 65 69 74 68 65 72 20 74 68 65 20 64 65 66 61 75  either the defau
147a0 6c 74 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55  lt value or a NU
147b0 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  LL..    */.    i
147c0 66 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65  f( pC->nHdrParse
147d0 64 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69  d<=p2 ){.      i
147e0 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
147f0 50 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  P4_MEM ){.      
14800 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
14810 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73  ShallowCopy(pDes
14820 74 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c  t, pOp->p4.pMem,
14830 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20   MEM_Static);.  
14840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
14860 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
14870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
14880 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
14890 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
148a0 7b 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54  {.    t = pC->aT
148b0 79 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20  ype[p2];.  }..  
148c0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63  /* Extract the c
148d0 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70  ontent for the p
148e0 32 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20  2+1-th column.  
148f0 43 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79  Control can only
14900 0a 20 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73  .  ** reach this
14910 20 70 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65   point if aOffse
14920 74 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70  t[p2], aOffset[p
14930 32 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54  2+1], and pC->aT
14940 79 70 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a  ype[p2] are.  **
14950 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f   all valid..  */
14960 0a 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43  .  assert( p2<pC
14970 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a  ->nHdrParsed );.
14980 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
14990 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
149a0 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
149b0 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
149c0 74 73 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69  ts(pDest) );.  i
149d0 66 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69  f( VdbeMemDynami
149e0 63 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  c(pDest) ){.    
149f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
14a00 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20  tNull(pDest);.  
14a10 7d 0a 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70  }.  assert( t==p
14a20 43 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a  C->aType[p2] );.
14a30 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e    if( pC->szRow>
14a40 3d 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29  =aOffset[p2+1] )
14a50 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
14a60 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
14a70 20 77 68 65 72 65 20 74 68 65 20 64 65 73 69 72   where the desir
14a80 65 64 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20  ed content fits 
14a90 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  on the original.
14aa0 20 20 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68      ** page - wh
14ab0 65 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ere the content 
14ac0 69 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65  is not on an ove
14ad0 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
14ae0 20 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52    zData = pC->aR
14af0 6f 77 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d  ow + aOffset[p2]
14b00 3b 0a 20 20 20 20 69 66 28 20 74 3c 31 32 20 29  ;.    if( t<12 )
14b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14b20 64 62 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61  dbeSerialGet(zDa
14b30 74 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  ta, t, pDest);. 
14b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b50 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
14b60 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
14b70 6e 67 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65  ng, we need a pe
14b80 72 73 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20  rsistent value, 
14b90 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d  not.      ** a M
14ba0 45 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20  EM_Ephem value. 
14bb0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
14bc0 61 20 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74  a fast short-cut
14bd0 20 74 68 61 74 20 69 73 20 65 71 75 69 76 61 6c   that is equival
14be0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ent.      ** to 
14bf0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56  calling sqlite3V
14c00 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
14c10 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
14c20 65 70 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a  ephemeralize()..
14c30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
14c40 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
14c50 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
14c60 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  Blob, MEM_Str|ME
14c70 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20  M_Term };.      
14c80 70 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d  pDest->n = len =
14c90 20 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20   (t-12)/2;.     
14ca0 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
14cb0 63 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66  coding;.      if
14cc0 28 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f  ( pDest->szMallo
14cd0 63 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20  c < len+2 ){.   
14ce0 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
14cf0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
14d00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14d10 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65  3VdbeMemGrow(pDe
14d20 73 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20  st, len+2, 0) ) 
14d30 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
14d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d50 20 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65    pDest->z = pDe
14d60 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20  st->zMalloc;.   
14d70 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70     }.      memcp
14d80 79 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74  y(pDest->z, zDat
14d90 61 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70  a, len);.      p
14da0 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30  Dest->z[len] = 0
14db0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a  ;.      pDest->z
14dc0 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20  [len+1] = 0;.   
14dd0 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
14de0 3d 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20  = aFlag[t&1];.  
14df0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14e00 20 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e   pDest->enc = en
14e10 63 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54  coding;.    /* T
14e20 68 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65  his branch happe
14e30 6e 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e  ns only when con
14e40 74 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66  tent is on overf
14e50 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  low pages */.   
14e60 20 69 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26   if( ((pOp->p5 &
14e70 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
14e80 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
14e90 41 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20  ARG))!=0.       
14ea0 20 20 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26     && ((t>=12 &&
14eb0 20 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70   (t&1)==0) || (p
14ec0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
14ed0 54 59 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a  TYPEOFARG)!=0)).
14ee0 20 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73       || (len = s
14ef0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14f00 54 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20  TypeLen(t))==0. 
14f10 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43     ){.      /* C
14f20 6f 6e 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65  ontent is irrele
14f30 76 61 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a  vant for.      *
14f40 2a 20 20 20 20 31 2e 20 74 68 65 20 74 79 70 65  *    1. the type
14f50 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20  of() function,. 
14f60 20 20 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68       **    2. th
14f70 65 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63  e length(X) func
14f80 74 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62  tion if X is a b
14f90 6c 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  lob, and.      *
14fa0 2a 20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63  *    3. if the c
14fb0 6f 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73  ontent length is
14fc0 20 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20   zero..      ** 
14fd0 53 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77  So we might as w
14fe0 65 6c 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f  ell use bogus co
14ff0 6e 74 65 6e 74 20 72 61 74 68 65 72 20 74 68 61  ntent rather tha
15000 6e 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20  n reading.      
15010 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ** content from 
15020 64 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  disk. .      **.
15030 20 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67        ** Althoug
15040 68 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  h sqlite3VdbeSer
15050 69 61 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61  ialGet() may rea
15060 64 20 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65  d at most 8 byte
15070 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20  s from the.     
15080 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
15090 64 20 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69  d to it, debuggi
150a0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65  ng function Vdbe
150b0 4d 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29  MemPrettyPrint()
150c0 20 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65   may.      ** re
150d0 61 64 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20  ad up to 16. So 
150e0 31 36 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75  16 bytes of bogu
150f0 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70  s content is sup
15100 70 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  plied..      */.
15110 20 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20        static u8 
15120 61 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54  aZero[16];  /* T
15130 68 69 73 20 69 73 20 74 68 65 20 62 6f 67 75 73  his is the bogus
15140 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
15150 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
15160 69 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c  ialGet(aZero, t,
15170 20 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c   pDest);.    }el
15180 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
15190 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
151a0 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43  mBtree(pC->uc.pC
151b0 75 72 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70  ursor, aOffset[p
151c0 32 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b  2], len, pDest);
151d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
151e0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
151f0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
15200 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
15210 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
15220 63 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d  const u8*)pDest-
15230 3e 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20  >z, t, pDest);. 
15240 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67       pDest->flag
15250 73 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b  s &= ~MEM_Ephem;
15260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63  .    }.  }..op_c
15270 6f 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44  olumn_out:.  UPD
15280 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
15290 28 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53  (pDest);.  REGIS
152a0 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
152b0 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65  3, pDest);.  bre
152c0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
152d0 3a 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32  : Affinity P1 P2
152e0 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
152f0 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
15300 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70  P1@P2]).**.** Ap
15310 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74  ply affinities t
15320 6f 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20  o a range of P2 
15330 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
15340 6e 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a  ng with P1..**.*
15350 2a 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67  * P4 is a string
15360 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
15370 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65  acters long. The
15380 20 4e 2d 74 68 20 63 68 61 72 61 63 74 65 72 20   N-th character 
15390 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
153a0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
153b0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
153c0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
153d0 65 64 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 0a  ed for the N-th.
153e0 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  ** memory cell i
153f0 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a  n the range..*/.
15400 63 61 73 65 20 4f 50 5f 41 66 66 69 6e 69 74 79  case OP_Affinity
15410 3a 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  : {.  const char
15420 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 2f   *zAffinity;   /
15430 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
15440 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
15450 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20 70  .  zAffinity = p
15460 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65  Op->p4.z;.  asse
15470 72 74 28 20 7a 41 66 66 69 6e 69 74 79 21 3d 30  rt( zAffinity!=0
15480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
15490 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 61 73 73  p->p2>0 );.  ass
154a0 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79 5b 70  ert( zAffinity[p
154b0 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b 0a 20 20  Op->p2]==0 );.  
154c0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
154d0 2d 3e 70 31 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20  ->p1];.  do{.   
154e0 20 61 73 73 65 72 74 28 20 70 49 6e 31 20 3c 3d   assert( pIn1 <=
154f0 20 26 70 2d 3e 61 4d 65 6d 5b 28 70 2d 3e 6e 4d   &p->aMem[(p->nM
15500 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
15510 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r)] );.    asser
15520 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49  t( memIsValid(pI
15530 6e 31 29 20 29 3b 0a 20 20 20 20 61 70 70 6c 79  n1) );.    apply
15540 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 2a  Affinity(pIn1, *
15550 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20 65  (zAffinity++), e
15560 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 70 49  ncoding);.    pI
15570 6e 31 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  n1++;.  }while( 
15580 7a 41 66 66 69 6e 69 74 79 5b 30 5d 20 29 3b 0a  zAffinity[0] );.
15590 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
155a0 70 63 6f 64 65 3a 20 4d 61 6b 65 52 65 63 6f 72  pcode: MakeRecor
155b0 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
155c0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
155d0 33 5d 3d 6d 6b 72 65 63 28 72 5b 50 31 40 50 32  3]=mkrec(r[P1@P2
155e0 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  ]).**.** Convert
155f0 20 50 32 20 72 65 67 69 73 74 65 72 73 20 62 65   P2 registers be
15600 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 31 20  ginning with P1 
15610 69 6e 74 6f 20 74 68 65 20 5b 72 65 63 6f 72 64  into the [record
15620 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20 75 73 65 20   format].** use 
15630 61 73 20 61 20 64 61 74 61 20 72 65 63 6f 72 64  as a data record
15640 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   in a database t
15650 61 62 6c 65 20 6f 72 20 61 73 20 61 20 6b 65 79  able or as a key
15660 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e  .** in an index.
15670 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20    The OP_Column 
15680 6f 70 63 6f 64 65 20 63 61 6e 20 64 65 63 6f 64  opcode can decod
15690 65 20 74 68 65 20 72 65 63 6f 72 64 20 6c 61 74  e the record lat
156a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79  er..**.** P4 may
156b0 20 62 65 20 61 20 73 74 72 69 6e 67 20 74 68 61   be a string tha
156c0 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65  t is P2 characte
156d0 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20 4e 2d  rs long.  The N-
156e0 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  th character of 
156f0 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  the.** string in
15700 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75  dicates the colu
15710 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  mn affinity that
15720 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
15730 66 6f 72 20 74 68 65 20 4e 2d 74 68 0a 2a 2a 20  for the N-th.** 
15740 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
15750 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  ex key..**.** Th
15760 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 63  e mapping from c
15770 68 61 72 61 63 74 65 72 20 74 6f 20 61 66 66 69  haracter to affi
15780 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20 62 79  nity is given by
15790 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
157a0 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66 69 6e  .** macros defin
157b0 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
157c0 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  h..**.** If P4 i
157d0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 20  s NULL then all 
157e0 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68 61 76  index fields hav
157f0 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 42  e the affinity B
15800 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  LOB..*/.case OP_
15810 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a 20 20  MakeRecord: {.  
15820 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64 3b 20  u8 *zNewRecord; 
15830 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66         /* A buff
15840 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  er to hold the d
15850 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ata for the new 
15860 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
15870 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  *pRec;          
15880 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 65     /* The new re
15890 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20 6e 44  cord */.  u64 nD
158a0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
158b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
158c0 74 65 73 20 6f 66 20 64 61 74 61 20 73 70 61 63  tes of data spac
158d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b  e */.  int nHdr;
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
158f0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15900 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63 65   of header space
15910 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15930 44 61 74 61 20 73 70 61 63 65 20 72 65 71 75 69  Data space requi
15940 72 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 63  red for this rec
15950 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e 5a 65  ord */.  i64 nZe
15960 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ro;             
15970 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72  /* Number of zer
15980 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  o bytes at the e
15990 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
159a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 69 6e   */.  int nVarin
159b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
159c0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
159d0 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  in a varint */. 
159e0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
159f0 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20  ;       /* Type 
15a00 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a  field */.  Mem *
15a10 70 44 61 74 61 30 3b 20 20 20 20 20 20 20 20 20  pData0;         
15a20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65 6c 64    /* First field
15a30 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65 64 20   to be combined 
15a40 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72 64 20  into the record 
15a50 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73 74 3b  */.  Mem *pLast;
15a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15a70 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
15a80 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
15a90 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
15aa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15ab0 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72   fields in the r
15ac0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
15ad0 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20 20 20  *zAffinity;     
15ae0 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e 69 74    /* The affinit
15af0 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  y string for the
15b00 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
15b10 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20 20 20   file_format;   
15b20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d      /* File form
15b30 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20 65 6e  at to use for en
15b40 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
15b50 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15b60 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64     /* Space used
15b70 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b 5d   in zNewRecord[]
15b80 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
15b90 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
15ba0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73 65      /* Space use
15bb0 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64 5b  d in zNewRecord[
15bc0 5d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  ] content */.  u
15bd0 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
15be0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
15bf0 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  of a field */.. 
15c00 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65   /* Assuming the
15c10 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73   record contains
15c20 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65 20 72   N fields, the r
15c30 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c 6f 6f  ecord format loo
15c40 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69  ks.  ** like thi
15c50 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d 2d 2d  s:.  **.  ** ---
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68 64 72  -----.  ** | hdr
15cb0 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30 20 7c  -size | type 0 |
15cc0 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20 7c 20   type 1 | ... | 
15cd0 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74 61 30  type N-1 | data0
15ce0 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20 4e 2d   | ... | data N-
15cf0 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d 2d 2d  1 | .  ** ------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d40 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 61 74  --.  **.  ** Dat
15d50 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20 66 72  a(0) is taken fr
15d60 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  om register P1. 
15d70 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73 20 66   Data(1) comes f
15d80 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31 2b  rom register P1+
15d90 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20 66 6f  1.  ** and so fo
15da0 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  rth..  **.  ** E
15db0 61 63 68 20 74 79 70 65 20 66 69 65 6c 64 20 69  ach type field i
15dc0 73 20 61 20 76 61 72 69 6e 74 20 72 65 70 72 65  s a varint repre
15dd0 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65 72 69  senting the seri
15de0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 0a  al type of the .
15df0 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69    ** correspondi
15e00 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  ng data element 
15e10 28 73 65 65 20 73 71 6c 69 74 65 33 56 64 62 65  (see sqlite3Vdbe
15e20 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e 20 54  SerialType()). T
15e30 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69 7a 65  he.  ** hdr-size
15e40 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f 20 61   field is also a
15e50 20 76 61 72 69 6e 74 20 77 68 69 63 68 20 69 73   varint which is
15e60 20 74 68 65 20 6f 66 66 73 65 74 20 66 72 6f 6d   the offset from
15e70 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
15e80 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63 6f 72   ** of the recor
15e90 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20 2a 2f  d to data0..  */
15ea0 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20 20 20  .  nData = 0;   
15eb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15ec0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
15ed0 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48 64 72   space */.  nHdr
15ee0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
15ef0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15f00 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61 63  s of header spac
15f10 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d 20 30  e */.  nZero = 0
15f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
15f30 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65  ber of zero byte
15f40 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
15f50 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
15f60 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 31  nField = pOp->p1
15f70 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20 3d 20  ;.  zAffinity = 
15f80 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61 73 73  pOp->p4.z;.  ass
15f90 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 26 26  ert( nField>0 &&
15fa0 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f   pOp->p2>0 && pO
15fb0 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d 28 70  p->p2+nField<=(p
15fc0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
15fd0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 70 44  ursor)+1 );.  pD
15fe0 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e 46 69  ata0 = &aMem[nFi
15ff0 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  eld];.  nField =
16000 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c 61 73   pOp->p2;.  pLas
16010 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46 69 65  t = &pData0[nFie
16020 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f 66 6f  ld-1];.  file_fo
16030 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57 72 69  rmat = p->minWri
16040 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a 0a 20  teFileFormat;.. 
16050 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74 68 65   /* Identify the
16060 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
16070 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
16080 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20 7c 7c  p->p3<pOp->p1 ||
16090 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70   pOp->p3>=pOp->p
160a0 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 70  1+pOp->p2 );.  p
160b0 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
160c0 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74  >p3];.  memAbout
160d0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
160e0 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79 20 74  );..  /* Apply t
160f0 68 65 20 72 65 71 75 65 73 74 65 64 20 61 66 66  he requested aff
16100 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69 6e 70  inity to all inp
16110 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  uts.  */.  asser
16120 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73 74  t( pData0<=pLast
16130 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66 69 6e   );.  if( zAffin
16140 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65 63 20  ity ){.    pRec 
16150 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20 64 6f  = pData0;.    do
16160 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41 66 66  {.      applyAff
16170 69 6e 69 74 79 28 70 52 65 63 2b 2b 2c 20 2a 28  inity(pRec++, *(
16180 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20 65 6e  zAffinity++), en
16190 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 61  coding);.      a
161a0 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74 79  ssert( zAffinity
161b0 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63 3c 3d  [0]==0 || pRec<=
161c0 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d 77 68  pLast );.    }wh
161d0 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79 5b 30  ile( zAffinity[0
161e0 5d 20 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ] );.  }..#ifdef
161f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e   SQLITE_ENABLE_N
16200 55 4c 4c 5f 54 52 49 4d 0a 20 20 2f 2a 20 4e 55  ULL_TRIM.  /* NU
16210 4c 4c 73 20 63 61 6e 20 62 65 20 73 61 66 65 6c  LLs can be safel
16220 79 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  y trimmed from t
16230 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65  he end of the re
16240 63 6f 72 64 2c 20 61 73 20 6c 6f 6e 67 20 61 73  cord, as long as
16250 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 73 63 68  .  ** as the sch
16260 65 6d 61 20 66 6f 72 6d 61 74 20 69 73 20 32 20  ema format is 2 
16270 6f 72 20 6d 6f 72 65 20 61 6e 64 20 6e 6f 6e 65  or more and none
16280 20 6f 66 20 74 68 65 20 6f 6d 69 74 74 65 64 20   of the omitted 
16290 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2a 20 68 61 76  columns.  ** hav
162a0 65 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66  e a non-NULL def
162b0 61 75 6c 74 20 76 61 6c 75 65 2e 20 20 41 6c 73  ault value.  Als
162c0 6f 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6d 75  o, the record mu
162d0 73 74 20 62 65 20 6c 65 66 74 20 77 69 74 68 0a  st be left with.
162e0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
162f0 65 20 66 69 65 6c 64 2e 20 20 49 66 20 50 35 3e  e field.  If P5>
16300 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  0 then it will b
16310 65 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  e one more than 
16320 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  the.  ** index o
16330 66 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  f the right-most
16340 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 61 20 6e   column with a n
16350 6f 6e 2d 4e 55 4c 4c 20 64 65 66 61 75 6c 74 20  on-NULL default 
16360 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70  value */.  if( p
16370 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 77 68  Op->p5 ){.    wh
16380 69 6c 65 28 20 28 70 4c 61 73 74 2d 3e 66 6c 61  ile( (pLast->fla
16390 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
163a0 30 20 26 26 20 6e 46 69 65 6c 64 3e 70 4f 70 2d  0 && nField>pOp-
163b0 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 70 4c 61  >p5 ){.      pLa
163c0 73 74 2d 2d 3b 0a 20 20 20 20 20 20 6e 46 69 65  st--;.      nFie
163d0 6c 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ld--;.    }.  }.
163e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 6f  #endif..  /* Loo
163f0 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6c  p through the el
16400 65 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c 6c  ements that will
16410 20 6d 61 6b 65 20 75 70 20 74 68 65 20 72 65 63   make up the rec
16420 6f 72 64 20 74 6f 20 66 69 67 75 72 65 0a 20 20  ord to figure.  
16430 2a 2a 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  ** out how much 
16440 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
16450 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 72 65  d for the new re
16460 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 70 52 65  cord..  */.  pRe
16470 63 20 3d 20 70 4c 61 73 74 3b 0a 20 20 64 6f 7b  c = pLast;.  do{
16480 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
16490 49 73 56 61 6c 69 64 28 70 52 65 63 29 20 29 3b  IsValid(pRec) );
164a0 0a 20 20 20 20 70 52 65 63 2d 3e 75 54 65 6d 70  .    pRec->uTemp
164b0 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d   = serial_type =
164c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
164d0 61 6c 54 79 70 65 28 70 52 65 63 2c 20 66 69 6c  alType(pRec, fil
164e0 65 5f 66 6f 72 6d 61 74 2c 20 26 6c 65 6e 29 3b  e_format, &len);
164f0 0a 20 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66  .    if( pRec->f
16500 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
16510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 44 61  ){.      if( nDa
16520 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ta ){.        if
16530 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
16540 45 78 70 61 6e 64 42 6c 6f 62 28 70 52 65 63 29  ExpandBlob(pRec)
16550 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
16560 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16570 20 20 20 20 20 6e 5a 65 72 6f 20 2b 3d 20 70 52       nZero += pR
16580 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  ec->u.nZero;.   
16590 20 20 20 20 20 6c 65 6e 20 2d 3d 20 70 52 65 63       len -= pRec
165a0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
165b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 61   }.    }.    nDa
165c0 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 74  ta += len;.    t
165d0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
165e0 74 79 70 65 3d 3d 31 32 37 20 29 3b 0a 20 20 20  type==127 );.   
165f0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
16600 6c 5f 74 79 70 65 3d 3d 31 32 38 20 29 3b 0a 20  l_type==128 );. 
16610 20 20 20 6e 48 64 72 20 2b 3d 20 73 65 72 69 61     nHdr += seria
16620 6c 5f 74 79 70 65 3c 3d 31 32 37 20 3f 20 31 20  l_type<=127 ? 1 
16630 3a 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  : sqlite3VarintL
16640 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
16650 0a 20 20 20 20 69 66 28 20 70 52 65 63 3d 3d 70  .    if( pRec==p
16660 44 61 74 61 30 20 29 20 62 72 65 61 6b 3b 0a 20  Data0 ) break;. 
16670 20 20 20 70 52 65 63 2d 2d 3b 0a 20 20 7d 77 68     pRec--;.  }wh
16680 69 6c 65 28 31 29 3b 0a 0a 20 20 2f 2a 20 45 56  ile(1);..  /* EV
16690 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 35  IDENCE-OF: R-225
166a0 36 34 2d 31 31 36 34 37 20 54 68 65 20 68 65 61  64-11647 The hea
166b0 64 65 72 20 62 65 67 69 6e 73 20 77 69 74 68 20  der begins with 
166c0 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 0a  a single varint.
166d0 20 20 2a 2a 20 77 68 69 63 68 20 64 65 74 65 72    ** which deter
166e0 6d 69 6e 65 73 20 74 68 65 20 74 6f 74 61 6c 20  mines the total 
166f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16700 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 54  in the header. T
16710 68 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 76  he varint.  ** v
16720 61 6c 75 65 20 69 73 20 74 68 65 20 73 69 7a 65  alue is the size
16730 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 69   of the header i
16740 6e 20 62 79 74 65 73 20 69 6e 63 6c 75 64 69 6e  n bytes includin
16750 67 20 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e  g the size varin
16760 74 0a 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 2a  t.  ** itself. *
16770 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 48  /.  testcase( nH
16780 64 72 3d 3d 31 32 36 20 29 3b 0a 20 20 74 65 73  dr==126 );.  tes
16790 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 37  tcase( nHdr==127
167a0 20 29 3b 0a 20 20 69 66 28 20 6e 48 64 72 3c 3d   );.  if( nHdr<=
167b0 31 32 36 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  126 ){.    /* Th
167c0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
167d0 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 31 3b 0a  .    nHdr += 1;.
167e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
167f0 52 61 72 65 20 63 61 73 65 20 6f 66 20 61 20 72  Rare case of a r
16800 65 61 6c 6c 79 20 6c 61 72 67 65 20 68 65 61 64  eally large head
16810 65 72 20 2a 2f 0a 20 20 20 20 6e 56 61 72 69 6e  er */.    nVarin
16820 74 20 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e  t = sqlite3Varin
16830 74 4c 65 6e 28 6e 48 64 72 29 3b 0a 20 20 20 20  tLen(nHdr);.    
16840 6e 48 64 72 20 2b 3d 20 6e 56 61 72 69 6e 74 3b  nHdr += nVarint;
16850 0a 20 20 20 20 69 66 28 20 6e 56 61 72 69 6e 74  .    if( nVarint
16860 3c 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65  <sqlite3VarintLe
16870 6e 28 6e 48 64 72 29 20 29 20 6e 48 64 72 2b 2b  n(nHdr) ) nHdr++
16880 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
16890 6e 48 64 72 2b 6e 44 61 74 61 3b 0a 20 20 69 66  nHdr+nData;.  if
168a0 28 20 6e 42 79 74 65 2b 6e 5a 65 72 6f 3e 64 62  ( nByte+nZero>db
168b0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
168c0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b  LIMIT_LENGTH] ){
168d0 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69  .    goto too_bi
168e0 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  g;.  }..  /* Mak
168f0 65 20 73 75 72 65 20 74 68 65 20 6f 75 74 70 75  e sure the outpu
16900 74 20 72 65 67 69 73 74 65 72 20 68 61 73 20 61  t register has a
16910 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
16920 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20 0a 20  ough to store . 
16930 20 2a 2a 20 74 68 65 20 6e 65 77 20 72 65 63 6f   ** the new reco
16940 72 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20 72  rd. The output r
16950 65 67 69 73 74 65 72 20 28 70 4f 70 2d 3e 70 33  egister (pOp->p3
16960 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
16970 20 74 6f 0a 20 20 2a 2a 20 62 65 20 6f 6e 65 20   to.  ** be one 
16980 6f 66 20 74 68 65 20 69 6e 70 75 74 20 72 65 67  of the input reg
16990 69 73 74 65 72 73 20 28 62 65 63 61 75 73 65 20  isters (because 
169a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
169b0 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  ll to.  ** sqlit
169c0 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
169d0 64 52 65 73 69 7a 65 28 29 20 63 6f 75 6c 64 20  dResize() could 
169e0 63 6c 6f 62 62 65 72 20 74 68 65 20 76 61 6c 75  clobber the valu
169f0 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  e before it is u
16a00 73 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sed)..  */.  if(
16a10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
16a20 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4f  learAndResize(pO
16a30 75 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 29 20  ut, (int)nByte) 
16a40 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  ){.    goto no_m
16a50 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e 65 77 52 65  em;.  }.  zNewRe
16a60 63 6f 72 64 20 3d 20 28 75 38 20 2a 29 70 4f 75  cord = (u8 *)pOu
16a70 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  t->z;..  /* Writ
16a80 65 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  e the record */.
16a90 20 20 69 20 3d 20 70 75 74 56 61 72 69 6e 74 33    i = putVarint3
16aa0 32 28 7a 4e 65 77 52 65 63 6f 72 64 2c 20 6e 48  2(zNewRecord, nH
16ab0 64 72 29 3b 0a 20 20 6a 20 3d 20 6e 48 64 72 3b  dr);.  j = nHdr;
16ac0 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61  .  assert( pData
16ad0 30 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 70 52  0<=pLast );.  pR
16ae0 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 64  ec = pData0;.  d
16af0 6f 7b 0a 20 20 20 20 73 65 72 69 61 6c 5f 74 79  o{.    serial_ty
16b00 70 65 20 3d 20 70 52 65 63 2d 3e 75 54 65 6d 70  pe = pRec->uTemp
16b10 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
16b20 45 2d 4f 46 3a 20 52 2d 30 36 35 32 39 2d 34 37  E-OF: R-06529-47
16b30 33 36 32 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68  362 Following th
16b40 65 20 73 69 7a 65 20 76 61 72 69 6e 74 20 61 72  e size varint ar
16b50 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 20 20  e one or more.  
16b60 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
16b70 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 70 65 72  varints, one per
16b80 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 20 20   column. */.    
16b90 69 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  i += putVarint32
16ba0 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 69 5d 2c  (&zNewRecord[i],
16bb0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 20 20   serial_type);  
16bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 72            /* ser
16bd0 69 61 6c 20 74 79 70 65 20 2a 2f 0a 20 20 20 20  ial type */.    
16be0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
16bf0 52 2d 36 34 35 33 36 2d 35 31 37 32 38 20 54 68  R-64536-51728 Th
16c00 65 20 76 61 6c 75 65 73 20 66 6f 72 20 65 61 63  e values for eac
16c10 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  h column in the 
16c20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 69 6d  record.    ** im
16c30 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
16c40 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
16c50 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33      j += sqlite3
16c60 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 26 7a  VdbeSerialPut(&z
16c70 4e 65 77 52 65 63 6f 72 64 5b 6a 5d 2c 20 70 52  NewRecord[j], pR
16c80 65 63 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  ec, serial_type)
16c90 3b 20 2f 2a 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ; /* content */.
16ca0 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 52 65    }while( (++pRe
16cb0 63 29 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 61  c)<=pLast );.  a
16cc0 73 73 65 72 74 28 20 69 3d 3d 6e 48 64 72 20 29  ssert( i==nHdr )
16cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  ;.  assert( j==n
16ce0 42 79 74 65 20 29 3b 0a 0a 20 20 61 73 73 65 72  Byte );..  asser
16cf0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20  t( pOp->p3>0 && 
16d00 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p3<=(p->nMe
16d10 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
16d20 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d  ) );.  pOut->n =
16d30 20 28 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70   (int)nByte;.  p
16d40 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
16d50 5f 42 6c 6f 62 3b 0a 20 20 69 66 28 20 6e 5a 65  _Blob;.  if( nZe
16d60 72 6f 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  ro ){.    pOut->
16d70 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a 65 72 6f 3b  u.nZero = nZero;
16d80 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
16d90 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20   |= MEM_Zero;.  
16da0 7d 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  }.  REGISTER_TRA
16db0 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74  CE(pOp->p3, pOut
16dc0 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
16dd0 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
16de0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
16df0 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31 20  pcode: Count P1 
16e00 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
16e10 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75 6e  psis: r[P2]=coun
16e20 74 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  t().**.** Store 
16e30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
16e40 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67 65  tries (an intege
16e50 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65 20  r value) in the 
16e60 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 0a  table or index .
16e70 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75 72  ** opened by cur
16e80 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73 74  sor P1 in regist
16e90 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65 66  er P2.*/.#ifndef
16ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
16eb0 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50 5f  EECOUNT.case OP_
16ec0 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20  Count: {        
16ed0 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36   /* out2 */.  i6
16ee0 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43 75  4 nEntry;.  BtCu
16ef0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20 20  rsor *pCrsr;..  
16f00 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
16f10 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54  [pOp->p1]->eCurT
16f20 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
16f30 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20  EE );.  pCrsr = 
16f40 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
16f50 5d 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  ]->uc.pCursor;. 
16f60 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20 29   assert( pCrsr )
16f70 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20  ;.  nEntry = 0; 
16f80 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
16f90 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69   Only used to si
16fa0 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e  lence a warning.
16fb0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
16fc0 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43 72  e3BtreeCount(pCr
16fd0 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20 20  sr, &nEntry);.  
16fe0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
16ff0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
17000 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
17010 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
17020 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
17030 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61 6b   nEntry;.  break
17040 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f  ;.}.#endif../* O
17050 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e 74  pcode: Savepoint
17060 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
17070 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73 65  ** Open, release
17080 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   or rollback the
17090 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65 64   savepoint named
170a0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50 34   by parameter P4
170b0 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f  , depending.** o
170c0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
170d0 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65 77  1. To open a new
170e0 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d   savepoint, P1==
170f0 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28 63  0. To release (c
17100 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78 69  ommit) an.** exi
17110 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 2c  sting savepoint,
17120 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72 6f   P1==1, or to ro
17130 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74 69  llback an existi
17140 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31 3d  ng savepoint P1=
17150 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  =2..*/.case OP_S
17160 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69 6e  avepoint: {.  in
17170 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  t p1;           
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17190 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70 65   Value of P1 ope
171a0 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rand */.  char *
171b0 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
171c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
171d0 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20 2a  e of savepoint *
171e0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  /.  int nName;. 
171f0 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65 77   Savepoint *pNew
17200 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70  ;.  Savepoint *p
17210 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61 76  Savepoint;.  Sav
17220 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20 20  epoint *pTmp;.  
17230 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b 0a  int iSavepoint;.
17240 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31 20    int ii;..  p1 
17250 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e 61  = pOp->p1;.  zNa
17260 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  me = pOp->p4.z;.
17270 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
17280 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65 74  t the p1 paramet
17290 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c 73  er is valid. Als
172a0 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  o that if there 
172b0 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  is no open.  ** 
172c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
172d0 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20 62  n there cannot b
172e0 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
172f0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
17300 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  ( db->pSavepoint
17310 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  ==0 || db->autoC
17320 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73  ommit==0 );.  as
17330 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50 4f  sert( p1==SAVEPO
17340 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d 53  INT_BEGIN||p1==S
17350 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
17360 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ||p1==SAVEPOINT_
17370 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73  ROLLBACK );.  as
17380 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70  sert( db->pSavep
17390 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54 72  oint || db->isTr
173a0 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
173b0 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
173c0 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69 6e  t( checkSavepoin
173d0 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20 20  tCount(db) );.  
173e0 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
173f0 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 70  ader );..  if( p
17400 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
17410 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  IN ){.    if( db
17420 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29  ->nVdbeWrite>0 )
17430 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77  {.      /* A new
17440 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e 6f   savepoint canno
17450 74 20 62 65 20 63 72 65 61 74 65 64 20 69 66 20  t be created if 
17460 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
17470 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a   write .      **
17480 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e 65   statements (i.e
17490 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69 74  . open read/writ
174a0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  e incremental bl
174b0 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20 20  ob handles)..   
174c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
174d0 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
174e0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61 76  "cannot open sav
174f0 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74 61  epoint - SQL sta
17500 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
17510 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ess");.      rc 
17520 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17540 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
17550 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
17560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17570 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17580 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  E.      /* This 
17590 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e 20  call is Ok even 
175a0 69 66 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e  if this savepoin
175b0 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  t is actually a 
175c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
175d0 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 28    ** savepoint (
175e0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73 68  and therefore sh
175f0 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74 20  ould not prompt 
17600 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20 63 61  xSavepoint()) ca
17610 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20 20 2a  llbacks..      *
17620 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74  * If this is a t
17630 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
17640 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e 65  oint being opene
17650 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  d, it is guarant
17660 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  eed.      ** tha
17670 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  t the db->aVTran
17680 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65 6d 70  s[] array is emp
17690 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  ty.  */.      as
176a0 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f 43 6f  sert( db->autoCo
176b0 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
176c0 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20 20  VTrans==0 );.   
176d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
176e0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
176f0 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e   SAVEPOINT_BEGIN
17700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
17730 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
17740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17750 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
17760 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
17770 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ror;.#endif..   
17780 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
17790 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74 72  ew savepoint str
177a0 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20  ucture. */.     
177b0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
177c0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
177d0 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69 6e   sizeof(Savepoin
177e0 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  t)+nName+1);.   
177f0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
17800 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61         pNew->zNa
17810 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70 4e  me = (char *)&pN
17820 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ew[1];.        m
17830 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d  emcpy(pNew->zNam
17840 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b  e, zName, nName+
17850 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 20  1);.    .       
17860 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
17870 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74  no open transact
17880 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ion, then mark t
17890 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
178a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72 61  .        ** "tra
178b0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
178c0 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nt". */.        
178d0 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
178e0 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
178f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
17900 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
17910 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
17920 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20 20  avepoint = 1;.  
17930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17940 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
17950 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  point++;.       
17960 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
17970 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76 65  ink the new save
17980 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 64  point into the d
17990 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27 73  atabase handle's
179a0 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20   list. */.      
179b0 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
179c0 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a  db->pSavepoint;.
179d0 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61 76          db->pSav
179e0 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a 20  epoint = pNew;. 
179f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44 65         pNew->nDe
17a00 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62 2d  ferredCons = db-
17a10 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a  >nDeferredCons;.
17a20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44          pNew->nD
17a30 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
17a40 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
17a50 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 20  mCons;.      }. 
17a60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17a70 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 30    iSavepoint = 0
17a80 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
17a90 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f 69  he named savepoi
17aa0 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  nt. If there is 
17ab0 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  no such savepoin
17ac0 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20 2a  t, then an.    *
17ad0 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  * an error is re
17ae0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
17af0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  er.  */.    for(
17b00 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69 6e  .      pSavepoin
17b10 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  t = db->pSavepoi
17b20 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76 65  nt; .      pSave
17b30 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65 33  point && sqlite3
17b40 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f 69  StrICmp(pSavepoi
17b50 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  nt->zName, zName
17b60 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  );.      pSavepo
17b70 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  int = pSavepoint
17b80 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a 20  ->pNext.    ){. 
17b90 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 2b       iSavepoint+
17ba0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
17bb0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a   !pSavepoint ){.
17bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17bd0 65 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73 75  eError(p, "no su
17be0 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25 73  ch savepoint: %s
17bf0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
17c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
17c10 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OR;.    }else if
17c20 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
17c30 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f  >0 && p1==SAVEPO
17c40 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
17c50 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
17c60 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  t possible to re
17c70 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
17c80 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74 68   savepoint if th
17c90 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20 2a  ere are .      *
17ca0 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20 73  * active write s
17cb0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
17cc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
17cd0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63  3VdbeError(p, "c
17ce0 61 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20 73 61  annot release sa
17cf0 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20 20  vepoint - ".    
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65        "SQL state
17d20 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73  ments in progres
17d30 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s");.      rc = 
17d40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17d50 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 2f   }else{..      /
17d60 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
17d70 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20  her or not this 
17d80 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
17d90 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 73   savepoint. If s
17da0 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  o,.      ** and 
17db0 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41 53  this is a RELEAS
17dc0 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e 20  E command, then 
17dd0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
17de0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  saction .      *
17df0 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 20  * is committed. 
17e00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17e10 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69 6f  int isTransactio
17e20 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  n = pSavepoint->
17e30 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d 3e  pNext==0 && db->
17e40 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
17e50 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69 66  epoint;.      if
17e60 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20  ( isTransaction 
17e70 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  && p1==SAVEPOINT
17e80 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20  _RELEASE ){.    
17e90 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
17ea0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
17eb0 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f  (p, 1))!=SQLITE_
17ec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17ed0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
17ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17ef0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
17f00 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
17f10 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 48  if( sqlite3VdbeH
17f20 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f 42  alt(p)==SQLITE_B
17f30 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  USY ){.         
17f40 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70   p->pc = (int)(p
17f50 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20  Op - aOp);.     
17f60 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
17f70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
17f80 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20     p->rc = rc = 
17f90 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17fa0 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65         goto vdbe
17fb0 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20  _return;.       
17fc0 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 69   }.        db->i
17fd0 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65  sTransactionSave
17fe0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  point = 0;.     
17ff0 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20     rc = p->rc;. 
18000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18010 20 20 20 20 69 6e 74 20 69 73 53 63 68 65 6d 61      int isSchema
18020 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20 20  Change;.        
18030 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  iSavepoint = db-
18040 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69 53  >nSavepoint - iS
18050 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20 20  avepoint - 1;.  
18060 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53 41        if( p1==SA
18070 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
18080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
18090 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  SchemaChange = (
180a0 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44  db->mDbFlags & D
180b0 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
180c0 67 65 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  ge)!=0;.        
180d0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
180e0 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
180f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
18100 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
18110 41 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e 61  AllCursors(db->a
18120 44 62 5b 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20  Db[ii].pBt,.    
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f     SQLITE_ABORT_
18160 52 4f 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20  ROLLBACK,.      
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3d   isSchemaChange=
181a0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  =0);.           
181b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
181c0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
181d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
181e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
181f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18200 20 20 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67     isSchemaChang
18210 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
18220 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
18230 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  0; ii<db->nDb; i
18240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
18250 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18260 65 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61  eSavepoint(db->a
18270 44 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20  Db[ii].pBt, p1, 
18280 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
18290 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
182a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
182b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
182c0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
182d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
182e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
182f0 66 28 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67  f( isSchemaChang
18300 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
18310 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
18320 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
18330 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
18340 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
18350 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
18360 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
18370 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
18380 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
18390 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nge;.        }. 
183a0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
183b0 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
183c0 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 73   whether this is
183d0 20 61 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f   a RELEASE or RO
183e0 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 6f 79 20  LLBACK, destroy 
183f0 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73 61  all .      ** sa
18400 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 65 64 20  vepoints nested 
18410 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73 61  inside of the sa
18420 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70  vepoint being op
18430 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  erated on. */.  
18440 20 20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70      while( db->p
18450 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 61 76 65  Savepoint!=pSave
18460 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
18470 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76   pTmp = db->pSav
18480 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
18490 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
184a0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
184b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
184c0 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
184d0 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
184e0 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 7d  point--;.      }
184f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74  ..      /* If it
18500 20 69 73 20 61 20 52 45 4c 45 41 53 45 2c 20 74   is a RELEASE, t
18510 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68 65 20  hen destroy the 
18520 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
18530 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a 20 20 20  operated on .   
18540 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69 74     ** too. If it
18550 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54   is a ROLLBACK T
18560 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  O, then set the 
18570 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72  number of deferr
18580 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ed .      ** con
18590 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
185a0 6e 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ns present in th
185b0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
185c0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 20  e value stored. 
185d0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
185e0 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
185f0 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  reated.  */.    
18600 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
18610 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
18620 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18630 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70  Savepoint==db->p
18640 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
18650 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f       db->pSavepo
18660 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  int = pSavepoint
18670 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
18680 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18690 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b, pSavepoint);.
186a0 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 54          if( !isT
186b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
186c0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
186d0 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  epoint--;.      
186e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
186f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  .        db->nDe
18700 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 53 61  ferredCons = pSa
18710 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72  vepoint->nDeferr
18720 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20  edCons;.        
18730 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
18740 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e  Cons = pSavepoin
18750 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  t->nDeferredImmC
18760 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ons;.      }..  
18770 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73      if( !isTrans
18780 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d 53 41  action || p1==SA
18790 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
187a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
187b0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
187c0 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20 69 53  point(db, p1, iS
187d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
187e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
187f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
18800 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
18810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18820 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  }.  if( rc ) got
18830 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
18840 72 72 6f 72 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a  rror;..  break;.
18850 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75  }../* Opcode: Au
18860 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 50  toCommit P1 P2 P
18870 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20  3 * *.**.** Set 
18880 74 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74  the database aut
18890 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f  o-commit flag to
188a0 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66   P1 (1 or 0). If
188b0 20 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c   P2 is true, rol
188c0 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75  l.** back any cu
188d0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62  rrently active b
188e0 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
188f0 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  s. If there are 
18900 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d  any active.** VM
18910 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68  s (apart from th
18920 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20  is one), then a 
18930 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20  ROLLBACK fails. 
18940 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20   A COMMIT fails 
18950 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  if.** there are 
18960 61 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56  active writing V
18970 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73  Ms or active VMs
18980 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
18990 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
189a0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
189b0 61 75 73 65 73 20 74 68 65 20 56 4d 20 74 6f 20  auses the VM to 
189c0 68 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  halt..*/.case OP
189d0 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20  _AutoCommit: {. 
189e0 20 69 6e 74 20 64 65 73 69 72 65 64 41 75 74 6f   int desiredAuto
189f0 43 6f 6d 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52  Commit;.  int iR
18a00 6f 6c 6c 62 61 63 6b 3b 0a 0a 20 20 64 65 73 69  ollback;..  desi
18a10 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  redAutoCommit = 
18a20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 52 6f 6c 6c  pOp->p1;.  iRoll
18a30 62 61 63 6b 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  back = pOp->p2;.
18a40 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
18a50 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c  dAutoCommit==1 |
18a60 7c 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  | desiredAutoCom
18a70 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  mit==0 );.  asse
18a80 72 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43  rt( desiredAutoC
18a90 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20 69 52 6f 6c  ommit==1 || iRol
18aa0 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  lback==0 );.  as
18ab0 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75 74  sert( desiredAut
18ac0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 70 4f  oCommit==0 || pO
18ad0 70 2d 3e 70 33 3d 3d 30 20 29 3b 0a 20 20 61 73  p->p3==0 );.  as
18ae0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
18af0 63 74 69 76 65 3e 30 20 29 3b 20 20 2f 2a 20 41  ctive>0 );  /* A
18b00 74 20 6c 65 61 73 74 20 74 68 69 73 20 6f 6e 65  t least this one
18b10 20 56 4d 20 69 73 20 61 63 74 69 76 65 20 2a 2f   VM is active */
18b20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
18b30 73 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66  sReader );..  if
18b40 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
18b50 6d 69 74 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d  mit!=db->autoCom
18b60 6d 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20 69  mit ){.    if( i
18b70 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
18b80 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
18b90 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29  dAutoCommit==1 )
18ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18bb0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
18bc0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
18bd0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d  BACK);.      db-
18be0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
18bf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64  .    }else if( d
18c00 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
18c10 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
18c20 74 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  te>0 ){.      /*
18c30 20 49 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   If this instruc
18c40 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tion implements 
18c50 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 6f 74 68  a COMMIT and oth
18c60 65 72 20 56 4d 73 20 61 72 65 20 77 72 69 74 69  er VMs are writi
18c70 6e 67 0a 20 20 20 20 20 20 2a 2a 20 72 65 74 75  ng.      ** retu
18c80 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 64 69  rn an error indi
18c90 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
18ca0 6f 74 68 65 72 20 56 4d 73 20 6d 75 73 74 20 63  other VMs must c
18cb0 6f 6d 70 6c 65 74 65 20 66 69 72 73 74 2e 20 0a  omplete first. .
18cc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
18cd0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
18ce0 70 2c 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69  p, "cannot commi
18cf0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2d 20  t transaction - 
18d00 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
18d10 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
18d20 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70   statements in p
18d30 72 6f 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20  rogress");.     
18d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
18d50 59 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  Y;.      goto ab
18d60 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
18d70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18d80 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62  (rc = sqlite3Vdb
18d90 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21  eCheckFk(p, 1))!
18da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18db0 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
18dc0 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
18dd0 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43  .      db->autoC
18de0 6f 6d 6d 69 74 20 3d 20 28 75 38 29 64 65 73 69  ommit = (u8)desi
18df0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a 20  redAutoCommit;. 
18e00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18e10 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
18e20 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
18e30 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69        p->pc = (i
18e40 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
18e50 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
18e60 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d 64 65  mmit = (u8)(1-de
18e70 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 29  siredAutoCommit)
18e80 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  ;.      p->rc = 
18e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18ea0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62  ;.      goto vdb
18eb0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  e_return;.    }.
18ec0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
18ed0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
18ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  .    sqlite3Clos
18ef0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
18f00 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
18f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
18f30 4f 4e 45 3b 0a 20 20 20 20 20 20 64 62 2d 3e 72  ONE;.      db->r
18f40 65 61 64 6f 6e 6c 79 54 72 61 6e 73 20 3d 20 28  eadonlyTrans = (
18f50 70 4f 70 2d 3e 70 33 3d 3d 54 4b 5f 52 45 41 44  pOp->p3==TK_READ
18f60 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ONLY);.    }else
18f70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18f80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
18f90 0a 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  .    goto vdbe_r
18fa0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eturn;.  }else{.
18fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
18fc0 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20 20 20  rror(p,.        
18fd0 28 21 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  (!desiredAutoCom
18fe0 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73 74 61  mit)?"cannot sta
18ff0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
19000 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
19010 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20 20 20  ction":(.       
19020 20 28 69 52 6f 6c 6c 62 61 63 6b 29 3f 22 63 61   (iRollback)?"ca
19030 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20 2d 20  nnot rollback - 
19040 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  no transaction i
19050 73 20 61 63 74 69 76 65 22 3a 0a 20 20 20 20 20  s active":.     
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
19070 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d 20 6e  annot commit - n
19080 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  o transaction is
19090 20 61 63 74 69 76 65 22 29 29 3b 0a 20 20 20 20   active"));.    
190a0 20 20 20 20 20 0a 20 20 20 20 72 63 20 3d 20 53       .    rc = S
190b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
190c0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
190d0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to_error;.  }.  
190e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
190f0 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69 6f 6e  ode: Transaction
19100 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
19110 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  **.** Begin a tr
19120 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64 61 74  ansaction on dat
19130 61 62 61 73 65 20 50 31 20 69 66 20 61 20 74 72  abase P1 if a tr
19140 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
19150 20 61 6c 72 65 61 64 79 0a 2a 2a 20 61 63 74 69   already.** acti
19160 76 65 2e 0a 2a 2a 20 49 66 20 50 32 20 69 73 20  ve..** If P2 is 
19170 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
19180 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19190 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6f  on is started, o
191a0 72 20 69 66 20 61 20 0a 2a 2a 20 72 65 61 64 2d  r if a .** read-
191b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
191c0 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 69  lready active, i
191d0 74 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  t is upgraded to
191e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
191f0 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32 20 69  tion..** If P2 i
19200 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 72  s zero, then a r
19210 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
19220 69 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a  is started..**.*
19230 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64 65  * P1 is the inde
19240 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
19250 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63 68 20  e file on which 
19260 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19270 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e 20 20  is.** started.  
19280 49 6e 64 65 78 20 30 20 69 73 20 74 68 65 20 6d  Index 0 is the m
19290 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
192a0 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20 69 73  e and index 1 is
192b0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75 73 65   the.** file use
192c0 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
192d0 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63 65 73  tables.  Indices
192e0 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20 61 72   of 2 or more ar
192f0 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 74  e used for.** at
19300 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
19310 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69  ..**.** If a wri
19320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
19330 73 20 73 74 61 72 74 65 64 20 61 6e 64 20 74 68  s started and th
19340 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d 74 4a  e Vdbe.usesStmtJ
19350 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 0a 2a  ournal flag is.*
19360 2a 20 74 72 75 65 20 28 74 68 69 73 20 66 6c 61  * true (this fla
19370 67 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  g is set if the 
19380 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66 79 20  Vdbe may modify 
19390 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f  more than one ro
193a0 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74 68 72  w and may.** thr
193b0 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
193c0 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74 65 6d  ption), a statem
193d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
193e0 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70 65 6e  may also be open
193f0 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  ed..** More spec
19400 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74 61 74  ifically, a stat
19410 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19420 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66 66 20  n is opened iff 
19430 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
19440 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 75  connection is cu
19450 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e 20 61  rrently not in a
19460 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
19470 6f 72 20 69 66 20 74 68 65 72 65 20 61 72 65 20  or if there are 
19480 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76 65 20  other.** active 
19490 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20 73 74  statements. A st
194a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
194b0 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ion allows the c
194c0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
194d0 68 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f 20 62  his.** VDBE to b
194e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
194f0 74 65 72 20 61 6e 20 65 72 72 6f 72 20 77 69 74  ter an error wit
19500 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
19510 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
19520 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
19530 6f 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  on. If no error 
19540 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
19550 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
19560 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c  ansaction.** wil
19570 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
19580 63 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68 65 20  commit when the 
19590 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a 0a 2a  VDBE halts..**.*
195a0 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e 20  * If P5!=0 then 
195b0 74 68 69 73 20 6f 70 63 6f 64 65 20 61 6c 73 6f  this opcode also
195c0 20 63 68 65 63 6b 73 20 74 68 65 20 73 63 68 65   checks the sche
195d0 6d 61 20 63 6f 6f 6b 69 65 20 61 67 61 69 6e 73  ma cookie agains
195e0 74 20 50 33 0a 2a 2a 20 61 6e 64 20 74 68 65 20  t P3.** and the 
195f0 73 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f  schema generatio
19600 6e 20 63 6f 75 6e 74 65 72 20 61 67 61 69 6e 73  n counter agains
19610 74 20 50 34 2e 0a 2a 2a 20 54 68 65 20 63 6f 6f  t P4..** The coo
19620 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74 73 20  kie changes its 
19630 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72 20 74  value whenever t
19640 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
19650 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a 20 54  ma changes..** T
19660 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  his operation is
19670 20 75 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   used to detect 
19680 77 68 65 6e 20 74 68 61 74 20 74 68 65 20 63 6f  when that the co
19690 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67 65 64  okie has changed
196a0 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65  .** and that the
196b0 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
196c0 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61 64   needs to reread
196d0 20 74 68 65 20 73 63 68 65 6d 61 2e 20 20 49 66   the schema.  If
196e0 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 63   the schema.** c
196f0 6f 6f 6b 69 65 20 69 6e 20 50 33 20 64 69 66 66  ookie in P3 diff
19700 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 63 68  ers from the sch
19710 65 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20 74 68  ema cookie in th
19720 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
19730 72 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 20 73  r or.** if the s
19740 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69 6f 6e  chema generation
19750 20 63 6f 75 6e 74 65 72 20 69 6e 20 50 34 20 64   counter in P4 d
19760 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
19770 63 75 72 72 65 6e 74 0a 2a 2a 20 67 65 6e 65 72  current.** gener
19780 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 2c 20 74  ation counter, t
19790 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 53 43  hen an SQLITE_SC
197a0 48 45 4d 41 20 65 72 72 6f 72 20 69 73 20 72 61  HEMA error is ra
197b0 69 73 65 64 20 61 6e 64 20 65 78 65 63 75 74 69  ised and executi
197c0 6f 6e 0a 2a 2a 20 68 61 6c 74 73 2e 20 20 54 68  on.** halts.  Th
197d0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
197e0 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
197f0 6e 20 6d 69 67 68 74 20 74 68 65 6e 20 72 65 70  n might then rep
19800 72 65 70 61 72 65 20 74 68 65 0a 2a 2a 20 73 74  repare the.** st
19810 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 72 75  atement and reru
19820 6e 20 69 74 20 66 72 6f 6d 20 74 68 65 20 62 65  n it from the be
19830 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65  ginning..*/.case
19840 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a   OP_Transaction:
19850 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b   {.  Btree *pBt;
19860 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20  .  int iMeta;.  
19870 69 6e 74 20 69 47 65 6e 3b 0a 0a 20 20 61 73 73  int iGen;..  ass
19880 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
19890 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
198a0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c  ->readOnly==0 ||
198b0 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20   pOp->p2==0 );. 
198c0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
198d0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
198e0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
198f0 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
19900 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70  ->btreeMask, pOp
19910 2d 3e 70 31 29 20 29 3b 0a 20 20 69 66 28 20 70  ->p1) );.  if( p
19920 4f 70 2d 3e 70 32 20 26 26 20 28 64 62 2d 3e 66  Op->p2 && (db->f
19930 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75  lags & SQLITE_Qu
19940 65 72 79 4f 6e 6c 79 29 21 3d 30 20 29 7b 0a 20  eryOnly)!=0 ){. 
19950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
19960 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
19970 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
19980 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 42 74 20  rror;.  }.  pBt 
19990 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  = db->aDb[pOp->p
199a0 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28 20 70  1].pBt;..  if( p
199b0 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  Bt ){.    rc = s
199c0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
199d0 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70 2d 3e  Trans(pBt, pOp->
199e0 70 32 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  p2);.    testcas
199f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
19a00 53 59 5f 53 4e 41 50 53 48 4f 54 20 29 3b 0a 20  SY_SNAPSHOT );. 
19a10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
19a20 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  =SQLITE_BUSY_REC
19a30 4f 56 45 52 59 20 29 3b 0a 20 20 20 20 69 66 28  OVERY );.    if(
19a40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72 63 26  {.      if( (rc&
19a60 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xff)==SQLITE_BU
19a70 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  SY ){.        p-
19a80 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
19a90 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  - aOp);.        
19aa0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
19ab0 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65      goto vdbe_re
19ac0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
19ad0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
19ae0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
19af0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   }..    if( pOp-
19b00 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73 53 74  >p2 && p->usesSt
19b10 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 20  mtJournal .     
19b20 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  && (db->autoComm
19b30 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 56 64  it==0 || db->nVd
19b40 62 65 52 65 61 64 3e 31 29 20 0a 20 20 20 20 29  beRead>1) .    )
19b50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19b60 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
19b70 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a 20 20  Trans(pBt) );.  
19b80 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74 61 74      if( p->iStat
19b90 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ement==0 ){.    
19ba0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
19bb0 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20 26 26  nStatement>=0 &&
19bc0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e   db->nSavepoint>
19bd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  =0 );.        db
19be0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b 3b 20  ->nStatement++; 
19bf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53 74 61  .        p->iSta
19c00 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e 53 61  tement = db->nSa
19c10 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e 6e 53  vepoint + db->nS
19c20 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20 20 20  tatement;.      
19c30 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  }..      rc = sq
19c40 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
19c50 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
19c60 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74 61 74  _BEGIN, p->iStat
19c70 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20 20 20  ement-1);.      
19c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19c90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
19ca0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
19cb0 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70 2d 3e  ginStmt(pBt, p->
19cc0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20  iStatement);.   
19cd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
19ce0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
19cf0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
19d00 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
19d10 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
19d20 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  nt.      ** coun
19d30 74 65 72 2e 20 49 66 20 74 68 65 20 73 74 61 74  ter. If the stat
19d40 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19d50 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  n needs to be ro
19d60 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20 20 20  lled back,.     
19d70 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
19d80 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20 6e 65   this counter ne
19d90 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
19da0 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20 20 20  ed too.  */.    
19db0 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e    p->nStmtDefCon
19dc0 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
19dd0 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 70 2d 3e  dCons;.      p->
19de0 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 20  nStmtDefImmCons 
19df0 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  = db->nDeferredI
19e00 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 0a 20  mmCons;.    }.. 
19e10 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
19e20 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
19e30 6e 75 6d 62 65 72 20 66 6f 72 20 63 68 65 63 6b  number for check
19e40 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 49 4d 50 4c  ing:.    ** IMPL
19e50 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
19e60 2d 30 33 31 38 39 2d 35 31 31 33 35 20 41 73 20  -03189-51135 As 
19e70 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
19e80 6e 74 20 72 75 6e 73 2c 20 74 68 65 20 73 63 68  nt runs, the sch
19e90 65 6d 61 0a 20 20 20 20 2a 2a 20 76 65 72 73 69  ema.    ** versi
19ea0 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20 74 6f  on is checked to
19eb0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
19ec0 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20   schema has not 
19ed0 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
19ee0 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61  e.    ** SQL sta
19ef0 74 65 6d 65 6e 74 20 77 61 73 20 70 72 65 70 61  tement was prepa
19f00 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
19f10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
19f20 65 74 61 28 70 42 74 2c 20 42 54 52 45 45 5f 53  eta(pBt, BTREE_S
19f30 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 28  CHEMA_VERSION, (
19f40 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b 0a 20  u32 *)&iMeta);. 
19f50 20 20 20 69 47 65 6e 20 3d 20 64 62 2d 3e 61 44     iGen = db->aD
19f60 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68 65  b[pOp->p1].pSche
19f70 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 3b  ma->iGeneration;
19f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 47  .  }else{.    iG
19f90 65 6e 20 3d 20 69 4d 65 74 61 20 3d 20 30 3b 0a  en = iMeta = 0;.
19fa0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f    }.  assert( pO
19fb0 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d  p->p5==0 || pOp-
19fc0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33  >p4type==P4_INT3
19fd0 32 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  2 );.  if( pOp->
19fe0 70 35 20 26 26 20 28 69 4d 65 74 61 21 3d 70 4f  p5 && (iMeta!=pO
19ff0 70 2d 3e 70 33 20 7c 7c 20 69 47 65 6e 21 3d 70  p->p3 || iGen!=p
1a000 4f 70 2d 3e 70 34 2e 69 29 20 29 7b 0a 20 20 20  Op->p4.i) ){.   
1a010 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a020 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
1a030 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
1a040 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
1a050 28 64 62 2c 20 22 64 61 74 61 62 61 73 65 20 73  (db, "database s
1a060 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
1a070 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d");.    /* If t
1a080 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  he schema-cookie
1a090 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1a0a0 73 65 20 66 69 6c 65 20 6d 61 74 63 68 65 73 20  se file matches 
1a0b0 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20 20 20 20  the cookie .    
1a0c0 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68 20 74  ** stored with t
1a0d0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
1a0e0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1a0f0 68 65 20 73 63 68 65 6d 61 2c 20 64 6f 0a 20 20  he schema, do.  
1a100 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61 64 20    ** not reload 
1a110 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20  the schema from 
1a120 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a130 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1a140 20 49 66 20 76 69 72 74 75 61 6c 2d 74 61 62 6c   If virtual-tabl
1a150 65 73 20 61 72 65 20 69 6e 20 75 73 65 2c 20 74  es are in use, t
1a160 68 69 73 20 69 73 20 6e 6f 74 20 6a 75 73 74 20  his is not just 
1a170 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
1a180 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c 20 76  .    ** Often, v
1a190 2d 74 61 62 6c 65 73 20 73 74 6f 72 65 20 74 68  -tables store th
1a1a0 65 69 72 20 64 61 74 61 20 69 6e 20 6f 74 68 65  eir data in othe
1a1b0 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65 73 2c  r SQLite tables,
1a1c0 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 61 72   which.    ** ar
1a1d0 65 20 71 75 65 72 69 65 64 20 66 72 6f 6d 20 77  e queried from w
1a1e0 69 74 68 69 6e 20 78 4e 65 78 74 28 29 20 61 6e  ithin xNext() an
1a1f0 64 20 6f 74 68 65 72 20 76 2d 74 61 62 6c 65 20  d other v-table 
1a200 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 0a 20 20  methods using.  
1a210 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 71 75    ** prepared qu
1a220 65 72 69 65 73 2e 20 49 66 20 73 75 63 68 20 61  eries. If such a
1a230 20 71 75 65 72 79 20 69 73 20 6f 75 74 2d 6f 66   query is out-of
1a240 2d 64 61 74 65 2c 20 77 65 20 64 6f 20 6e 6f 74  -date, we do not
1a250 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 20   want to.    ** 
1a260 64 69 73 63 61 72 64 20 74 68 65 20 64 61 74 61  discard the data
1a270 62 61 73 65 20 73 63 68 65 6d 61 2c 20 61 73 20  base schema, as 
1a280 74 68 65 20 75 73 65 72 20 63 6f 64 65 20 69 6d  the user code im
1a290 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 0a 20  plementing the. 
1a2a0 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65 20 77 6f     ** v-table wo
1a2b0 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65 20 72  uld have to be r
1a2c0 65 61 64 79 20 66 6f 72 20 74 68 65 20 73 71 6c  eady for the sql
1a2d0 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74  ite3_vtab struct
1a2e0 75 72 65 20 69 74 73 65 6c 66 0a 20 20 20 20 2a  ure itself.    *
1a2f0 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  * to be invalida
1a300 74 65 64 20 77 68 65 6e 65 76 65 72 20 73 71 6c  ted whenever sql
1a310 69 74 65 33 5f 73 74 65 70 28 29 20 69 73 20 63  ite3_step() is c
1a320 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
1a330 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76 2d 74 61  n .    ** a v-ta
1a340 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20 20 20 20  ble method..    
1a350 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
1a360 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63 68  Db[pOp->p1].pSch
1a370 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
1a380 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a 20 20 20  ie!=iMeta ){.   
1a390 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f     sqlite3ResetO
1a3a0 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 70 4f 70  neSchema(db, pOp
1a3b0 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p1);.    }.   
1a3c0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
1a3d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a3e0 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20 20 69  _SCHEMA;.  }.  i
1a3f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
1a400 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
1a410 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
1a420 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f 6f 6b  Opcode: ReadCook
1a430 69 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  ie P1 P2 P3 * *.
1a440 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f 6b 69  **.** Read cooki
1a450 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72 6f 6d  e number P3 from
1a460 20 64 61 74 61 62 61 73 65 20 50 31 20 61 6e 64   database P1 and
1a470 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f 20 72   write it into r
1a480 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 50  egister P2..** P
1a490 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65  3==1 is the sche
1a4a0 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 33 3d  ma version.  P3=
1a4b0 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
1a4c0 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 33  se format..** P3
1a4d0 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d  ==3 is the recom
1a4e0 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63  mended pager cac
1a4f0 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73 6f 20  he size, and so 
1a500 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20 69 73  forth.  P1==0 is
1a510 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74  .** the main dat
1a520 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 50  abase file and P
1a530 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61 74 61  1==1 is the data
1a540 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 74  base file used t
1a550 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f  o store.** tempo
1a560 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  rary tables..**.
1a570 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1a580 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1a590 74 68 65 20 64 61 74 61 62 61 73 65 20 28 65 69  the database (ei
1a5a0 74 68 65 72 20 61 20 74 72 61 6e 73 61 63 74 69  ther a transacti
1a5b0 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 74  on.** must be st
1a5c0 61 72 74 65 64 20 6f 72 20 74 68 65 72 65 20 6d  arted or there m
1a5d0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
1a5e0 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a 2a 2a  ursor) before.**
1a5f0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
1a600 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
1a610 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  case OP_ReadCook
1a620 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ie: {           
1a630 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
1a640 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20 69 6e   int iMeta;.  in
1a650 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 43 6f  t iDb;.  int iCo
1a660 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  okie;..  assert(
1a670 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
1a680 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31  .  iDb = pOp->p1
1a690 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 4f  ;.  iCookie = pO
1a6a0 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28  p->p3;.  assert(
1a6b0 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54 45 5f   pOp->p3<SQLITE_
1a6c0 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a  N_BTREE_META );.
1a6d0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
1a6e0 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
1a6f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
1a700 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1a710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
1a720 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
1a730 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a 0a  eMask, iDb) );..
1a740 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
1a750 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44  tMeta(db->aDb[iD
1a760 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b 69 65 2c  b].pBt, iCookie,
1a770 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b   (u32 *)&iMeta);
1a780 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
1a790 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
1a7a0 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
1a7b0 69 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b 3b 0a  iMeta;.  break;.
1a7c0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
1a7d0 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50 33  tCookie P1 P2 P3
1a7e0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
1a7f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
1a800 75 65 20 50 33 20 69 6e 74 6f 20 63 6f 6f 6b 69  ue P3 into cooki
1a810 65 20 6e 75 6d 62 65 72 20 50 32 20 6f 66 20 64  e number P2 of d
1a820 61 74 61 62 61 73 65 20 50 31 2e 0a 2a 2a 20 50  atabase P1..** P
1a830 32 3d 3d 31 20 69 73 20 74 68 65 20 73 63 68 65  2==1 is the sche
1a840 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50 32 3d  ma version.  P2=
1a850 3d 32 20 69 73 20 74 68 65 20 64 61 74 61 62 61  =2 is the databa
1a860 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 50 32  se format..** P2
1a870 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63 6f 6d  ==3 is the recom
1a880 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63 61 63  mended pager cac
1a890 68 65 20 0a 2a 2a 20 73 69 7a 65 2c 20 61 6e 64  he .** size, and
1a8a0 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d   so forth.  P1==
1a8b0 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20 64 61  0 is the main da
1a8c0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1a8d0 50 31 3d 3d 31 20 69 73 20 74 68 65 20 0a 2a 2a  P1==1 is the .**
1a8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
1a8f0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d  sed to store tem
1a900 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a  porary tables..*
1a910 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
1a920 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1a930 65 64 20 62 65 66 6f 72 65 20 65 78 65 63 75 74  ed before execut
1a940 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e  ing this opcode.
1a950 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 74 43  .*/.case OP_SetC
1a960 6f 6f 6b 69 65 3a 20 7b 0a 20 20 44 62 20 2a 70  ookie: {.  Db *p
1a970 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  Db;.  assert( pO
1a980 70 2d 3e 70 32 3c 53 51 4c 49 54 45 5f 4e 5f 42  p->p2<SQLITE_N_B
1a990 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20 20 61  TREE_META );.  a
1a9a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1a9b0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
1a9c0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1a9d0 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
1a9e0 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
1a9f0 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p1) );.  assert(
1aa00 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
1aa10 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
1aa20 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
1aa30 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
1aa40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1aa50 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1aa60 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f 70 2d  texHeld(db, pOp-
1aa70 3e 70 31 2c 20 30 29 20 29 3b 0a 20 20 2f 2a 20  >p1, 0) );.  /* 
1aa80 53 65 65 20 6e 6f 74 65 20 61 62 6f 75 74 20 69  See note about i
1aa90 6e 64 65 78 20 73 68 69 66 74 69 6e 67 20 6f 6e  ndex shifting on
1aaa0 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 20 2a   OP_ReadCookie *
1aab0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1aac0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1aad0 70 44 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70  pDb->pBt, pOp->p
1aae0 32 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 69  2, pOp->p3);.  i
1aaf0 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52 45  f( pOp->p2==BTRE
1ab00 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
1ab10 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
1ab20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1ab30 65 20 63 68 61 6e 67 65 73 2c 20 72 65 63 6f 72  e changes, recor
1ab40 64 20 74 68 65 20 6e 65 77 20 63 6f 6f 6b 69 65  d the new cookie
1ab50 20 69 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20   internally */. 
1ab60 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d     pDb->pSchema-
1ab70 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d  >schema_cookie =
1ab80 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 64 62   pOp->p3;.    db
1ab90 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
1aba0 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
1abb0 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  e;.  }else if( p
1abc0 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 46 49  Op->p2==BTREE_FI
1abd0 4c 45 5f 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20  LE_FORMAT ){.   
1abe0 20 2f 2a 20 52 65 63 6f 72 64 20 63 68 61 6e 67   /* Record chang
1abf0 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 66  es in the file f
1ac00 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 70 44 62  ormat */.    pDb
1ac10 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
1ac20 66 6f 72 6d 61 74 20 3d 20 70 4f 70 2d 3e 70 33  format = pOp->p3
1ac30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
1ac40 3e 70 31 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  >p1==1 ){.    /*
1ac50 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
1ac60 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1ac70 6e 74 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  nts whenever the
1ac80 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 0a 20   TEMP database. 
1ac90 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20     ** schema is 
1aca0 63 68 61 6e 67 65 64 2e 20 20 54 69 63 6b 65 74  changed.  Ticket
1acb0 20 23 31 36 34 34 20 2a 2f 0a 20 20 20 20 73 71   #1644 */.    sq
1acc0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
1acd0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
1ace0 29 3b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  );.    p->expire
1acf0 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  d = 0;.  }.  if(
1ad00 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1ad10 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1ad20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65   break;.}..#ifde
1ad30 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f  f SQLITE_SERVER_
1ad40 45 44 49 54 49 4f 4e 0a 2f 2a 20 4f 70 63 6f 64  EDITION./* Opcod
1ad50 65 3a 20 46 72 65 65 6c 69 73 74 46 6d 74 20 50  e: FreelistFmt P
1ad60 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
1ad70 2a 20 50 61 72 61 6d 65 74 65 72 20 50 33 20 6d  * Parameter P3 m
1ad80 75 73 74 20 62 65 20 30 2c 20 31 20 6f 72 20 32  ust be 0, 1 or 2
1ad90 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 30  . If it is not 0
1ada0 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74  , attempt to set
1adb0 20 74 68 65 0a 2a 2a 20 66 72 65 65 6c 69 73 74   the.** freelist
1adc0 20 66 6f 72 6d 61 74 20 6f 66 20 64 61 74 61 62   format of datab
1add0 61 73 65 20 50 31 20 74 6f 20 66 6f 72 6d 61 74  ase P1 to format
1ade0 20 31 20 6f 72 20 66 6f 72 6d 61 74 20 32 2e 20   1 or format 2. 
1adf0 42 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  Before.** return
1ae00 69 6e 67 2c 20 73 74 6f 72 65 20 74 68 65 20 66  ing, store the f
1ae10 69 6e 61 6c 20 66 72 65 65 6c 69 73 74 20 66 6f  inal freelist fo
1ae20 72 6d 61 74 20 28 65 69 74 68 65 72 20 31 20 6f  rmat (either 1 o
1ae30 72 20 32 29 20 6f 66 20 0a 2a 2a 20 64 61 74 61  r 2) of .** data
1ae40 62 61 73 65 20 50 31 20 69 6e 74 6f 20 72 65 67  base P1 into reg
1ae50 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
1ae60 65 20 4f 50 5f 46 72 65 65 6c 69 73 74 46 6d 74  e OP_FreelistFmt
1ae70 3a 20 7b 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a  : {  /* out2 */.
1ae80 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 6e 74    Db *pDb;.  int
1ae90 20 69 56 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74   iVal;..  assert
1aea0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1aeb0 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20  pOp->p1<db->nDb 
1aec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
1aed0 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
1aee0 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29  Mask, pOp->p1) )
1aef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1af00 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
1af10 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  ld(db, pOp->p1, 
1af20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
1af30 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b  b->aDb[pOp->p1];
1af40 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
1af50 70 42 74 21 3d 30 20 29 3b 0a 0a 20 20 70 4f 75  pBt!=0 );..  pOu
1af60 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
1af70 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 72 63  se(p, pOp);.  rc
1af80 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
1af90 72 65 65 6c 69 73 74 46 6f 72 6d 61 74 28 70 44  reelistFormat(pD
1afa0 62 2d 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 33 2c  b->pBt, pOp->p3,
1afb0 20 26 69 56 61 6c 29 3b 0a 20 20 69 66 28 20 72   &iVal);.  if( r
1afc0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
1afd0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70  ue_to_error;.  p
1afe0 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 56 61 6c 3b  Out->u.i = iVal;
1aff0 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ..  break;.}.#en
1b000 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
1b010 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50  OpenRead P1 P2 P
1b020 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
1b030 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62  sis: root=P2 iDb
1b040 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  =P3.**.** Open a
1b050 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1b060 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  r for the databa
1b070 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72  se table whose r
1b080 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a 20 50  oot page is.** P
1b090 32 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20  2 in a database 
1b0a0 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74 61 62  file.  The datab
1b0b0 61 73 65 20 66 69 6c 65 20 69 73 20 64 65 74 65  ase file is dete
1b0c0 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20 0a 2a  rmined by P3. .*
1b0d0 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20 74 68  * P3==0 means th
1b0e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
1b0f0 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65   P3==1 means the
1b100 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20 66   database used f
1b110 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  or .** temporary
1b120 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50 33 3e   tables, and P3>
1b130 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74 68 65  1 means used the
1b140 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
1b150 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74 61 62  ttached.** datab
1b160 61 73 65 2e 20 20 47 69 76 65 20 74 68 65 20 6e  ase.  Give the n
1b170 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69 64 65  ew cursor an ide
1b180 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20 20  ntifier of P1.  
1b190 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75 65 73  The P1.** values
1b1a0 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e   need not be con
1b1b0 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c 6c 20  tiguous but all 
1b1c0 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c 64  P1 values should
1b1d0 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65   be small intege
1b1e0 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  rs..** It is an 
1b1f0 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74 6f 20  error for P1 to 
1b200 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  be negative..**.
1b210 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e  ** If P5!=0 then
1b220 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   use the content
1b230 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
1b240 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  as the root page
1b250 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76 61 6c  , not.** the val
1b260 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c 66 2e  ue of P2 itself.
1b270 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77 69 6c  .**.** There wil
1b280 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  l be a read lock
1b290 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b2a0 20 77 68 65 6e 65 76 65 72 20 74 68 65 72 65 20   whenever there 
1b2b0 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75  is an.** open cu
1b2c0 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20 64 61  rsor.  If the da
1b2d0 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c 6f 63  tabase was unloc
1b2e0 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ked prior to thi
1b2f0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
1b300 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   then a read loc
1b310 6b 20 69 73 20 61 63 71 75 69 72 65 64 20 61 73  k is acquired as
1b320 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 69 6e   part of this in
1b330 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20 72 65  struction.  A re
1b340 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77  ad.** lock allow
1b350 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  s other processe
1b360 73 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61  s to read the da
1b370 74 61 62 61 73 65 20 62 75 74 20 70 72 6f 68 69  tabase but prohi
1b380 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74 68 65  bits.** any othe
1b390 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20 6d  r process from m
1b3a0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64 61 74  odifying the dat
1b3b0 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 61 64  abase.  The read
1b3c0 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65 6c 65   lock is.** rele
1b3d0 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20 63 75  ased when all cu
1b3e0 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64  rsors are closed
1b3f0 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73 74 72  .  If this instr
1b400 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 0a  uction attempts.
1b410 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65 61 64  ** to get a read
1b420 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c 73 2c   lock but fails,
1b430 20 74 68 65 20 73 63 72 69 70 74 20 74 65 72 6d   the script term
1b440 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e 0a 2a  inates with an.*
1b450 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  * SQLITE_BUSY er
1b460 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1b470 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1b480 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1b490 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1b4a0 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1b4b0 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1b4c0 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1b4d0 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1b4e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1b4f0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
1b500 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73  ure, then said s
1b510 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73  tructure defines
1b520 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64   the content and
1b530 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73   collating .** s
1b540 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69  equence of the i
1b550 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65  ndex being opene
1b560 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1b570 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65   P4 is an intege
1b580 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20  r .** value, it 
1b590 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1b5a0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1b5b0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1b5c0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4f 70  .** See also: Op
1b5d0 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65 6e 49  enWrite, ReopenI
1b5e0 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  dx.*/./* Opcode:
1b5f0 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20 50 32   ReopenIdx P1 P2
1b600 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1b610 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1b620 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Db=P3.**.** The 
1b630 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64 65  ReopenIdx opcode
1b640 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c   works exactly l
1b650 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65 78 63  ike ReadOpen exc
1b660 65 70 74 20 74 68 61 74 20 69 74 20 66 69 72 73  ept that it firs
1b670 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73  t.** checks to s
1b680 65 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ee if the cursor
1b690 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65 61 64   on P1 is alread
1b6a0 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20 72 6f  y open with a ro
1b6b0 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  ot page.** numbe
1b6c0 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66 20 69  r of P2 and if i
1b6d0 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f 64 65  t is this opcode
1b6e0 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70   becomes a no-op
1b6f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1b700 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  s,.** if the cur
1b710 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
1b720 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65 6f 70  pen, do not reop
1b730 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  en it..**.** The
1b740 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64   ReopenIdx opcod
1b750 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
1b760 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20 61 6e  ed with P5==0 an
1b770 64 20 77 69 74 68 20 50 34 20 62 65 69 6e 67 0a  d with P4 being.
1b780 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46 4f 20  ** a P4_KEYINFO 
1b790 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68 65 72  object.  Further
1b7a0 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76 61 6c  more, the P3 val
1b7b0 75 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ue must be the s
1b7c0 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72 79 20  ame as.** every 
1b7d0 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64 78 20  other ReopenIdx 
1b7e0 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f 72 20  or OpenRead for 
1b7f0 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
1b800 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 65  number..**.** Se
1b810 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64 20 6f  e the OpenRead o
1b820 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74  pcode documentat
1b830 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
1b840 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1b850 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  */./* Opcode: Op
1b860 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50 33  enWrite P1 P2 P3
1b870 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
1b880 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d  is: root=P2 iDb=
1b890 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P3.**.** Open a 
1b8a0 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
1b8b0 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68  r named P1 on th
1b8c0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1b8d0 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70   whose root.** p
1b8e0 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69  age is P2.  Or i
1b8f0 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20  f P5!=0 use the 
1b900 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
1b910 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74  ter P2 to find t
1b920 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  he.** root page.
1b930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  .**.** The P4 va
1b940 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  lue may be eithe
1b950 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34  r an integer (P4
1b960 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69  _INT32) or a poi
1b970 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79  nter to.** a Key
1b980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28  Info structure (
1b990 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20  P4_KEYINFO). If 
1b9a0 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  it is a pointer 
1b9b0 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  to a KeyInfo .**
1b9c0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
1b9d0 20 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20   said structure 
1b9e0 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
1b9f0 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
1ba00 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
1ba10 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1ba20 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77  g opened. Otherw
1ba30 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e  ise, if P4 is an
1ba40 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c   integer .** val
1ba50 75 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f  ue, it is set to
1ba60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1ba70 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
1ba80 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a  ble, or to the.*
1ba90 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20  * largest index 
1baa0 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66  of any column of
1bab0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1bac0 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  is actually used
1bad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
1bae0 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a  truction works j
1baf0 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61  ust like OpenRea
1bb00 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  d except that it
1bb10 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f   opens the curso
1bb20 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69  r.** in read/wri
1bb30 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20  te mode.  For a 
1bb40 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65  given table, the
1bb50 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72  re can be one or
1bb60 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   more read-only.
1bb70 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20  ** cursors or a 
1bb80 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74  single read/writ
1bb90 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74  e cursor but not
1bba0 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   both..**.** See
1bbb0 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a   also OpenRead..
1bbc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f 70 65  */.case OP_Reope
1bbd0 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20 6e 46  nIdx: {.  int nF
1bbe0 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ield;.  KeyInfo 
1bbf0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
1bc00 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a   p2;.  int iDb;.
1bc10 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20    int wrFlag;.  
1bc20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64 62  Btree *pX;.  Vdb
1bc30 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
1bc40 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
1bc50 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
1bc60 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c  || pOp->p5==OPFL
1bc70 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61  AG_SEEKEQ );.  a
1bc80 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
1bc90 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29  pe==P4_KEYINFO )
1bca0 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70  ;.  pCur = p->ap
1bcb0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1bcc0 69 66 28 20 70 43 75 72 20 26 26 20 70 43 75 72  if( pCur && pCur
1bcd0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75 33 32  ->pgnoRoot==(u32
1bce0 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20  )pOp->p2 ){.    
1bcf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 44  assert( pCur->iD
1bd00 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20 20 20  b==pOp->p3 );   
1bd10 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65 65 64     /* Guaranteed
1bd20 20 62 79 20 74 68 65 20 63 6f 64 65 20 67 65 6e   by the code gen
1bd30 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 67 6f  erator */.    go
1bd40 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73  to open_cursor_s
1bd50 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a 20 20  et_hints;.  }.  
1bd60 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1bd70 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1bd80 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f 70 65  y open or is ope
1bd90 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n on a different
1bda0 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
1bdb0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  n fall through i
1bdc0 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  nto OP_OpenRead 
1bdd0 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f 70 65  to force a reope
1bde0 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  n */.case OP_Ope
1bdf0 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f  nRead:.case OP_O
1be00 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61 73 73  penWrite:..  ass
1be10 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
1be20 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c  ==OP_OpenWrite |
1be30 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20  | pOp->p5==0 || 
1be40 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f  pOp->p5==OPFLAG_
1be50 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65  SEEKEQ );.  asse
1be60 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
1be70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1be80 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
1be90 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d 3e 6f  enRead || pOp->o
1bea0 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70 65 6e  pcode==OP_Reopen
1beb0 49 64 78 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  Idx.          ||
1bec0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
1bed0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  );..  if( p->exp
1bee0 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  ired ){.    rc =
1bef0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
1bf00 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f 74 6f  LLBACK;.    goto
1bf10 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1bf20 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65  ror;.  }..  nFie
1bf30 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e  ld = 0;.  pKeyIn
1bf40 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70  fo = 0;.  p2 = p
1bf50 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20  Op->p2;.  iDb = 
1bf60 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
1bf70 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
1bf80 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
1bf90 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
1bfa0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
1bfb0 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  Db) );.  pDb = &
1bfc0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
1bfd0 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  pX = pDb->pBt;. 
1bfe0 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1bff0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
1c000 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74  ode==OP_OpenWrit
1c010 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1c020 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
1c030 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  E==BTREE_FORDELE
1c040 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c 61 67  TE );.    wrFlag
1c050 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52 20 7c   = BTREE_WRCSR |
1c060 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
1c070 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b 0a 20  AG_FORDELETE);. 
1c080 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1c090 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1c0a0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
1c0b0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
1c0c0 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1c0d0 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at < p->minWrite
1c0e0 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20  FileFormat ){.  
1c0f0 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46      p->minWriteF
1c100 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d  ileFormat = pDb-
1c110 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1c120 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ormat;.    }.  }
1c130 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61 67  else{.    wrFlag
1c140 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1c150 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
1c160 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20 20 20  _P2ISREG ){.    
1c170 61 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a  assert( p2>0 );.
1c180 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d      assert( p2<=
1c190 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
1c1a0 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
1c1b0 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pIn2 = &aMem[p2]
1c1c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1c1d0 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29 20 29  mIsValid(pIn2) )
1c1e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1c1f0 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
1c200 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20 20  _Int)!=0 );.    
1c210 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c220 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a  tegerify(pIn2);.
1c230 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29 70 49      p2 = (int)pI
1c240 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20  n2->u.i;.    /* 
1c250 54 68 65 20 70 32 20 76 61 6c 75 65 20 61 6c 77  The p2 value alw
1c260 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ays comes from a
1c270 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61 74 65   prior OP_Create
1c280 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61 6e 64  Table opcode and
1c290 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 63  .    ** that opc
1c2a0 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ode will always 
1c2b0 73 65 74 20 74 68 65 20 70 32 20 76 61 6c 75 65  set the p2 value
1c2c0 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72   to 2 or more or
1c2d0 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20 20   else fail..    
1c2e0 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  ** If there were
1c2f0 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20   a failure, the 
1c300 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1c310 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20 68 61  nt would have ha
1c320 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lted.    ** befo
1c330 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  re reaching this
1c340 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f   instruction. */
1c350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
1c360 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =2 );.  }.  if( 
1c370 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1c380 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
1c390 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1c3a0 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
1c3b0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1c3c0 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29  ->enc==ENC(db) )
1c3d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b  ;.    assert( pK
1c3e0 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29  eyInfo->db==db )
1c3f0 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70  ;.    nField = p
1c400 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1c410 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c420 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  d;.  }else if( p
1c430 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
1c440 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65  NT32 ){.    nFie
1c450 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
1c460 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f    }.  assert( pO
1c470 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73  p->p1>=0 );.  as
1c480 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20  sert( nField>=0 
1c490 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
1c4a0 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20  Field==0 );  /* 
1c4b0 54 61 62 6c 65 20 77 69 74 68 20 49 4e 54 45 47  Table with INTEG
1c4c0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ER PRIMARY KEY a
1c4d0 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20  nd nothing else 
1c4e0 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f  */.  pCur = allo
1c4f0 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1c500 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69  p->p1, nField, i
1c510 44 62 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45  Db, CURTYPE_BTRE
1c520 45 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d  E);.  if( pCur==
1c530 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1c540 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  .  pCur->nullRow
1c550 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73   = 1;.  pCur->is
1c560 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 70  Ordered = 1;.  p
1c570 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1c580 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p2;.#ifdef SQLIT
1c590 45 5f 44 45 42 55 47 0a 20 20 70 43 75 72 2d 3e  E_DEBUG.  pCur->
1c5a0 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
1c5b0 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73  .#endif.  rc = s
1c5c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c5d0 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67  r(pX, p2, wrFlag
1c5e0 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1c5f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1c600 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1c610 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a  = pKeyInfo;.  /*
1c620 20 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72   Set the VdbeCur
1c630 73 6f 72 2e 69 73 54 61 62 6c 65 20 76 61 72 69  sor.isTable vari
1c640 61 62 6c 65 2e 20 50 72 65 76 69 6f 75 73 20 76  able. Previous v
1c650 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20  ersions of.  ** 
1c660 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63  SQLite used to c
1c670 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74  heck if the root
1c680 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65 72 65  -page flags were
1c690 20 73 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f   sane at this po
1c6a0 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70  int.  ** and rep
1c6b0 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
1c6c0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20  ruption if they 
1c6d0 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68  were not, but th
1c6e0 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a  is check has.  *
1c6f0 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e  * since moved in
1c700 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  to the btree lay
1c710 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72  er.  */  .  pCur
1c720 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d  ->isTable = pOp-
1c730 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49  >p4type!=P4_KEYI
1c740 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f  NFO;..open_curso
1c750 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61  r_set_hints:.  a
1c760 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 42 55  ssert( OPFLAG_BU
1c770 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c  LKCSR==BTREE_BUL
1c780 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73 65 72  KLOAD );.  asser
1c790 74 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  t( OPFLAG_SEEKEQ
1c7a0 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
1c7b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1c7c0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
1c7d0 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66 64 65  BULKCSR );.#ifde
1c7e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c7f0 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74  CURSOR_HINTS.  t
1c800 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
1c810 20 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51   & OPFLAG_SEEKEQ
1c820 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c   );.#endif.  sql
1c830 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
1c840 69 6e 74 46 6c 61 67 73 28 70 43 75 72 2d 3e 75  intFlags(pCur->u
1c850 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20  c.pCursor,.     
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e            (pOp->
1c880 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c  p5 & (OPFLAG_BUL
1c890 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b  KCSR|OPFLAG_SEEK
1c8a0 45 51 29 29 29 3b 0a 20 20 69 66 28 20 72 63 20  EQ)));.  if( rc 
1c8b0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1c8c0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1c8d0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1c8e0 3a 20 4f 70 65 6e 44 75 70 20 50 31 20 50 32 20  : OpenDup P1 P2 
1c8f0 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  * * *.**.** Open
1c900 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31   a new cursor P1
1c910 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
1c920 74 68 65 20 73 61 6d 65 20 65 70 68 65 6d 65 72  the same ephemer
1c930 61 6c 20 74 61 62 6c 65 20 61 73 0a 2a 2a 20 63  al table as.** c
1c940 75 72 73 6f 72 20 50 32 2e 20 20 54 68 65 20 50  ursor P2.  The P
1c950 32 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  2 cursor must ha
1c960 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  ve been opened b
1c970 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
1c980 6e 45 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 6f 70  nEphemeral.** op
1c990 63 6f 64 65 2e 20 20 4f 6e 6c 79 20 65 70 68 65  code.  Only ephe
1c9a0 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20 6d 61  meral cursors ma
1c9b0 79 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 2e  y be duplicated.
1c9c0 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
1c9d0 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f   ephemeral curso
1c9e0 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  rs are used for 
1c9f0 73 65 6c 66 2d 6a 6f 69 6e 73 20 6f 66 20 6d 61  self-joins of ma
1ca00 74 65 72 69 61 6c 69 7a 65 64 20 76 69 65 77 73  terialized views
1ca10 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ..*/.case OP_Ope
1ca20 6e 44 75 70 3a 20 7b 0a 20 20 56 64 62 65 43 75  nDup: {.  VdbeCu
1ca30 72 73 6f 72 20 2a 70 4f 72 69 67 3b 20 20 20 20  rsor *pOrig;    
1ca40 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
1ca50 63 75 72 73 6f 72 20 74 6f 20 62 65 20 64 75 70  cursor to be dup
1ca60 6c 69 63 61 74 65 64 20 2a 2f 0a 20 20 56 64 62  licated */.  Vdb
1ca70 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 20 20 20  eCursor *pCx;   
1ca80 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 63 75     /* The new cu
1ca90 72 73 6f 72 20 2a 2f 0a 0a 20 20 70 4f 72 69 67  rsor */..  pOrig
1caa0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
1cab0 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p2];.  assert( 
1cac0 70 4f 72 69 67 2d 3e 70 42 74 78 21 3d 30 20 29  pOrig->pBtx!=0 )
1cad0 3b 20 20 2f 2a 20 4f 6e 6c 79 20 65 70 68 65 6d  ;  /* Only ephem
1cae0 65 72 61 6c 20 63 75 72 73 6f 72 73 20 63 61 6e  eral cursors can
1caf0 20 62 65 20 64 75 70 6c 69 63 61 74 65 64 20 2a   be duplicated *
1cb00 2f 0a 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63  /..  pCx = alloc
1cb10 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70  ateCursor(p, pOp
1cb20 2d 3e 70 31 2c 20 70 4f 72 69 67 2d 3e 6e 46 69  ->p1, pOrig->nFi
1cb30 65 6c 64 2c 20 2d 31 2c 20 43 55 52 54 59 50 45  eld, -1, CURTYPE
1cb40 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70  _BTREE);.  if( p
1cb50 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1cb60 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1cb70 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1cb80 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b  isEphemeral = 1;
1cb90 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f  .  pCx->pKeyInfo
1cba0 20 3d 20 70 4f 72 69 67 2d 3e 70 4b 65 79 49 6e   = pOrig->pKeyIn
1cbb0 66 6f 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62  fo;.  pCx->isTab
1cbc0 6c 65 20 3d 20 70 4f 72 69 67 2d 3e 69 73 54 61  le = pOrig->isTa
1cbd0 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ble;.  rc = sqli
1cbe0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1cbf0 4f 72 69 67 2d 3e 70 42 74 78 2c 20 4d 41 53 54  Orig->pBtx, MAST
1cc00 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45 5f 57  ER_ROOT, BTREE_W
1cc10 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20 20  RCSR,.          
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 70  pCx->pKeyInfo, p
1cc40 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  Cx->uc.pCursor);
1cc50 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
1cc60 33 42 74 72 65 65 43 75 72 73 6f 72 28 29 20 72  3BtreeCursor() r
1cc70 6f 75 74 69 6e 65 20 63 61 6e 20 6f 6e 6c 79 20  outine can only 
1cc80 66 61 69 6c 20 66 6f 72 20 74 68 65 20 66 69 72  fail for the fir
1cc90 73 74 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 6f  st cursor.  ** o
1cca0 70 65 6e 65 64 20 66 6f 72 20 61 20 64 61 74 61  pened for a data
1ccb0 62 61 73 65 2e 20 20 53 69 6e 63 65 20 74 68 65  base.  Since the
1ccc0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1ccd0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 68 65   open cursor whe
1cce0 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f 70 63 6f  n this.  ** opco
1ccf0 64 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 73  de is run, the s
1cd00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1cd10 72 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  r() cannot fail 
1cd20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  */.  assert( rc=
1cd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cd40 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70  break;.}.../* Op
1cd50 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68 65 6d 65  code: OpenEpheme
1cd60 72 61 6c 20 50 31 20 50 32 20 2a 20 50 34 20 50  ral P1 P2 * P4 P
1cd70 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e  5.** Synopsis: n
1cd80 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20  Column=P2.**.** 
1cd90 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f  Open a new curso
1cda0 72 20 50 31 20 74 6f 20 61 20 74 72 61 6e 73 69  r P1 to a transi
1cdb0 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ent table..** Th
1cdc0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1cdd0 79 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  ys opened read/w
1cde0 72 69 74 65 20 65 76 65 6e 20 69 66 20 0a 2a 2a  rite even if .**
1cdf0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1ce00 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  se is read-only.
1ce10 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 0a    The ephemeral.
1ce20 2a 2a 20 74 61 62 6c 65 20 69 73 20 64 65 6c 65  ** table is dele
1ce30 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
1ce40 79 20 77 68 65 6e 20 74 68 65 20 63 75 72 73 6f  y when the curso
1ce50 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  r is closed..**.
1ce60 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d  ** P2 is the num
1ce70 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
1ce80 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
1ce90 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75  table..** The cu
1cea0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
1ceb0 20 42 54 72 65 65 20 74 61 62 6c 65 20 69 66 20   BTree table if 
1cec0 50 34 3d 3d 30 20 61 6e 64 20 74 6f 20 61 20 42  P4==0 and to a B
1ced0 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a 20 69 66  Tree index.** if
1cee0 20 50 34 20 69 73 20 6e 6f 74 20 30 2e 20 20 49   P4 is not 0.  I
1cef0 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f P4 is not NULL
1cf00 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  , it points to a
1cf10 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1cf20 72 65 0a 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  re.** that defin
1cf30 65 73 20 74 68 65 20 66 6f 72 6d 61 74 20 6f 66  es the format of
1cf40 20 6b 65 79 73 20 69 6e 20 74 68 65 20 69 6e 64   keys in the ind
1cf50 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35  ex..**.** The P5
1cf60 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62   parameter can b
1cf70 65 20 61 20 6d 61 73 6b 20 6f 66 20 74 68 65 20  e a mask of the 
1cf80 42 54 52 45 45 5f 2a 20 66 6c 61 67 73 20 64 65  BTREE_* flags de
1cf90 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62 74 72 65  fined.** in btre
1cfa0 65 2e 68 2e 20 20 54 68 65 73 65 20 66 6c 61 67  e.h.  These flag
1cfb0 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70 65 63 74  s control aspect
1cfc0 73 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 69  s of the operati
1cfd0 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 62 74 72  on of.** the btr
1cfe0 65 65 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4f  ee.  The BTREE_O
1cff0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
1d000 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 66 6c 61  BTREE_SINGLE fla
1d010 67 73 20 61 72 65 0a 2a 2a 20 61 64 64 65 64 20  gs are.** added 
1d020 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
1d030 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  /./* Opcode: Ope
1d040 6e 41 75 74 6f 69 6e 64 65 78 20 50 31 20 50 32  nAutoindex P1 P2
1d050 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
1d060 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a  sis: nColumn=P2.
1d070 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1d080 65 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65  e works the same
1d090 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   as OP_OpenEphem
1d0a0 65 72 61 6c 2e 20 20 49 74 20 68 61 73 20 61 0a  eral.  It has a.
1d0b0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 6e 61 6d  ** different nam
1d0c0 65 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68  e to distinguish
1d0d0 20 69 74 73 20 75 73 65 2e 20 20 54 61 62 6c 65   its use.  Table
1d0e0 73 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a  s created using.
1d0f0 2a 2a 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ** by this opcod
1d100 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
1d110 6f 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  or automatically
1d120 20 63 72 65 61 74 65 64 20 74 72 61 6e 73 69 65   created transie
1d130 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73 20 69 6e  nt.** indices in
1d140 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20   joins..*/.case 
1d150 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78  OP_OpenAutoindex
1d160 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 45  : .case OP_OpenE
1d170 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20 20 56 64  phemeral: {.  Vd
1d180 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 20  beCursor *pCx;. 
1d190 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1d1a0 66 6f 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f  fo;..  static co
1d1b0 6e 73 74 20 69 6e 74 20 76 66 73 46 6c 61 67 73  nst int vfsFlags
1d1c0 20 3d 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45   = .      SQLITE
1d1d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1d1e0 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d1f0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
1d200 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1d210 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
1d220 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1d230 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1d240 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1d250 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a 20 20 61  RANSIENT_DB;.  a
1d260 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1d270 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1d280 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70  Op->p2>=0 );.  p
1d290 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  Cx = allocateCur
1d2a0 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
1d2b0 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52  pOp->p2, -1, CUR
1d2c0 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69  TYPE_BTREE);.  i
1d2d0 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f  f( pCx==0 ) goto
1d2e0 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e   no_mem;.  pCx->
1d2f0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70  nullRow = 1;.  p
1d300 43 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20  Cx->isEphemeral 
1d310 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
1d320 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
1d330 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
1d340 43 78 2d 3e 70 42 74 78 2c 20 0a 20 20 20 20 20  Cx->pBtx, .     
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 20 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f     BTREE_OMIT_JO
1d370 55 52 4e 41 4c 20 7c 20 42 54 52 45 45 5f 53 49  URNAL | BTREE_SI
1d380 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70 35 2c 20  NGLE | pOp->p5, 
1d390 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  vfsFlags);.  if(
1d3a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d3b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d3c0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1d3d0 73 28 70 43 78 2d 3e 70 42 74 78 2c 20 31 29 3b  s(pCx->pBtx, 1);
1d3e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d3f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d400 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e  /* If a transien
1d410 74 20 69 6e 64 65 78 20 69 73 20 72 65 71 75 69  t index is requi
1d420 72 65 64 2c 20 63 72 65 61 74 65 20 69 74 20 62  red, create it b
1d430 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a  y calling.    **
1d440 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1d450 61 74 65 54 61 62 6c 65 28 29 20 77 69 74 68 20  ateTable() with 
1d460 74 68 65 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  the BTREE_BLOBKE
1d470 59 20 66 6c 61 67 20 62 65 66 6f 72 65 0a 20 20  Y flag before.  
1d480 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 69 74 2e    ** opening it.
1d490 20 49 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20   If a transient 
1d4a0 74 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65  table is require
1d4b0 64 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 0a  d, just use the.
1d4c0 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1d4d0 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 61 62  ally created tab
1d4e0 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d4f0 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54  e 1 (an BLOB_INT
1d500 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20 20 20 20  KEY table)..    
1d510 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 78 2d  */.    if( (pCx-
1d520 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1d530 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
1d540 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29 7b 0a 20  KeyInfo)!=0 ){. 
1d550 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
1d560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
1d570 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
1d580 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 72 63  INFO );.      rc
1d590 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1d5a0 72 65 61 74 65 54 61 62 6c 65 28 70 43 78 2d 3e  reateTable(pCx->
1d5b0 70 42 74 78 2c 20 26 70 67 6e 6f 2c 20 42 54 52  pBtx, &pgno, BTR
1d5c0 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20 70 4f 70  EE_BLOBKEY | pOp
1d5d0 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20 20 69 66  ->p5); .      if
1d5e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d5f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d600 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f  t( pgno==MASTER_
1d610 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20 20 20 20  ROOT+1 );.      
1d620 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1d630 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1d640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
1d650 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43  eyInfo->enc==ENC
1d660 28 64 62 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (db) );.        
1d670 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1d680 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74  eCursor(pCx->pBt
1d690 78 2c 20 70 67 6e 6f 2c 20 42 54 52 45 45 5f 57  x, pgno, BTREE_W
1d6a0 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20 20  RCSR,.          
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2c 20        pKeyInfo, 
1d6d0 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  pCx->uc.pCursor)
1d6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d6f0 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 30  pCx->isTable = 0
1d700 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1d720 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  treeCursor(pCx->
1d730 70 42 74 78 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  pBtx, MASTER_ROO
1d740 54 2c 20 42 54 52 45 45 5f 57 52 43 53 52 2c 0a  T, BTREE_WRCSR,.
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
1d770 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
1d780 29 3b 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73  );.      pCx->is
1d790 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  Table = 1;.    }
1d7a0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
1d7b0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1d7c0 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 78 2d 3e  o_error;.  pCx->
1d7d0 69 73 4f 72 64 65 72 65 64 20 3d 20 28 70 4f 70  isOrdered = (pOp
1d7e0 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55 4e 4f 52  ->p5!=BTREE_UNOR
1d7f0 44 45 52 45 44 29 3b 0a 20 20 62 72 65 61 6b 3b  DERED);.  break;
1d800 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
1d810 6f 72 74 65 72 4f 70 65 6e 20 50 31 20 50 32 20  orterOpen P1 P2 
1d820 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  P3 P4 *.**.** Th
1d830 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
1d840 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65  like OP_OpenEphe
1d850 6d 65 72 61 6c 20 65 78 63 65 70 74 20 74 68 61  meral except tha
1d860 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a 20 61 20  t it opens.** a 
1d870 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
1d880 74 68 61 74 20 69 73 20 73 70 65 63 69 66 69 63  that is specific
1d890 61 6c 6c 79 20 64 65 73 69 67 6e 65 64 20 74 6f  ally designed to
1d8a0 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a 2a 20 74   sort large.** t
1d8b0 61 62 6c 65 73 20 75 73 69 6e 67 20 61 6e 20 65  ables using an e
1d8c0 78 74 65 72 6e 61 6c 20 6d 65 72 67 65 2d 73 6f  xternal merge-so
1d8d0 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a  rt algorithm..**
1d8e0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1d8f0 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P3 is non-zero, 
1d900 74 68 65 6e 20 69 74 20 69 6e 64 69 63 61 74 65  then it indicate
1d910 73 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 65  s that the sorte
1d920 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75 6d 65 20  r may.** assume 
1d930 74 68 61 74 20 61 20 73 74 61 62 6c 65 20 73 6f  that a stable so
1d940 72 74 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  rt considering t
1d950 68 65 20 66 69 72 73 74 20 50 33 20 66 69 65 6c  he first P3 fiel
1d960 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a 20 6b 65  ds of each.** ke
1d970 79 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  y is sufficient 
1d980 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 72  to produce the r
1d990 65 71 75 69 72 65 64 20 72 65 73 75 6c 74 73 2e  equired results.
1d9a0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
1d9b0 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  erOpen: {.  Vdbe
1d9c0 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20  Cursor *pCx;..  
1d9d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
1d9e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d9f0 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20  pOp->p2>=0 );.  
1da00 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75  pCx = allocateCu
1da10 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c  rsor(p, pOp->p1,
1da20 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20 43 55   pOp->p2, -1, CU
1da30 52 54 59 50 45 5f 53 4f 52 54 45 52 29 3b 0a 20  RTYPE_SORTER);. 
1da40 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67 6f   if( pCx==0 ) go
1da50 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78  to no_mem;.  pCx
1da60 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70  ->pKeyInfo = pOp
1da70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
1da80 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b   assert( pCx->pK
1da90 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29  eyInfo->db==db )
1daa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  ;.  assert( pCx-
1dab0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d  >pKeyInfo->enc==
1dac0 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 72 63 20  ENC(db) );.  rc 
1dad0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
1dae0 74 65 72 49 6e 69 74 28 64 62 2c 20 70 4f 70 2d  terInit(db, pOp-
1daf0 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >p3, pCx);.  if(
1db00 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
1db10 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1db20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1db30 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65 54 65  code: SequenceTe
1db40 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  st P1 P2 * * *.*
1db50 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 28 20  * Synopsis: if( 
1db60 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b  cursor[P1].ctr++
1db70 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a   ) pc = P2.**.**
1db80 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72 20   P1 is a sorter 
1db90 63 75 72 73 6f 72 2e 20 49 66 20 74 68 65 20 73  cursor. If the s
1dba0 65 71 75 65 6e 63 65 20 63 6f 75 6e 74 65 72 20  equence counter 
1dbb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72  is currently zer
1dbc0 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f 20 50 32  o, jump.** to P2
1dbd0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
1dbe0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1dbf0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
1dc00 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a  , increment the.
1dc10 2a 2a 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  ** the sequence 
1dc20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  value..*/.case O
1dc30 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74 3a 20  P_SequenceTest: 
1dc40 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
1dc50 70 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  pC;.  assert( pO
1dc60 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1dc70 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1dc80 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1dc90 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1dca0 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70  sert( isSorter(p
1dcb0 43 29 20 29 3b 0a 20 20 69 66 28 20 28 70 43 2d  C) );.  if( (pC-
1dcc0 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20  >seqCount++)==0 
1dcd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
1dce0 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
1dcf0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
1dd00 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f 20 50 31  e: OpenPseudo P1
1dd10 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
1dd20 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f 6c 75 6d  nopsis: P3 colum
1dd30 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a  ns in r[P2].**.*
1dd40 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75 72  * Open a new cur
1dd50 73 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  sor that points 
1dd60 74 6f 20 61 20 66 61 6b 65 20 74 61 62 6c 65 20  to a fake table 
1dd70 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1dd80 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66  single.** row of
1dd90 20 64 61 74 61 2e 20 20 54 68 65 20 63 6f 6e 74   data.  The cont
1dda0 65 6e 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ent of that one 
1ddb0 72 6f 77 20 69 73 20 74 68 65 20 63 6f 6e 74 65  row is the conte
1ddc0 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nt of memory.** 
1ddd0 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 6e  register P2.  In
1dde0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 63 75   other words, cu
1ddf0 72 73 6f 72 20 50 31 20 62 65 63 6f 6d 65 73 20  rsor P1 becomes 
1de00 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
1de10 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f   .** MEM_Blob co
1de20 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e 65 64 20  ntent contained 
1de30 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
1de40 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64 6f 2d 74  **.** A pseudo-t
1de50 61 62 6c 65 20 63 72 65 61 74 65 64 20 62 79 20  able created by 
1de60 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75  this opcode is u
1de70 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 73 69  sed to hold a si
1de80 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f 75 74 70  ngle.** row outp
1de90 75 74 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  ut from the sort
1dea0 65 72 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  er so that the r
1deb0 6f 77 20 63 61 6e 20 62 65 20 64 65 63 6f 6d 70  ow can be decomp
1dec0 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64  osed into.** ind
1ded0 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 73 20  ividual columns 
1dee0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 43 6f 6c  using the OP_Col
1def0 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  umn opcode.  The
1df00 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1df10 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f 6e 6c 79  e.** is the only
1df20 20 63 75 72 73 6f 72 20 6f 70 63 6f 64 65 20 74   cursor opcode t
1df30 68 61 74 20 77 6f 72 6b 73 20 77 69 74 68 20 61  hat works with a
1df40 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a   pseudo-table..*
1df50 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68 65 20 6e  *.** P3 is the n
1df60 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1df70 69 6e 20 74 68 65 20 72 65 63 6f 72 64 73 20 74  in the records t
1df80 68 61 74 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  hat will be stor
1df90 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 73 65  ed by.** the pse
1dfa0 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  udo-table..*/.ca
1dfb0 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  se OP_OpenPseudo
1dfc0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1dfd0 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65 72 74   *pCx;..  assert
1dfe0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a  ( pOp->p1>=0 );.
1dff0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e000 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d 20  3>=0 );.  pCx = 
1e010 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70  allocateCursor(p
1e020 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
1e030 70 33 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f  p3, -1, CURTYPE_
1e040 50 53 45 55 44 4f 29 3b 0a 20 20 69 66 28 20 70  PSEUDO);.  if( p
1e050 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1e060 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1e070 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1e080 75 63 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65  uc.pseudoTableRe
1e090 67 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70  g = pOp->p2;.  p
1e0a0 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b  Cx->isTable = 1;
1e0b0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1e0c0 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65 61 6b  p5==0 );.  break
1e0d0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1e0e0 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a 20 2a  Close P1 * * * *
1e0f0 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  .**.** Close a c
1e100 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73 6c 79  ursor previously
1e110 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e 20 20   opened as P1.  
1e120 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20  If P1 is not.** 
1e130 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1e140 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
1e150 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1e160 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b  case OP_Close: {
1e170 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1e180 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1e190 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
1e1a0 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1e1b0 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
1e1c0 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  sr[pOp->p1]);.  
1e1d0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1e1e0 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a  ] = 0;.  break;.
1e1f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e200 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
1e210 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f  SED_MASK./* Opco
1e220 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65 64 20  de: ColumnsUsed 
1e230 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a  P1 * * P4 *.**.*
1e240 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 28 77  * This opcode (w
1e250 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73 74 73  hich only exists
1e260 20 69 66 20 53 51 4c 69 74 65 20 77 61 73 20 63   if SQLite was c
1e270 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20  ompiled with.** 
1e280 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
1e290 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 29 20  LUMN_USED_MASK) 
1e2a0 69 64 65 6e 74 69 66 69 65 73 20 77 68 69 63 68  identifies which
1e2b0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 0a   columns of the.
1e2c0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
1e2d0 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 20  x for cursor P1 
1e2e0 61 72 65 20 75 73 65 64 2e 20 20 50 34 20 69 73  are used.  P4 is
1e2f0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1e300 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34 29 20  r.** (P4_INT64) 
1e310 69 6e 20 77 68 69 63 68 20 74 68 65 20 66 69 72  in which the fir
1e320 73 74 20 36 33 20 62 69 74 73 20 61 72 65 20 6f  st 63 bits are o
1e330 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ne for each of t
1e340 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33 20 63  he.** first 63 c
1e350 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1e360 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
1e370 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  t are actually u
1e380 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  sed.** by the cu
1e390 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67 68 2d  rsor.  The high-
1e3a0 6f 72 64 65 72 20 62 69 74 20 69 73 20 73 65 74  order bit is set
1e3b0 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 61   if any column a
1e3c0 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34 74 68  fter.** the 64th
1e3d0 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63 61 73   is used..*/.cas
1e3e0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  e OP_ColumnsUsed
1e3f0 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  : {.  VdbeCursor
1e400 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70 2d 3e   *pC;.  pC = p->
1e410 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1e420 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
1e430 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
1e440 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d 3e 6d  BTREE );.  pC->m
1e450 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36 34 2a  askUsed = *(u64*
1e460 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20  )pOp->p4.pI64;. 
1e470 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
1e480 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  ../* Opcode: See
1e490 6b 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20  kGE P1 P2 P3 P4 
1e4a0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
1e4b0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
1e4c0 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72  * If cursor P1 r
1e4d0 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20  efers to an SQL 
1e4e0 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68  table (B-Tree th
1e4f0 61 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20  at uses integer 
1e500 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74  keys), .** use t
1e510 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
1e520 73 74 65 72 20 50 33 20 61 73 20 74 68 65 20 6b  ster P3 as the k
1e530 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72 20 50  ey.  If cursor P
1e540 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1e550 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1e560 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1e570 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1e580 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1e590 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1e5a0 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1e5b0 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1e5c0 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1e5d0 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1e5e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1e5f0 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1e600 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1e610 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1e620 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c  l to the key val
1e630 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1e640 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20   no records .** 
1e650 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1e660 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1e670 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1e680 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1e690 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o P2..**.** If t
1e6a0 68 65 20 63 75 72 73 6f 72 20 50 31 20 77 61 73  he cursor P1 was
1e6b0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68   opened using th
1e6c0 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20  e OPFLAG_SEEKEQ 
1e6d0 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a  flag, then this.
1e6e0 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61  ** opcode will a
1e6f0 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20  lways land on a 
1e700 72 65 63 6f 72 64 20 74 68 61 74 20 65 71 75 61  record that equa
1e710 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b  lly equals the k
1e720 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a  ey, or.** else j
1e730 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
1e740 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65  to P2.  When the
1e750 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41   cursor is OPFLA
1e760 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a  G_SEEKEQ, this.*
1e770 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65  * opcode must be
1e780 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
1e790 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 74  IdxLE opcode wit
1e7a0 68 20 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d  h the same argum
1e7b0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78  ents..** The Idx
1e7c0 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  LE opcode will b
1e7d0 65 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69  e skipped if thi
1e7e0 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64  s opcode succeed
1e7f0 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64  s, but the.** Id
1e800 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  xLE opcode will 
1e810 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65  be used on subse
1e820 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61  quent loop itera
1e830 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
1e840 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
1e850 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69  the cursor confi
1e860 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e  gured to move in
1e870 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a   forward order,.
1e880 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  ** from the begi
1e890 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  nning toward the
1e8a0 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20   end.  In other 
1e8b0 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f  words, the curso
1e8c0 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  r is.** configur
1e8d0 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20  ed to use Next, 
1e8e0 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20  not Prev..**.** 
1e8f0 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1e900 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c   NotFound, SeekL
1e910 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 4c  t, SeekGt, SeekL
1e920 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  e.*/./* Opcode: 
1e930 53 65 65 6b 47 54 20 50 31 20 50 32 20 50 33 20  SeekGT P1 P2 P3 
1e940 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  P4 *.** Synopsis
1e950 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
1e960 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50  *.** If cursor P
1e970 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53  1 refers to an S
1e980 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65  QL table (B-Tree
1e990 20 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67   that uses integ
1e9a0 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73  er keys), .** us
1e9b0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  e the value in r
1e9c0 65 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20  egister P3 as a 
1e9d0 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50  key. If cursor P
1e9e0 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20  1 refers .** to 
1e9f0 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68  an SQL index, th
1ea00 65 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72  en P3 is the fir
1ea10 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  st in an array o
1ea20 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a  f P4 registers .
1ea30 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ** that are used
1ea40 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20   as an unpacked 
1ea50 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a  index key. .**.*
1ea60 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72  * Reposition cur
1ea70 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20  sor P1 so that  
1ea80 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1ea90 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72 79 20   smallest entry 
1eaa0 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72 65 61  that .** is grea
1eab0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ter than the key
1eac0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1ead0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1eae0 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1eaf0 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20   the key and P2 
1eb00 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
1eb10 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
1eb20 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1eb30 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
1eb40 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
1eb50 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20  move in forward 
1eb60 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
1eb70 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77  he beginning tow
1eb80 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e  ard the end.  In
1eb90 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1eba0 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
1ebb0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
1ebc0 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e   Next, not Prev.
1ebd0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1ebe0 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1ebf0 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 65  , SeekLt, SeekGe
1ec00 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1ec10 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20 50 31  pcode: SeekLT P1
1ec20 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a 2a 20   P2 P3 P4 * .** 
1ec30 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1ec40 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1ec50 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ec60 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1ec70 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1ec80 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1ec90 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1eca0 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1ecb0 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1ecc0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ecd0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1ece0 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1ecf0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1ed00 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1ed10 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1ed20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1ed30 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1ed40 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1ed50 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1ed60 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74  o that  it point
1ed70 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  s to the largest
1ed80 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1ed90 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1eda0 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74   key value. If t
1edb0 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f  here are no reco
1edc0 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a  rds less than .*
1edd0 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32  * the key and P2
1ede0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1edf0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
1ee00 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
1ee10 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
1ee20 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  or configured to
1ee30 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65   move in reverse
1ee40 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20   order,.** from 
1ee50 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74  the end toward t
1ee60 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49  he beginning.  I
1ee70 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1ee80 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20  he cursor is.** 
1ee90 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
1eea0 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74  e Prev, not Next
1eeb0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1eec0 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e  : Found, NotFoun
1eed0 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47  d, SeekGt, SeekG
1eee0 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20  e, SeekLe.*/./* 
1eef0 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45 20 50  Opcode: SeekLE P
1ef00 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
1ef10 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
1ef20 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
1ef30 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1ef40 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65   to an SQL table
1ef50 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73   (B-Tree that us
1ef60 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29  es integer keys)
1ef70 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61  , .** use the va
1ef80 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
1ef90 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20  P3 as a key. If 
1efa0 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73  cursor P1 refers
1efb0 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69   .** to an SQL i
1efc0 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73  ndex, then P3 is
1efd0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e   the first in an
1efe0 20 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67   array of P4 reg
1eff0 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  isters .** that 
1f000 61 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75  are used as an u
1f010 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1f020 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69  y. .**.** Reposi
1f030 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73  tion cursor P1 s
1f040 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1f050 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20   to the largest 
1f060 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20 69  entry that .** i
1f070 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1f080 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20  qual to the key 
1f090 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20  value. If there 
1f0a0 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a  are no records .
1f0b0 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  ** less than or 
1f0c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79  equal to the key
1f0d0 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1f0e0 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1f0f0 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  o P2..**.** This
1f100 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
1f110 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67  he cursor config
1f120 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20  ured to move in 
1f130 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a  reverse order,.*
1f140 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74  * from the end t
1f150 6f 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e  oward the beginn
1f160 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ing.  In other w
1f170 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
1f180 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65   is.** configure
1f190 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e  d to use Prev, n
1f1a0 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49  ot Next..**.** I
1f1b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  f the cursor P1 
1f1c0 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  was opened using
1f1d0 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b   the OPFLAG_SEEK
1f1e0 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68  EQ flag, then th
1f1f0 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c  is.** opcode wil
1f200 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e  l always land on
1f210 20 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65   a record that e
1f220 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68  qually equals th
1f230 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73  e key, or.** els
1f240 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  e jump immediate
1f250 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20  ly to P2.  When 
1f260 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50  the cursor is OP
1f270 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69  FLAG_SEEKEQ, thi
1f280 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74  s.** opcode must
1f290 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   be followed by 
1f2a0 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  an IdxGE opcode 
1f2b0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72  with the same ar
1f2c0 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  guments..** The 
1f2d0 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxGE opcode wil
1f2e0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20  l be skipped if 
1f2f0 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63  this opcode succ
1f300 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a  eeds, but the.**
1f310 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69   IdxGE opcode wi
1f320 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75  ll be used on su
1f330 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74  bsequent loop it
1f340 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
1f350 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
1f360 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47   NotFound, SeekG
1f370 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c  t, SeekGe, SeekL
1f380 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  t.*/.case OP_See
1f390 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kLT:         /* 
1f3a0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1f3b0 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20 20 20  e OP_SeekLE:    
1f3c0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1f3d0 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65  3 */.case OP_See
1f3e0 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20  kGE:         /* 
1f3f0 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73  jump, in3 */.cas
1f400 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b 20 20  e OP_SeekGT: {  
1f410 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
1f420 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  3 */.  int res; 
1f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1f440 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 2a  parison result *
1f450 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20 20 20  /.  int oc;     
1f460 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1f470 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
1f480 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20   *pC;    /* The 
1f490 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b 20 2a  cursor to seek *
1f4a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1f4b0 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20 6b 65  rd r;  /* The ke
1f4c0 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20 2a 2f  y to seek for */
1f4d0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20  .  int nField;  
1f4e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f4f0 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 66 69  of columns or fi
1f500 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65 79 20  elds in the key 
1f510 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b 20 20  */.  i64 iKey;  
1f520 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1f530 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f 20 73  owid we are to s
1f540 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
1f550 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 2f  eqOnly;        /
1f560 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73 74 65  * Only intereste
1f570 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74 73 20  d in == results 
1f580 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
1f590 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1f5a0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
1f5b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1f5c0 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43 20 3d  >p2!=0 );.  pC =
1f5d0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1f5e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
1f5f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1f600 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
1f610 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
1f620 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
1f630 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54  kLE == OP_SeekLT
1f640 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1 );.  assert( 
1f650 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f 50 5f  OP_SeekGE == OP_
1f660 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20 61 73  SeekLT+2 );.  as
1f670 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 20  sert( OP_SeekGT 
1f680 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33 20 29  == OP_SeekLT+3 )
1f690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1f6a0 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61  isOrdered );.  a
1f6b0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
1f6c0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 6f 63  ursor!=0 );.  oc
1f6d0 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
1f6e0 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20    eqOnly = 0;.  
1f6f0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  pC->nullRow = 0;
1f700 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1f710 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f  EBUG.  pC->seekO
1f720 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  p = pOp->opcode;
1f730 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
1f740 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20  C->isTable ){.  
1f750 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45 5f 53    /* The BTREE_S
1f760 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73 20 6f  EEK_EQ flag is o
1f770 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64 65 78  nly set on index
1f780 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20 20   cursors */.    
1f790 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1f7a0 74 72 65 65 43 75 72 73 6f 72 48 61 73 48 69 6e  treeCursorHasHin
1f7b0 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t(pC->uc.pCursor
1f7c0 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 29  , BTREE_SEEK_EQ)
1f7d0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
1f7e0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1f7f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 69  );..    /* The i
1f800 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20 50 33  nput value in P3
1f810 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61 6e 79   might be of any
1f820 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72 2c 20   type: integer, 
1f830 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a 20 20  real, string,.  
1f840 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20 4e 55    ** blob, or NU
1f850 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65 65 64  LL.  But it need
1f860 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67  s to be an integ
1f870 65 72 20 62 65 66 6f 72 65 20 77 65 20 63 61 6e  er before we can
1f880 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 73   do.    ** the s
1f890 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72 74 20  eek, so convert 
1f8a0 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 33 20  it. */.    pIn3 
1f8b0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
1f8c0 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d  ;.    if( (pIn3-
1f8d0 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 49 6e  >flags & (MEM_In
1f8e0 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53  t|MEM_Real|MEM_S
1f8f0 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b  tr))==MEM_Str ){
1f900 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75 6d 65  .      applyNume
1f910 72 69 63 41 66 66 69 6e 69 74 79 28 70 49 6e 33  ricAffinity(pIn3
1f920 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1f930 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  iKey = sqlite3Vd
1f940 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 33 29  beIntValue(pIn3)
1f950 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1f960 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c 64 20   P3 value could 
1f970 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64  not be converted
1f980 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
1f990 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20   without.    ** 
1f9a0 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d 61 74  loss of informat
1f9b0 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63 69 61  ion, then specia
1f9c0 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  l processing is 
1f9d0 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20  required... */. 
1f9e0 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c     if( (pIn3->fl
1f9f0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
1fa00 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1fa10 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
1fa20 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  M_Real)==0 ){.  
1fa30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1fa40 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20  P3 value cannot 
1fa50 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1fa60 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 61 20  o any kind of a 
1fa70 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20 20 20  number,.        
1fa80 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65 65 6b  ** then the seek
1fa90 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1faa0 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 20  , so jump to P2 
1fab0 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 42  */.        VdbeB
1fac0 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
1fad0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
1fae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1faf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1fb00 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72 6f 78  /* If the approx
1fb10 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69 73 20  imation iKey is 
1fb20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1fb30 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72  actual real sear
1fb40 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d  ch.      ** term
1fb50 2c 20 73 75 62 73 74 69 74 75 74 65 20 3e 3d 20  , substitute >= 
1fb60 66 6f 72 20 3e 20 61 6e 64 20 3c 20 66 6f 72 20  for > and < for 
1fb70 3c 3d 2e 20 65 2e 67 2e 20 69 66 20 74 68 65 20  <=. e.g. if the 
1fb80 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20 20 20  search term.    
1fb90 20 20 2a 2a 20 69 73 20 34 2e 39 20 61 6e 64 20    ** is 4.9 and 
1fba0 74 68 65 20 69 6e 74 65 67 65 72 20 61 70 70 72  the integer appr
1fbb0 6f 78 69 6d 61 74 69 6f 6e 20 35 3a 0a 20 20 20  oximation 5:.   
1fbc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
1fbd0 20 20 20 20 20 20 28 78 20 3e 20 20 34 2e 39 29        (x >  4.9)
1fbe0 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3e 3d      ->     (x >=
1fbf0 20 35 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   5).      **    
1fc00 20 20 20 20 28 78 20 3c 3d 20 34 2e 39 29 20 20      (x <= 4.9)  
1fc10 20 20 2d 3e 20 20 20 20 20 28 78 20 3c 20 20 35    ->     (x <  5
1fc20 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ).      */.     
1fc30 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3c 28   if( pIn3->u.r<(
1fc40 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20  double)iKey ){. 
1fc50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f         assert( O
1fc60 50 5f 53 65 65 6b 47 45 3d 3d 28 4f 50 5f 53 65  P_SeekGE==(OP_Se
1fc70 65 6b 47 54 2d 31 29 20 29 3b 0a 20 20 20 20 20  ekGT-1) );.     
1fc80 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
1fc90 65 6b 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45  ekLT==(OP_SeekLE
1fca0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  -1) );.        a
1fcb0 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c  ssert( (OP_SeekL
1fcc0 45 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50  E & 0x0001)==(OP
1fcd0 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30 30 31  _SeekGT & 0x0001
1fce0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
1fcf0 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d   (oc & 0x0001)==
1fd00 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30  (OP_SeekGT & 0x0
1fd10 30 30 31 29 20 29 20 6f 63 2d 2d 3b 0a 20 20 20  001) ) oc--;.   
1fd20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1fd30 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  f the approximat
1fd40 69 6f 6e 20 69 4b 65 79 20 69 73 20 73 6d 61 6c  ion iKey is smal
1fd50 6c 65 72 20 74 68 61 6e 20 74 68 65 20 61 63 74  ler than the act
1fd60 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a  ual real search.
1fd70 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73        ** term, s
1fd80 75 62 73 74 69 74 75 74 65 20 3c 3d 20 66 6f 72  ubstitute <= for
1fd90 20 3c 20 61 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e   < and > for >=.
1fda0 20 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73 65 20    */.      else 
1fdb0 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3e 28 64  if( pIn3->u.r>(d
1fdc0 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20  ouble)iKey ){.  
1fdd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50        assert( OP
1fde0 5f 53 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65  _SeekLE==(OP_See
1fdf0 6b 4c 54 2b 31 29 20 29 3b 0a 20 20 20 20 20 20  kLT+1) );.      
1fe00 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
1fe10 6b 47 54 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 2b  kGT==(OP_SeekGE+
1fe20 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
1fe30 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b 4c 54  sert( (OP_SeekLT
1fe40 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f   & 0x0001)==(OP_
1fe50 53 65 65 6b 47 45 20 26 20 30 78 30 30 30 31 29  SeekGE & 0x0001)
1fe60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1fe70 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d 3d 28  (oc & 0x0001)==(
1fe80 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30  OP_SeekLT & 0x00
1fe90 30 31 29 20 29 20 6f 63 2b 2b 3b 0a 20 20 20 20  01) ) oc++;.    
1fea0 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20 20 72    }.    } .    r
1feb0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fec0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1fed0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  C->uc.pCursor, 0
1fee0 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30 2c 20  , (u64)iKey, 0, 
1fef0 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6d  &res);.    pC->m
1ff00 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b  ovetoTarget = iK
1ff10 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20  ey;  /* Used by 
1ff20 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  OP_Delete */.   
1ff30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
1ff50 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1ff60 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ror;.    }.  }el
1ff70 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
1ff80 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 65   cursor with the
1ff90 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 68   BTREE_SEEK_EQ h
1ffa0 69 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 20 4f 50  int, only the OP
1ffb0 5f 53 65 65 6b 47 45 20 61 6e 64 0a 20 20 20 20  _SeekGE and.    
1ffc0 2a 2a 20 4f 50 5f 53 65 65 6b 4c 45 20 6f 70 63  ** OP_SeekLE opc
1ffd0 6f 64 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  odes are allowed
1ffe0 2c 20 61 6e 64 20 74 68 65 73 65 20 6d 75 73 74  , and these must
1fff0 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   be immediately 
20000 66 6f 6c 6c 6f 77 65 64 0a 20 20 20 20 2a 2a 20  followed.    ** 
20010 62 79 20 61 6e 20 4f 50 5f 49 64 78 47 54 20 6f  by an OP_IdxGT o
20020 72 20 4f 50 5f 49 64 78 4c 54 20 6f 70 63 6f 64  r OP_IdxLT opcod
20030 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  e, respectively,
20040 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
20050 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ey..    */.    i
20060 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
20070 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43 2d  ursorHasHint(pC-
20080 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54 52  >uc.pCursor, BTR
20090 45 45 5f 53 45 45 4b 5f 45 51 29 20 29 7b 0a 20  EE_SEEK_EQ) ){. 
200a0 20 20 20 20 20 65 71 4f 6e 6c 79 20 3d 20 31 3b       eqOnly = 1;
200b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
200c0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
200d0 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  eekGE || pOp->op
200e0 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20  code==OP_SeekLE 
200f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20100 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
20110 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b  OP_IdxLT || pOp[
20120 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
20130 78 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xGT );.      ass
20140 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d  ert( pOp[1].p1==
20150 70 4f 70 5b 30 5d 2e 70 31 20 29 3b 0a 20 20 20  pOp[0].p1 );.   
20160 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31     assert( pOp[1
20170 5d 2e 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20  ].p2==pOp[0].p2 
20180 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20190 20 70 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f 70 5b   pOp[1].p3==pOp[
201a0 30 5d 2e 70 33 20 29 3b 0a 20 20 20 20 20 20 61  0].p3 );.      a
201b0 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 34  ssert( pOp[1].p4
201c0 2e 69 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e 69 20  .i==pOp[0].p4.i 
201d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  );.    }..    nF
201e0 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69  ield = pOp->p4.i
201f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
20200 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
20210 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T32 );.    asser
20220 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  t( nField>0 );. 
20230 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20     r.pKeyInfo = 
20240 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  pC->pKeyInfo;.  
20250 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31    r.nField = (u1
20260 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20 20 2f  6)nField;..    /
20270 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e 65 20  * The next line 
20280 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74 65 73  of code computes
20290 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c   as follows, onl
202a0 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20 2a 2a  y faster:.    **
202b0 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f 53 65     if( oc==OP_Se
202c0 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekGT || oc==OP_S
202d0 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a 2a 20  eekLE ){.    ** 
202e0 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63      r.default_rc
202f0 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20 20 20   = -1;.    **   
20300 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
20310 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
20320 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 0a   +1;.    **   }.
20330 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64 65 66      */.    r.def
20340 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20 26 20  ault_rc = ((1 & 
20350 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c 54 29  (oc - OP_SeekLT)
20360 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a 20 20  ) ? -1 : +1);.  
20370 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50    assert( oc!=OP
20380 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64 65 66  _SeekGT || r.def
20390 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20  ault_rc==-1 );. 
203a0 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f     assert( oc!=O
203b0 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e 64 65  P_SeekLE || r.de
203c0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a  fault_rc==-1 );.
203d0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
203e0 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72 2e 64  OP_SeekGE || r.d
203f0 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b  efault_rc==+1 );
20400 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21  .    assert( oc!
20410 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 72 2e  =OP_SeekLT || r.
20420 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20 29  default_rc==+1 )
20430 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20  ;..    r.aMem = 
20440 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
20450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20460 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20 69 3b  BUG.    { int i;
20470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46   for(i=0; i<r.nF
20480 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72  ield; i++) asser
20490 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72  t( memIsValid(&r
204a0 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23  .aMem[i]) ); }.#
204b0 65 6e 64 69 66 0a 20 20 20 20 72 2e 65 71 53 65  endif.    r.eqSe
204c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  en = 0;.    rc =
204d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
204e0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e  etoUnpacked(pC->
204f0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 2c 20  uc.pCursor, &r, 
20500 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  0, 0, &res);.   
20510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
20530 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
20540 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
20550 66 28 20 65 71 4f 6e 6c 79 20 26 26 20 72 2e 65  f( eqOnly && r.e
20560 71 53 65 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  qSeen==0 ){.    
20570 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
20580 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   );.      goto s
20590 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20  eek_not_found;. 
205a0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 2d 3e 64     }.  }.  pC->d
205b0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
205c0 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
205d0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
205e0 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LE;.#ifdef SQLIT
205f0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
20600 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
20610 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6f 63  .#endif.  if( oc
20620 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b 20 20  >=OP_SeekGE ){  
20630 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53  assert( oc==OP_S
20640 65 65 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f 50 5f  eekGE || oc==OP_
20650 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20 69 66  SeekGT );.    if
20660 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65 73 3d  ( res<0 || (res=
20670 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65  =0 && oc==OP_See
20680 6b 47 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65  kGT) ){.      re
20690 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
206a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
206b0 78 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  xt(pC->uc.pCurso
206c0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
206d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
206e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
206f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
20700 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
20720 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20       res = 1;.  
20730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20740 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
20750 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
20760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20770 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
20780 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
20790 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
207a0 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65  ssert( oc==OP_Se
207b0 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53  ekLT || oc==OP_S
207c0 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69 66 28  eekLE );.    if(
207d0 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73 3d 3d   res>0 || (res==
207e0 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  0 && oc==OP_Seek
207f0 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LT) ){.      res
20800 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
20810 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
20820 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70 43 75  vious(pC->uc.pCu
20830 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rsor, 0);.      
20840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20850 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
20860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
20870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
20880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20890 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b          res = 1;
208a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
208b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
208c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
208d0 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
208e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
208f0 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d 69 67        /* res mig
20900 68 74 20 62 65 20 6e 65 67 61 74 69 76 65 20 62  ht be negative b
20910 65 63 61 75 73 65 20 74 68 65 20 74 61 62 6c 65  ecause the table
20920 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68 65 63   is empty.  Chec
20930 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
20940 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
20950 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   case..      */.
20960 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
20970 74 65 33 42 74 72 65 65 45 6f 66 28 70 43 2d 3e  te3BtreeEof(pC->
20980 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
20990 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f   }.  }.seek_not_
209a0 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72 74 28  found:.  assert(
209b0 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20   pOp->p2>0 );.  
209c0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
209d0 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
209e0 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f   res ){.    goto
209f0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
20a00 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c 79 20  else if( eqOnly 
20a10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
20a20 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  Op[1].opcode==OP
20a30 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d  _IdxLT || pOp[1]
20a40 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  .opcode==OP_IdxG
20a50 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b 20  T );.    pOp++; 
20a60 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50 5f 49  /* Skip the OP_I
20a70 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78 47 54  dxLt or OP_IdxGT
20a80 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f   that follows */
20a90 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
20aa0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e  ./* Opcode: Foun
20ab0 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  d P1 P2 P3 P4 *.
20ac0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
20ad0 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20  =r[P3@P4].**.** 
20ae0 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65  If P4==0 then re
20af0 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20  gister P3 holds 
20b00 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74  a blob construct
20b10 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64  ed by MakeRecord
20b20 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68  .  If.** P4>0 th
20b30 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69  en register P3 i
20b40 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50  s the first of P
20b50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74  4 registers that
20b60 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65   form an unpacke
20b70 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  d.** record..**.
20b80 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
20b90 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  on an index btre
20ba0 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72  e.  If the recor
20bb0 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  d identified by 
20bc0 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20  P3 and P4.** is 
20bd0 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 79 20  a prefix of any 
20be0 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68 65 6e  entry in P1 then
20bf0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
20c00 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20  to P2 and.** P1 
20c10 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
20c20 20 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67   at the matching
20c30 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
20c40 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61  is operation lea
20c50 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 69  ves the cursor i
20c60 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65 20  n a state where 
20c70 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61 64 76  it can be.** adv
20c80 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66 6f 72  anced in the for
20c90 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e 2e 20  ward direction. 
20ca0 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74 72 75   The Next instru
20cb0 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c  ction will work,
20cc0 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68 65 20  .** but not the 
20cd0 50 72 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e  Prev instruction
20ce0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
20cf0 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f  : NotFound, NoCo
20d00 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69 73 74  nflict, NotExist
20d10 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20  s. SeekGe.*/./* 
20d20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64  Opcode: NotFound
20d30 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
20d40 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
20d50 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
20d60 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67  f P4==0 then reg
20d70 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61  ister P3 holds a
20d80 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65   blob constructe
20d90 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e  d by MakeRecord.
20da0 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65    If.** P4>0 the
20db0 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
20dc0 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 50 34   the first of P4
20dd0 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 20   registers that 
20de0 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64  form an unpacked
20df0 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a  .** record..** .
20e00 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69 73 20  ** Cursor P1 is 
20e10 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  on an index btre
20e20 65 2e 20 20 49 66 20 74 68 65 20 72 65 63 6f 72  e.  If the recor
20e30 64 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  d identified by 
20e40 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20  P3 and P4.** is 
20e50 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78 20 6f  not the prefix o
20e60 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e 20 50  f any entry in P
20e70 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20 69 73  1 then a jump is
20e80 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20 49 66   made to P2.  If
20e90 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e   P1 .** does con
20ea0 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20 77 68  tain an entry wh
20eb0 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74 63 68  ose prefix match
20ec0 65 73 20 74 68 65 20 50 33 2f 50 34 20 72 65 63  es the P3/P4 rec
20ed0 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c  ord then control
20ee0 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f 75 67  .** falls throug
20ef0 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
20f00 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 50 31  struction and P1
20f10 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
20f20 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63  g at the.** matc
20f30 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  hing entry..**.*
20f40 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
20f50 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
20f60 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20 77 68  or in a state wh
20f70 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  ere it cannot be
20f80 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69 6e 20  .** advanced in 
20f90 65 69 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e  either direction
20fa0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
20fb0 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20  s, the Next and 
20fc0 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65 73 20  Prev.** opcodes 
20fd0 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66 74 65  do not work afte
20fe0 72 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  r this operation
20ff0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
21000 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73  : Found, NotExis
21010 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 0a 2a  ts, NoConflict.*
21020 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43  /./* Opcode: NoC
21030 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20 50 33  onflict P1 P2 P3
21040 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
21050 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
21060 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74  **.** If P4==0 t
21070 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21080 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e  holds a blob con
21090 73 74 72 75 63 74 65 64 20 62 79 20 4d 61 6b 65  structed by Make
210a0 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50  Record.  If.** P
210b0 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73 74 65  4>0 then registe
210c0 72 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  r P3 is the firs
210d0 74 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72  t of P4 register
210e0 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e 20 75  s that form an u
210f0 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72  npacked.** recor
21100 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72  d..** .** Cursor
21110 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64   P1 is on an ind
21120 65 78 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  ex btree.  If th
21130 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74 69 66  e record identif
21140 69 65 64 20 62 79 20 50 33 20 61 6e 64 20 50 34  ied by P3 and P4
21150 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  .** contains any
21160 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d   NULL value, jum
21170 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
21180 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74 65 72   P2.  If all ter
21190 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  ms of the.** rec
211a0 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c  ord are not-NULL
211b0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20 69 73   then a check is
211c0 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72 6d 69   done to determi
211d0 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20 69 6e  ne if any row in
211e0 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78   the.** P1 index
211f0 20 62 74 72 65 65 20 68 61 73 20 61 20 6d 61 74   btree has a mat
21200 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66 69 78  ching key prefix
21210 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
21220 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70  no matches, jump
21230 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
21240 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65 72 65  to P2.  If there
21250 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66 61 6c   is a match, fal
21260 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6c 65  l through and le
21270 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20 63 75  ave the P1.** cu
21280 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
21290 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 72 6f   the matching ro
212a0 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  w..**.** This op
212b0 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61 72 20  code is similar 
212c0 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77  to OP_NotFound w
212d0 69 74 68 20 74 68 65 20 65 78 63 65 70 74 69 6f  ith the exceptio
212e0 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 62  ns that the.** b
212f0 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20  ranch is always 
21300 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70 61 72  taken if any par
21310 74 20 6f 66 20 74 68 65 20 73 65 61 72 63 68 20  t of the search 
21320 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  key input is NUL
21330 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  L..**.** This op
21340 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73 20 74  eration leaves t
21350 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73  he cursor in a s
21360 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63 61  tate where it ca
21370 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e  nnot be.** advan
21380 63 65 64 20 69 6e 20 65 69 74 68 65 72 20 64 69  ced in either di
21390 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  rection.  In oth
213a0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65  er words, the Ne
213b0 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f  xt and Prev.** o
213c0 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f  pcodes do not wo
213d0 72 6b 20 61 66 74 65 72 20 74 68 69 73 20 6f 70  rk after this op
213e0 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  eration..**.** S
213f0 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e  ee also: NotFoun
21400 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69  d, Found, NotExi
21410 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  sts.*/.case OP_N
21420 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20 20 2f  oConflict:     /
21430 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
21440 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a  ase OP_NotFound:
21450 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
21460 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46  in3 */.case OP_F
21470 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20 20 2f  ound: {        /
21480 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20  * jump, in3 */. 
21490 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78 69 73   int alreadyExis
214a0 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65 4a 75  ts;.  int takeJu
214b0 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  mp;.  int ii;.  
214c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
214d0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70    int res;.  Unp
214e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 46 72  ackedRecord *pFr
214f0 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ee;.  UnpackedRe
21500 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20  cord *pIdxKey;. 
21510 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
21520 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  r;..#ifdef SQLIT
21530 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70 4f 70  E_TEST.  if( pOp
21540 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 6f 43  ->opcode!=OP_NoC
21550 6f 6e 66 6c 69 63 74 20 29 20 73 71 6c 69 74 65  onflict ) sqlite
21560 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b  3_found_count++;
21570 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
21580 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
21590 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
215a0 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sor );.  assert(
215b0 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
215c0 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43 20 3d  _INT32 );.  pC =
215d0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
215e0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
215f0 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
21600 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 2d  LITE_DEBUG.  pC-
21610 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f  >seekOp = pOp->o
21620 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  pcode;.#endif.  
21630 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
21640 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p3];.  assert(
21650 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
21660 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
21670 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
21680 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
21690 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54   assert( pC->isT
216a0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  able==0 );.  if(
216b0 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a   pOp->p4.i>0 ){.
216c0 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d      r.pKeyInfo =
216d0 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20   pC->pKeyInfo;. 
216e0 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75     r.nField = (u
216f0 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  16)pOp->p4.i;.  
21700 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b    r.aMem = pIn3;
21710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21720 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 69 3d  EBUG.    for(ii=
21730 30 3b 20 69 69 3c 72 2e 6e 46 69 65 6c 64 3b 20  0; ii<r.nField; 
21740 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21750 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
21760 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 20 29 3b 0a  &r.aMem[ii]) );.
21770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
21780 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20  .aMem[ii].flags 
21790 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
217a0 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d  | r.aMem[ii].n==
217b0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  0 );.      if( i
217c0 69 20 29 20 52 45 47 49 53 54 45 52 5f 54 52 41  i ) REGISTER_TRA
217d0 43 45 28 70 4f 70 2d 3e 70 33 2b 69 69 2c 20 26  CE(pOp->p3+ii, &
217e0 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20 20 20  r.aMem[ii]);.   
217f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 49   }.#endif.    pI
21800 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20 20 20  dxKey = &r;.    
21810 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  pFree = 0;.  }el
21820 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
21830 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
21840 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 72 63  M_Blob );.    rc
21850 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49   = ExpandBlob(pI
21860 6e 33 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n3);.    assert(
21870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
21880 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
21890 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
218a0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
218b0 20 20 20 20 70 46 72 65 65 20 3d 20 70 49 64 78      pFree = pIdx
218c0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
218d0 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
218e0 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49 6e 66  cord(pC->pKeyInf
218f0 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  o);.    if( pIdx
21900 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  Key==0 ) goto no
21910 5f 6d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  _mem;.    sqlite
21920 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
21930 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  k(pC->pKeyInfo, 
21940 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d 3e 7a  pIn3->n, pIn3->z
21950 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
21960 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75    pIdxKey->defau
21970 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74 61 6b  lt_rc = 0;.  tak
21980 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69 66 28  eJump = 0;.  if(
21990 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
219a0 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  _NoConflict ){. 
219b0 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 4f 50     /* For the OP
219c0 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70 63 6f  _NoConflict opco
219d0 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  de, take the jum
219e0 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 0a  p if any of the.
219f0 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66 69 65      ** input fie
21a00 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20 73 69  lds are NULL, si
21a10 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69 74 68  nce any key with
21a20 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e 6f 74   a NULL will not
21a30 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69 63 74  .    ** conflict
21a40 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   */.    for(ii=0
21a50 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e 6e 46  ; ii<pIdxKey->nF
21a60 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  ield; ii++){.   
21a70 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
21a80 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20 26  aMem[ii].flags &
21a90 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
21aa0 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20       takeJump = 
21ab0 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
21ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21ad0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
21ae0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
21af0 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75  acked(pC->uc.pCu
21b00 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c 20 30  rsor, pIdxKey, 0
21b10 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
21b20 28 20 70 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( pFree ) sqlite
21b30 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 46  3DbFreeNN(db, pF
21b40 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ree);.  if( rc!=
21b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21b60 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
21b70 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to_error;.  }.  
21b80 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
21b90 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64 79 45   res;.  alreadyE
21ba0 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30 29  xists = (res==0)
21bb0 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  ;.  pC->nullRow 
21bc0 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69 73 74  = 1-alreadyExist
21bd0 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65  s;.  pC->deferre
21be0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
21bf0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
21c00 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
21c10 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
21c20 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20 20  =OP_Found ){.   
21c30 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
21c40 28 61 6c 72 65 61 64 79 45 78 69 73 74 73 21 3d  (alreadyExists!=
21c50 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 61 6c  0,2);.    if( al
21c60 72 65 61 64 79 45 78 69 73 74 73 20 29 20 67 6f  readyExists ) go
21c70 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
21c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
21c90 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61 6b 65  BranchTaken(take
21ca0 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45 78 69  Jump||alreadyExi
21cb0 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20 20 69  sts==0,2);.    i
21cc0 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c 20 21  f( takeJump || !
21cd0 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20  alreadyExists ) 
21ce0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
21cf0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
21d00 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
21d10 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a  Rowid P1 P2 P3 *
21d20 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
21d30 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a 0a  intkey=r[P3].**.
21d40 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e 64  ** P1 is the ind
21d50 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20 6f  ex of a cursor o
21d60 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74 61  pen on an SQL ta
21d70 62 6c 65 20 62 74 72 65 65 20 28 77 69 74 68 20  ble btree (with 
21d80 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73 29  integer.** keys)
21d90 2e 20 20 49 66 20 72 65 67 69 73 74 65 72 20 50  .  If register P
21da0 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  3 does not conta
21db0 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72  in an integer or
21dc0 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f 74 0a   if P1 does not.
21dd0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63  ** contain a rec
21de0 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50  ord with rowid P
21df0 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65  3 then jump imme
21e00 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20  diately to P2.  
21e10 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20 69 73  .** Or, if P2 is
21e20 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53 51 4c   0, raise an SQL
21e30 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
21e40 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63 6f  r. If P1 does co
21e50 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63 6f 72  ntain.** a recor
21e60 64 20 77 69 74 68 20 72 6f 77 69 64 20 50 33 20  d with rowid P3 
21e70 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74  then .** leave t
21e80 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69  he cursor pointi
21e90 6e 67 20 61 74 20 74 68 61 74 20 72 65 63 6f 72  ng at that recor
21ea0 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  d and fall throu
21eb0 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a  gh to the next.*
21ec0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  * instruction..*
21ed0 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 45  *.** The OP_NotE
21ee0 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70 65 72  xists opcode per
21ef0 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f  forms the same o
21f00 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20 77 69  peration, but wi
21f10 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 0a  th OP_NotExists.
21f20 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69 73 74  ** the P3 regist
21f30 65 72 20 6d 75 73 74 20 62 65 20 67 75 61 72 61  er must be guara
21f40 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  nteed to contain
21f50 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
21f60 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a 2a 2a  e.  With this.**
21f70 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73 74 65   opcode, registe
21f80 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74 20 63  r P3 might not c
21f90 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
21fa0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f  r..**.** The OP_
21fb0 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65 20  NotFound opcode 
21fc0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d  performs the sam
21fd0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69  e operation on i
21fe0 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20 28  ndex btrees.** (
21ff0 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20 6d  with arbitrary m
22000 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73 29  ulti-value keys)
22010 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
22020 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
22030 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65  ursor in a state
22040 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74   where it cannot
22050 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a 20   be advanced.** 
22060 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74  in either direct
22070 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
22080 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61  ords, the Next a
22090 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73 20  nd Prev opcodes 
220a0 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
220b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
220c0 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  opcode..**.** Se
220d0 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
220e0 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c  otFound, NoConfl
220f0 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a 2a  ict, SeekRowid.*
22100 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74  /./* Opcode: Not
22110 45 78 69 73 74 73 20 50 31 20 50 32 20 50 33 20  Exists P1 P2 P3 
22120 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
22130 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a   intkey=r[P3].**
22140 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
22150 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20  dex of a cursor 
22160 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74  open on an SQL t
22170 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74 68  able btree (with
22180 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73   integer.** keys
22190 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69 6e 74  ).  P3 is an int
221a0 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49 66 20  eger rowid.  If 
221b0 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  P1 does not cont
221c0 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74  ain a record wit
221d0 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20 74 68  h.** rowid P3 th
221e0 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  en jump immediat
221f0 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72 2c 20  ely to P2.  Or, 
22200 69 66 20 50 32 20 69 73 20 30 2c 20 72 61 69 73  if P2 is 0, rais
22210 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  e an.** SQLITE_C
22220 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49 66  ORRUPT error. If
22230 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e   P1 does contain
22240 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72   a record with r
22250 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a  owid P3 then .**
22260 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
22270 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
22280 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61  at record and fa
22290 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
222a0 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75  e next.** instru
222b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
222c0 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f 70   OP_SeekRowid op
222d0 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68  code performs th
222e0 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e  e same operation
222f0 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f 77 73   but also allows
22300 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67 69 73   the.** P3 regis
22310 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  ter to contain a
22320 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76 61 6c   non-integer val
22330 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  ue, in which cas
22340 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a 2a 2a  e the jump is.**
22350 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 20 20   always taken.  
22360 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 71 75  This opcode requ
22370 69 72 65 73 20 74 68 61 74 20 50 33 20 61 6c 77  ires that P3 alw
22380 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69  ays contain an i
22390 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  nteger..**.** Th
223a0 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70  e OP_NotFound op
223b0 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68  code performs th
223c0 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e  e same operation
223d0 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65 73   on index btrees
223e0 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74 72  .** (with arbitr
223f0 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20  ary multi-value 
22400 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  keys)..**.** Thi
22410 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20  s opcode leaves 
22420 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61 20  the cursor in a 
22430 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20 63  state where it c
22440 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63 65  annot be advance
22450 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20 64  d.** in either d
22460 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74  irection.  In ot
22470 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 4e  her words, the N
22480 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70 63  ext and Prev opc
22490 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  odes will.** not
224a0 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20   work following 
224b0 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  this opcode..**.
224c0 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
224d0 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  nd, NotFound, No
224e0 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f  Conflict, SeekRo
224f0 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  wid.*/.case OP_S
22500 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  eekRowid: {     
22510 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
22520 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
22530 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
22540 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
22550 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b 0a 0a  s;.  u64 iKey;..
22560 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
22570 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28  Op->p3];.  if( (
22580 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
22590 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
225a0 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
225b0 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In3, SQLITE_AFF_
225c0 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
225d0 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e  g);.    if( (pIn
225e0 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
225f0 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75  nt)==0 ) goto ju
22600 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
22610 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
22620 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69 73 74  into OP_NotExist
22630 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74  s */.case OP_Not
22640 45 78 69 73 74 73 3a 20 20 20 20 20 20 20 20 20  Exists:         
22650 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
22660 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
22670 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65  pOp->p3];.  asse
22680 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20  rt( pIn3->flags 
22690 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  & MEM_Int );.  a
226a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
226b0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
226c0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
226d0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
226e0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
226f0 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53  C!=0 );.#ifdef S
22700 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43  QLITE_DEBUG.  pC
22710 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a 23 65  ->seekOp = 0;.#e
22720 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
22730 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
22740 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
22750 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
22760 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  REE );.  pCrsr =
22770 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
22780 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72  .  assert( pCrsr
22790 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d 20 30  !=0 );.  res = 0
227a0 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e 33 2d  ;.  iKey = pIn3-
227b0 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c  >u.i;.  rc = sql
227c0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
227d0 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20 30  npacked(pCrsr, 0
227e0 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65 73 29  , iKey, 0, &res)
227f0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22800 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65 73  SQLITE_OK || res
22810 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d 6f 76  ==0 );.  pC->mov
22820 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79  etoTarget = iKey
22830 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50  ;  /* Used by OP
22840 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70 43 2d  _Delete */.  pC-
22850 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20  >nullRow = 0;.  
22860 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
22870 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
22880 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76   pC->deferredMov
22890 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62 65 42  eto = 0;.  VdbeB
228a0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
228b0 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b  0,2);.  pC->seek
228c0 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20  Result = res;.  
228d0 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a 20 20  if( res!=0 ){.  
228e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
228f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
22900 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 7b  f( pOp->p2==0 ){
22910 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22920 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22940 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
22950 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
22960 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
22970 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
22980 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
22990 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63 65  Opcode: Sequence
229a0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
229b0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
229c0 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b  cursor[P1].ctr++
229d0 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  .**.** Find the 
229e0 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73  next available s
229f0 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 66  equence number f
22a00 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a  or cursor P1..**
22a10 20 57 72 69 74 65 20 74 68 65 20 73 65 71 75 65   Write the seque
22a20 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  nce number into 
22a30 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20  register P2..** 
22a40 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  The sequence num
22a50 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  ber on the curso
22a60 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  r is incremented
22a70 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20 69   after this.** i
22a80 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f  nstruction.  .*/
22a90 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63  .case OP_Sequenc
22aa0 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  e: {           /
22ab0 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  * out2 */.  asse
22ac0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
22ad0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
22ae0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
22af0 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  ( p->apCsr[pOp->
22b00 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  p1]!=0 );.  asse
22b10 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  rt( p->apCsr[pOp
22b20 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70 65 21  ->p1]->eCurType!
22b30 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b  =CURTYPE_VTAB );
22b40 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
22b50 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
22b60 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  ;.  pOut->u.i = 
22b70 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
22b80 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a 20  ]->seqCount++;. 
22b90 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f   break;.}.../* O
22ba0 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64 20  pcode: NewRowid 
22bb0 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
22bc0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
22bd0 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74 20  rowid.**.** Get 
22be0 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72 65  a new integer re
22bf0 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e 6b  cord number (a.k
22c00 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73 65 64  .a "rowid") used
22c10 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20 61   as the key to a
22c20 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 72   table..** The r
22c30 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20  ecord number is 
22c40 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75  not previously u
22c50 73 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e 20  sed as a key in 
22c60 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22c70 74 61 62 6c 65 20 74 68 61 74 20 63 75 72 73 6f  table that curso
22c80 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e 20  r P1 points to. 
22c90 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   The new record 
22ca0 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74 74 65  number is writte
22cb0 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  n.** written to 
22cc0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
22cd0 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e 20  ** If P3>0 then 
22ce0 50 33 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P3 is a register
22cf0 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
22d00 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42 45 20  me of this VDBE 
22d10 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20 74  that holds .** t
22d20 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 76 69  he largest previ
22d30 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20  ously generated 
22d40 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 4e  record number. N
22d50 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75 6d  o new record num
22d60 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  bers are.** allo
22d70 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  wed to be less t
22d80 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e 20  han this value. 
22d90 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20  When this value 
22da0 72 65 61 63 68 65 73 20 69 74 73 20 6d 61 78 69  reaches its maxi
22db0 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 49  mum, .** an SQLI
22dc0 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69 73  TE_FULL error is
22dd0 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65 20   generated. The 
22de0 50 33 20 72 65 67 69 73 74 65 72 20 69 73 20 75  P3 register is u
22df0 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20  pdated with the 
22e00 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 72  '.** generated r
22e10 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54 68  ecord number. Th
22e20 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d 20  is P3 mechanism 
22e30 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  is used to help 
22e40 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
22e50 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 66   AUTOINCREMENT f
22e60 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20  eature..*/.case 
22e70 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20 20  OP_NewRowid: {  
22e80 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
22e90 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20 20 20   */.  i64 v;    
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22eb0 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a 2f  The new rowid */
22ec0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
22ed0 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  C;        /* Cur
22ee0 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  sor of table to 
22ef0 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f 77 69  get the new rowi
22f00 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b 20  d */.  int res; 
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f20 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 73 71   Result of an sq
22f30 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29  lite3BtreeLast()
22f40 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f60 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69 74  Counter to limit
22f70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
22f80 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65 6d  earches */.  Mem
22f90 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   *pMem;         
22fa0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
22fb0 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73 74 20  holding largest 
22fc0 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f 49 4e  rowid for AUTOIN
22fd0 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64 62  CREMENT */.  Vdb
22fe0 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 20  eFrame *pFrame; 
22ff0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61 6d      /* Root fram
23000 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20 20  e of VDBE */..  
23010 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 30  v = 0;.  res = 0
23020 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
23030 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
23040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
23050 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
23060 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
23070 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
23080 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
23090 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
230a0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
230b0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
230c0 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
230d0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
230e0 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f 2a  =0 );.  {.    /*
230f0 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64 20   The next rowid 
23100 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  or record number
23110 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72 6d   (different term
23120 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a 20  s for the same. 
23130 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73 20     ** thing) is 
23140 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74 77  obtained in a tw
23150 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68 6d  o-step algorithm
23160 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23170 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70 74  First we attempt
23180 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   to find the lar
23190 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
231a0 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65 0a  wid and add one.
231b0 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e 20      ** to that. 
231c0 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72 67   But if the larg
231d0 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f 77  est existing row
231e0 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74 68  id is already th
231f0 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a 2a  e maximum.    **
23200 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
23210 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  r, we have to fa
23220 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
23230 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20  e second.    ** 
23240 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61 6c  probabilistic al
23250 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a 20  gorithm.    **. 
23260 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64     ** The second
23270 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74 6f   algorithm is to
23280 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64 20   select a rowid 
23290 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73 65  at random and se
232a0 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 61  e if.    ** it a
232b0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
232c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20   the table.  If 
232d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
232e0 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  t, we have.    *
232f0 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49 66  * succeeded.  If
23300 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77 69   the random rowi
23310 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77 65  d does exist, we
23320 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f 6e   select a new on
23330 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72 79  e.    ** and try
23340 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31 30   again, up to 10
23350 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 times..    */.
23360 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
23370 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 64  isTable );..#ifd
23380 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54 5f  ef SQLITE_32BIT_
23390 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e 65  ROWID.#   define
233a0 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66 66   MAX_ROWID 0x7ff
233b0 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20 20  fffff.#else.    
233c0 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65 72  /* Some compiler
233d0 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74  s complain about
233e0 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74 68   constants of th
233f0 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66 66  e form 0x7ffffff
23400 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20 2a  fffffffff..    *
23410 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61 69  * Others complai
23420 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66 66  n about 0x7fffff
23430 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20 20  fffffffffffLL.  
23440 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
23450 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a 2a  cro seems.    **
23460 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
23470 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20 6d  constant while m
23480 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69 6c  aking all compil
23490 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20 2a  ers happy..    *
234a0 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
234b0 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20 28  _ROWID  (i64)( (
234c0 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66 66  ((u64)0x7fffffff
234d0 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30 78  )<<32) | (u64)0x
234e0 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64 69  ffffffff ).#endi
234f0 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d 3e  f..    if( !pC->
23500 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
23510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23520 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70 43  ite3BtreeLast(pC
23530 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72  ->uc.pCursor, &r
23540 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  es);.      if( r
23550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f          goto abo
23570 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
23580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23590 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
235a0 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49 4d    v = 1;   /* IM
235b0 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37 34  P: R-61914-48074
235c0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
235d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
235e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
235f0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e 75  sorIsValid(pC->u
23600 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  c.pCursor) );.  
23610 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65        v = sqlite
23620 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79  3BtreeIntegerKey
23630 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
23640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 3e  ;.        if( v>
23650 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  =MAX_ROWID ){.  
23660 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65 52          pC->useR
23670 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b 0a  andomRowid = 1;.
23680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23690 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20 20 20           v++;   
236a0 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33 38 2d  /* IMP: R-29538-
236b0 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20 20 20  34987 */.       
236c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
236d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
236e0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
236f0 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ENT.    if( pOp-
23700 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >p3 ){.      /* 
23710 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
23720 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
23730 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
23740 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
23750 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
23760 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
23770 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
23780 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
23790 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
237a0 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
237b0 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  t);.        /* A
237c0 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69 73  ssert that P3 is
237d0 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   a valid memory 
237e0 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
237f0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
23800 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 29  <=pFrame->nMem )
23810 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  ;.        pMem =
23820 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70   &pFrame->aMem[p
23830 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 7d  Op->p3];.      }
23840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23850 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
23860 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
23870 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
23880 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
23890 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
238a0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
238b0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 26          pMem = &
238c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
238d0 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
238e0 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d 29  oChange(p, pMem)
238f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23900 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
23910 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20 20  id(pMem) );..   
23920 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
23930 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d 29  E(pOp->p3, pMem)
23940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23950 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
23960 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61 73  (pMem);.      as
23970 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
23980 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  gs & MEM_Int)!=0
23990 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29 20   );  /* mem(P3) 
239a0 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65 72  holds an integer
239b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4d   */.      if( pM
239c0 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f 57  em->u.i==MAX_ROW
239d0 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61 6e  ID || pC->useRan
239e0 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  domRowid ){.    
239f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23a00 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20  FULL;   /* IMP: 
23a10 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20 2a 2f  R-17817-00630 */
23a20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
23a30 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
23a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23a50 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69 2b  if( v<pMem->u.i+
23a60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  1 ){.        v =
23a70 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b 0a   pMem->u.i + 1;.
23a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
23a90 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 20  em->u.i = v;.   
23aa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
23ab0 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52  ( pC->useRandomR
23ac0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  owid ){.      /*
23ad0 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
23ae0 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38 38  OF: R-07677-4188
23af0 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73 74  1 If the largest
23b00 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c 20   ROWID is equal 
23b10 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
23b20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  largest possible
23b30 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33 37   integer (922337
23b40 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20 74  2036854775807) t
23b50 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
23b60 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e 65  .      ** engine
23b70 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67 20   starts picking 
23b80 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64 61  positive candida
23b90 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61 6e  te ROWIDs at ran
23ba0 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  dom until.      
23bb0 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65 20  ** it finds one 
23bc0 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65 76  that is not prev
23bd0 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f 0a  iously used. */.
23be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
23bf0 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a 20  p->p3==0 );  /* 
23c00 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20  We cannot be in 
23c10 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f 64  random rowid mod
23c20 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20 20  e if this is.   
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
23c50 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74 61  AUTOINCREMENT ta
23c60 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6e  ble. */.      cn
23c70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 7b  t = 0;.      do{
23c80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23c90 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
23ca0 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20 20  of(v), &v);.    
23cb0 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52 4f      v &= (MAX_RO
23cc0 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20 2f  WID>>1); v++;  /
23cd0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 76 20  * Ensure that v 
23ce0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
23cf0 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d 77  zero */.      }w
23d00 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73 71  hile(  ((rc = sq
23d10 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
23d20 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e  Unpacked(pC->uc.
23d30 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36 34  pCursor, 0, (u64
23d40 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )v,.            
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d 3d       0, &res))==
23d80 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20 20  SQLITE_OK).     
23d90 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d 3d         && (res==
23da0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  0).            &
23db0 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b 0a  & (++cnt<100));.
23dc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
23dd0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
23de0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
23df0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
23e00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23e10 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a 20  FULL;   /* IMP: 
23e20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a 2f  R-38219-53002 */
23e30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
23e40 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
23e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e60 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20 20  assert( v>0 );  
23e70 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d 30  /* EV: R-40812-0
23e80 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  3570 */.    }.  
23e90 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
23ea0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 43  veto = 0;.    pC
23eb0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
23ec0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
23ed0 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76  .  pOut->u.i = v
23ee0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
23ef0 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 20   Opcode: Insert 
23f00 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
23f10 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b  * Synopsis: intk
23f20 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d 72 5b  ey=r[P3] data=r[
23f30 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  P2].**.** Write 
23f40 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
23f50 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73 6f  e table of curso
23f60 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e 74  r P1.  A new ent
23f70 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65 64  ry is.** created
23f80 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 61   if it doesn't a
23f90 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72 20  lready exist or 
23fa0 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e 20  the data for an 
23fb0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74 72  existing.** entr
23fc0 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  y is overwritten
23fd0 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20 74  .  The data is t
23fe0 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c 6f  he value MEM_Blo
23ff0 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  b stored in regi
24000 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50  ster.** number P
24010 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73 74  2. The key is st
24020 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
24030 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75 73   P3. The key mus
24040 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49 6e  t.** be a MEM_In
24050 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
24060 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 66  OPFLAG_NCHANGE f
24070 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74  lag of P5 is set
24080 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 63  , then the row c
24090 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a 2a  hange count is.*
240a0 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28 6f  * incremented (o
240b0 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20 20  therwise not).  
240c0 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 41  If the OPFLAG_LA
240d0 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66 20  STROWID flag of 
240e0 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  P5 is set,.** th
240f0 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f 72  en rowid is stor
24100 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65 6e  ed for subsequen
24110 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65 0a  t return by the.
24120 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  ** sqlite3_last_
24130 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66  insert_rowid() f
24140 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77 69  unction (otherwi
24150 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69 66  se it is unmodif
24160 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ied)..**.** If t
24170 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
24180 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20  KRESULT flag of 
24190 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69  P5 is set, the i
241a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69  mplementation mi
241b0 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65  ght.** run faste
241c0 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e  r by avoiding an
241d0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65   unnecessary see
241e0 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20  k on cursor P1. 
241f0 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65   However,.** the
24200 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
24210 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20  ESULT flag must 
24220 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74  only be set if t
24230 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
24240 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73  o prior.** seeks
24250 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f   on the cursor o
24260 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r if the most re
24270 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61  cent seek used a
24280 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 50 33   key equal to P3
24290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
242a0 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20 66  PFLAG_ISUPDATE f
242b0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
242c0 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   this opcode is 
242d0 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55 50  part of an.** UP
242e0 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e 20  DATE operation. 
242f0 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   Otherwise (if t
24300 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  he flag is clear
24310 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  ) then this opco
24320 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f 66  de.** is part of
24330 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72 61   an INSERT opera
24340 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66 65  tion.  The diffe
24350 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69 6d  rence is only im
24360 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74 68  portant to.** th
24370 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a 2a  e update hook..*
24380 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 50  *.** Parameter P
24390 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  4 may point to a
243a0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
243b0 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  , or may be NULL
243c0 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a 20 6e  . If it is .** n
243d0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
243e0 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28 73  e update-hook (s
243f0 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65 43 61  qlite3.xUpdateCa
24400 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76 6f 6b  llback) is invok
24410 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ed .** following
24420 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69 6e   a successful in
24430 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41 52  sert..**.** (WAR
24440 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50 31  NING/TODO: If P1
24450 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75 72   is a pseudo-cur
24460 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64 79  sor and P2 is dy
24470 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
24480 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77 6e  ocated, then own
24490 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73 20  ership of P2 is 
244a0 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 74  transferred to t
244b0 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72  he pseudo-cursor
244c0 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65 72  .** and register
244d0 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68 65   P2 becomes ephe
244e0 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20 63  meral.  If the c
244f0 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65 64  ursor is changed
24500 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  , the.** value o
24510 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77 69  f register P2 wi
24520 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e 20  ll then change. 
24530 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
24540 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75 73  does not.** caus
24550 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 29  e any problems.)
24560 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
24570 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
24580 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20 54  ks on tables.  T
24590 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e  he equivalent in
245a0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72  struction.** for
245b0 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f 49   indices is OP_I
245c0 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20  dxInsert..*/./* 
245d0 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49 6e  Opcode: InsertIn
245e0 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
245f0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e  .** Synopsis: in
24600 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72 5b 50  tkey=P3 data=r[P
24610 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  2].**.** This wo
24620 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65  rks exactly like
24630 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65 70   OP_Insert excep
24640 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20 69  t that the key i
24650 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  s the.** integer
24660 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20 74   value P3, not t
24670 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
24680 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 69  integer stored i
24690 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
246a0 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72 74  /.case OP_Insert
246b0 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  : .case OP_Inser
246c0 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  tInt: {.  Mem *p
246d0 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Data;       /* M
246e0 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20  EM cell holding 
246f0 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 63  data for the rec
24700 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
24710 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b 65  ed */.  Mem *pKe
24720 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  y;        /* MEM
24730 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b 65   cell holding ke
24740 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  y  for the recor
24750 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  d */.  VdbeCurso
24760 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72 73  r *pC;   /* Curs
24770 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74 6f  or to table into
24780 20 77 68 69 63 68 20 69 6e 73 65 72 74 20 69 73   which insert is
24790 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
247a0 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20  t seekResult;   
247b0 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69  /* Result of pri
247c0 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66 20  or seek or 0 if 
247d0 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c 54  no USESEEKRESULT
247e0 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73 74   flag */.  const
247f0 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a 20   char *zDb;  /* 
24800 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d 20  database name - 
24810 75 73 65 64 20 62 79 20 74 68 65 20 75 70 64 61  used by the upda
24820 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61 62  te hook */.  Tab
24830 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 2f  le *pTab;      /
24840 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
24850 65 20 2d 20 75 73 65 64 20 62 79 20 75 70 64 61  e - used by upda
24860 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64 61 74  te and pre-updat
24870 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69 6e 74  e hooks */.  int
24880 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f   op;           /
24890 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 75 70 64  * Opcode for upd
248a0 61 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54 45  ate hook: SQLITE
248b0 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c 49 54  _UPDATE or SQLIT
248c0 45 5f 49 4e 53 45 52 54 20 2a 2f 0a 20 20 42 74  E_INSERT */.  Bt
248d0 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 20 20 20  reePayload x;   
248e0 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20 62 65  /* Payload to be
248f0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
24900 6f 70 20 3d 20 30 3b 0a 20 20 70 44 61 74 61 20  op = 0;.  pData 
24910 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
24920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
24930 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
24940 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
24950 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
24960 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20  alid(pData) );. 
24970 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
24980 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
24990 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
249a0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
249b0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
249c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
249d0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
249e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
249f0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
24a00 49 53 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d 3e 69  ISNOOP) || pC->i
24a10 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
24a20 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
24a30 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70 4f 70  =P4_TABLE || pOp
24a40 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53 54 41  ->p4type>=P4_STA
24a50 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53 54 45  TIC );.  REGISTE
24a60 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
24a70 20 70 44 61 74 61 29 3b 0a 0a 20 20 69 66 28 20   pData);..  if( 
24a80 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
24a90 49 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 70 4b  Insert ){.    pK
24aa0 65 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ey = &aMem[pOp->
24ab0 70 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  p3];.    assert(
24ac0 20 70 4b 65 79 2d 3e 66 6c 61 67 73 20 26 20 4d   pKey->flags & M
24ad0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 61 73  EM_Int );.    as
24ae0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
24af0 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 52 45  (pKey) );.    RE
24b00 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
24b10 2d 3e 70 33 2c 20 70 4b 65 79 29 3b 0a 20 20 20  ->p3, pKey);.   
24b20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b 65 79 2d 3e   x.nKey = pKey->
24b30 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  u.i;.  }else{.  
24b40 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
24b50 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 73 65 72 74  pcode==OP_Insert
24b60 49 6e 74 20 29 3b 0a 20 20 20 20 78 2e 6e 4b 65  Int );.    x.nKe
24b70 79 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d  y = pOp->p3;.  }
24b80 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  ..  if( pOp->p4t
24b90 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26  ype==P4_TABLE &&
24ba0 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b   HAS_UPDATE_HOOK
24bb0 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65  (db) ){.    asse
24bc0 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
24bd0 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e  ;.    zDb = db->
24be0 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62  aDb[pC->iDb].zDb
24bf0 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20  SName;.    pTab 
24c00 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a  = pOp->p4.pTab;.
24c10 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70      assert( (pOp
24c20 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53  ->p5 & OPFLAG_IS
24c30 4e 4f 4f 50 29 20 7c 7c 20 48 61 73 52 6f 77 69  NOOP) || HasRowi
24c40 64 28 70 54 61 62 29 20 29 3b 0a 20 20 20 20 6f  d(pTab) );.    o
24c50 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  p = ((pOp->p5 & 
24c60 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29  OPFLAG_ISUPDATE)
24c70 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45   ? SQLITE_UPDATE
24c80 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54   : SQLITE_INSERT
24c90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24ca0 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e 6f 74  pTab = 0; /* Not
24cb0 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63   needed.  Silenc
24cc0 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
24cd0 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a 44 62  ning. */.    zDb
24ce0 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
24cf0 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61  eded.  Silence a
24d00 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
24d10 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65  g. */.  }..#ifde
24d20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
24d30 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20  PREUPDATE_HOOK. 
24d40 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70   /* Invoke the p
24d50 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20  re-update hook, 
24d60 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20  if any */.  if( 
24d70 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
24d80 6c 6c 62 61 63 6b 20 0a 20 20 20 26 26 20 70 4f  llback .   && pO
24d90 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
24da0 42 4c 45 0a 20 20 20 26 26 20 21 28 70 4f 70 2d  BLE.   && !(pOp-
24db0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  >p5 & OPFLAG_ISU
24dc0 50 44 41 54 45 29 0a 20 20 29 7b 0a 20 20 20 20  PDATE).  ){.    
24dd0 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
24de0 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20  dateHook(p, pC, 
24df0 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a  SQLITE_INSERT, z
24e00 44 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79  Db, pTab, x.nKey
24e10 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 7d 0a  , pOp->p2);.  }.
24e20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
24e30 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20 29 20  OPFLAG_ISNOOP ) 
24e40 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
24e50 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f   if( pOp->p5 & O
24e60 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 20  PFLAG_NCHANGE ) 
24e70 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20  p->nChange++;.  
24e80 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50  if( pOp->p5 & OP
24e90 46 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 29  FLAG_LASTROWID )
24ea0 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
24eb0 20 78 2e 6e 4b 65 79 3b 0a 20 20 69 66 28 20 70   x.nKey;.  if( p
24ec0 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45  Data->flags & ME
24ed0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 78 2e  M_Null ){.    x.
24ee0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 78  pData = 0;.    x
24ef0 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65  .nData = 0;.  }e
24f00 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
24f10 20 70 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 20   pData->flags & 
24f20 28 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74  (MEM_Blob|MEM_St
24f30 72 29 20 29 3b 0a 20 20 20 20 78 2e 70 44 61 74  r) );.    x.pDat
24f40 61 20 3d 20 70 44 61 74 61 2d 3e 7a 3b 0a 20 20  a = pData->z;.  
24f50 20 20 78 2e 6e 44 61 74 61 20 3d 20 70 44 61 74    x.nData = pDat
24f60 61 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 73 65 65 6b  a->n;.  }.  seek
24f70 52 65 73 75 6c 74 20 3d 20 28 28 70 4f 70 2d 3e  Result = ((pOp->
24f80 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45 53  p5 & OPFLAG_USES
24f90 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43 2d  EEKRESULT) ? pC-
24fa0 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30 29  >seekResult : 0)
24fb0 3b 0a 20 20 69 66 28 20 70 44 61 74 61 2d 3e 66  ;.  if( pData->f
24fc0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
24fd0 29 7b 0a 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d  ){.    x.nZero =
24fe0 20 70 44 61 74 61 2d 3e 75 2e 6e 5a 65 72 6f 3b   pData->u.nZero;
24ff0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e  .  }else{.    x.
25000 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
25010 20 78 2e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 72   x.pKey = 0;.  r
25020 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25030 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43  Insert(pC->uc.pC
25040 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20  ursor, &x,.     
25050 20 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46   (pOp->p5 & (OPF
25060 4c 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41  LAG_APPEND|OPFLA
25070 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 29  G_SAVEPOSITION))
25080 2c 20 73 65 65 6b 52 65 73 75 6c 74 0a 20 20 29  , seekResult.  )
25090 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
250a0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
250b0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
250c0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 0a 20 20  CACHE_STALE;..  
250d0 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70  /* Invoke the up
250e0 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
250f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
25100 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
25110 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
25120 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65 43  if( db->xUpdateC
25130 61 6c 6c 62 61 63 6b 20 26 26 20 6f 70 20 29 7b  allback && op ){
25140 0a 20 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65  .    db->xUpdate
25150 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70  Callback(db->pUp
25160 64 61 74 65 41 72 67 2c 20 6f 70 2c 20 7a 44 62  dateArg, op, zDb
25170 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 78  , pTab->zName, x
25180 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 62 72  .nKey);.  }.  br
25190 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
251a0 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50 32 20  e: Delete P1 P2 
251b0 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44  P3 P4 P5.**.** D
251c0 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f 72 64  elete the record
251d0 20 61 74 20 77 68 69 63 68 20 74 68 65 20 50 31   at which the P1
251e0 20 63 75 72 73 6f 72 20 69 73 20 63 75 72 72 65   cursor is curre
251f0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
25200 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
25210 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20  AG_SAVEPOSITION 
25220 62 69 74 20 6f 66 20 74 68 65 20 50 35 20 70 61  bit of the P5 pa
25230 72 61 6d 65 74 65 72 20 69 73 20 73 65 74 2c 20  rameter is set, 
25240 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73  then.** the curs
25250 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  or will be left 
25260 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65 69 74  pointing at  eit
25270 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f 72 20  her the next or 
25280 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
25290 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 74 61  record in the ta
252a0 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20 6c 65  ble. If it is le
252b0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  ft pointing at t
252c0 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 2c 20  he next record, 
252d0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65 78 74  then.** the next
252e0 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   Next instructio
252f0 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  n will be a no-o
25300 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74 2c 20  p. As a result, 
25310 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  in this case.** 
25320 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65 6c 65  it is ok to dele
25330 74 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  te a record from
25340 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74 20 6c   within a Next l
25350 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50 46 4c  oop. If .** OPFL
25360 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20  AG_SAVEPOSITION 
25370 62 69 74 20 6f 66 20 50 35 20 69 73 20 63 6c 65  bit of P5 is cle
25380 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
25390 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 6c  sor will be.** l
253a0 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65 66 69  eft in an undefi
253b0 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ned state..**.**
253c0 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 41   If the OPFLAG_A
253d0 55 58 44 45 4c 45 54 45 20 62 69 74 20 69 73 20  UXDELETE bit is 
253e0 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61 74 20  set on P5, that 
253f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
25400 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20 6f 6e  his.** delete on
25410 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61 73 73  e of several ass
25420 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 65 6c  ociated with del
25430 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20 72 6f  eting a table ro
25440 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a 2a 2a  w and all its.**
25450 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 65   associated inde
25460 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78 61 63  x entries.  Exac
25470 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  tly one of those
25480 20 64 65 6c 65 74 65 73 20 69 73 20 74 68 65 20   deletes is the 
25490 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64 65 6c  "primary".** del
254a0 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65 72 73  ete.  The others
254b0 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50 46 4c   are all on OPFL
254c0 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63 75 72  AG_FORDELETE cur
254d0 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61 72 65  sors or else are
254e0 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74 68 20  .** marked with 
254f0 74 68 65 20 41 55 58 44 45 4c 45 54 45 20 66 6c  the AUXDELETE fl
25500 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ag..**.** If the
25510 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
25520 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42 3a 20  flag of P2 (NB: 
25530 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20 73 65  P2 not P5) is se
25540 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 0a  t, then the row.
25550 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 20  ** change count 
25560 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28  is incremented (
25570 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 0a  otherwise not)..
25580 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20 6e 6f  **.** P1 must no
25590 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61 62 6c  t be pseudo-tabl
255a0 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20 62 65  e.  It has to be
255b0 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20 77 69   a real table wi
255c0 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  th.** multiple r
255d0 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  ows..**.** If P4
255e0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
255f0 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  n it points to a
25600 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 20 49   Table object. I
25610 6e 20 74 68 69 73 20 63 61 73 65 20 65 69 74 68  n this case eith
25620 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64 61 74  er .** the updat
25630 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 20  e or pre-update 
25640 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c 20 6d  hook, or both, m
25650 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e 20 54  ay be invoked. T
25660 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73  he P1 cursor mus
25670 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 70  t.** have been p
25680 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e 67 20  ositioned using 
25690 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72 69 6f  OP_NotFound prio
256a0 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
256b0 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a 2a 2a  is opcode in .**
256c0 20 74 68 69 73 20 63 61 73 65 2e 20 53 70 65 63   this case. Spec
256d0 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f 6e 65  ifically, if one
256e0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20   is configured, 
256f0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
25700 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76 6f 6b  ook is .** invok
25710 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f 74 20  ed if P4 is not 
25720 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61 74 65  NULL. The update
25730 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64  -hook is invoked
25740 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69   if one is confi
25750 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20 69 73  gured, .** P4 is
25760 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 74   not NULL, and t
25770 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
25780 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  E flag is set in
25790 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
257a0 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  e OPFLAG_ISUPDAT
257b0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  E flag is set in
257c0 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63 6f 6e   P2, then P3 con
257d0 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73  tains the addres
257e0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f  s.** of the memo
257f0 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63 6f 6e  ry cell that con
25800 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
25810 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
25820 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c 0a 2a  f the row will.*
25830 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79 20 74  * be set to by t
25840 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61  he update..*/.ca
25850 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20 7b 0a  se OP_Delete: {.
25860 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
25870 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25880 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  zDb;.  Table *pT
25890 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c 61 67  ab;.  int opflag
258a0 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20 3d 20  s;..  opflags = 
258b0 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
258c0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
258d0 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
258e0 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
258f0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
25900 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
25910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25920 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
25930 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
25940 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
25950 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
25960 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
25970 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 0a  edMoveto==0 );..
25980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25990 42 55 47 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  BUG.  if( pOp->p
259a0 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
259b0 26 26 20 48 61 73 52 6f 77 69 64 28 70 4f 70 2d  && HasRowid(pOp-
259c0 3e 70 34 2e 70 54 61 62 29 20 26 26 20 70 4f 70  >p4.pTab) && pOp
259d0 2d 3e 70 35 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ->p5==0 ){.    /
259e0 2a 20 49 66 20 70 35 20 69 73 20 7a 65 72 6f 2c  * If p5 is zero,
259f0 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61 74   the seek operat
25a00 69 6f 6e 20 74 68 61 74 20 70 6f 73 69 74 69 6f  ion that positio
25a10 6e 65 64 20 74 68 65 20 63 75 72 73 6f 72 20 70  ned the cursor p
25a20 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 4f  rior to.    ** O
25a30 50 5f 44 65 6c 65 74 65 20 77 69 6c 6c 20 68 61  P_Delete will ha
25a40 76 65 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  ve also set the 
25a50 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  pC->movetoTarget
25a60 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 72 6f   field to the ro
25a70 77 69 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  wid of.    ** th
25a80 65 20 72 6f 77 20 74 68 61 74 20 69 73 20 62 65  e row that is be
25a90 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
25aa0 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 73 71     i64 iKey = sq
25ab0 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
25ac0 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72  rKey(pC->uc.pCur
25ad0 73 6f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sor);.    assert
25ae0 28 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  ( pC->movetoTarg
25af0 65 74 3d 3d 69 4b 65 79 20 29 3b 0a 20 20 7d 0a  et==iKey );.  }.
25b00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
25b10 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
25b20 6f 72 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f  or pre-update-ho
25b30 6f 6b 20 77 69 6c 6c 20 62 65 20 69 6e 76 6f 6b  ok will be invok
25b40 65 64 2c 20 73 65 74 20 7a 44 62 20 74 6f 0a 20  ed, set zDb to. 
25b50 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   ** the name of 
25b60 74 68 65 20 64 62 20 74 6f 20 70 61 73 73 20 61  the db to pass a
25b70 73 20 74 6f 20 69 74 2e 20 41 6c 73 6f 20 73 65  s to it. Also se
25b80 74 20 6c 6f 63 61 6c 20 70 54 61 62 20 74 6f 20  t local pTab to 
25b90 61 20 63 6f 70 79 0a 20 20 2a 2a 20 6f 66 20 70  a copy.  ** of p
25ba0 34 2e 70 54 61 62 2e 20 46 69 6e 61 6c 6c 79 2c  4.pTab. Finally,
25bb0 20 69 66 20 70 35 20 69 73 20 74 72 75 65 2c 20   if p5 is true, 
25bc0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
25bd0 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73 0a  this cursor was.
25be0 20 20 2a 2a 20 6c 61 73 74 20 6d 6f 76 65 64 20    ** last moved 
25bf0 77 69 74 68 20 4f 50 5f 4e 65 78 74 20 6f 72 20  with OP_Next or 
25c00 4f 50 5f 50 72 65 76 2c 20 6e 6f 74 20 53 65 65  OP_Prev, not See
25c10 6b 20 6f 72 20 4e 6f 74 46 6f 75 6e 64 2c 20 73  k or NotFound, s
25c20 65 74 20 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  et .  ** VdbeCur
25c30 73 6f 72 2e 6d 6f 76 65 74 6f 54 61 72 67 65 74  sor.movetoTarget
25c40 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
25c50 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 69 66 28  rowid.  */.  if(
25c60 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
25c70 5f 54 41 42 4c 45 20 26 26 20 48 41 53 5f 55 50  _TABLE && HAS_UP
25c80 44 41 54 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b  DATE_HOOK(db) ){
25c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
25ca0 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 61  >iDb>=0 );.    a
25cb0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
25cc0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 7a 44  Tab!=0 );.    zD
25cd0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e  b = db->aDb[pC->
25ce0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
25cf0 20 20 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70     pTab = pOp->p
25d00 34 2e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  4.pTab;.    if( 
25d10 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
25d20 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 21  G_SAVEPOSITION)!
25d30 3d 30 20 26 26 20 70 43 2d 3e 69 73 54 61 62 6c  =0 && pC->isTabl
25d40 65 20 29 7b 0a 20 20 20 20 20 20 70 43 2d 3e 6d  e ){.      pC->m
25d50 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 73 71  ovetoTarget = sq
25d60 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
25d70 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43 75 72  rKey(pC->uc.pCur
25d80 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sor);.    }.  }e
25d90 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 30  lse{.    zDb = 0
25da0 3b 20 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65  ;   /* Not neede
25db0 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f  d.  Silence a co
25dc0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20  mpiler warning. 
25dd0 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  */.    pTab = 0;
25de0 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e    /* Not needed.
25df0 20 20 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70    Silence a comp
25e00 69 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f  iler warning. */
25e10 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
25e20 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
25e30 44 41 54 45 5f 48 4f 4f 4b 0a 20 20 2f 2a 20 49  DATE_HOOK.  /* I
25e40 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
25e50 64 61 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71  date-hook if req
25e60 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
25e70 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
25e80 6c 6c 62 61 63 6b 20 26 26 20 70 4f 70 2d 3e 70  llback && pOp->p
25e90 34 2e 70 54 61 62 20 29 7b 0a 20 20 20 20 61 73  4.pTab ){.    as
25ea0 73 65 72 74 28 20 21 28 6f 70 66 6c 61 67 73 20  sert( !(opflags 
25eb0 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
25ec0 45 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  E) .         || 
25ed0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 3d 3d  HasRowid(pTab)==
25ee0 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  0 .         || (
25ef0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66 6c  aMem[pOp->p3].fl
25f00 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 0a  ags & MEM_Int) .
25f10 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
25f20 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48  e3VdbePreUpdateH
25f30 6f 6f 6b 28 70 2c 20 70 43 2c 0a 20 20 20 20 20  ook(p, pC,.     
25f40 20 20 20 28 6f 70 66 6c 61 67 73 20 26 20 4f 50     (opflags & OP
25f50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 29 20 3f  FLAG_ISUPDATE) ?
25f60 20 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 3a   SQLITE_UPDATE :
25f70 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
25f80 0a 20 20 20 20 20 20 20 20 7a 44 62 2c 20 70 54  .        zDb, pT
25f90 61 62 2c 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61  ab, pC->movetoTa
25fa0 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 70 4f  rget,.        pO
25fb0 70 2d 3e 70 33 0a 20 20 20 20 29 3b 0a 20 20 7d  p->p3.    );.  }
25fc0 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20 26  .  if( opflags &
25fd0 20 4f 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 20 29   OPFLAG_ISNOOP )
25fe0 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20   break;.#endif. 
25ff0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 66 6c 61 67 73  .  /* Only flags
26000 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65 74   that can be set
26010 20 61 72 65 20 53 41 56 45 50 4f 49 53 54 49 4f   are SAVEPOISTIO
26020 4e 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45 20  N and AUXDELETE 
26030 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 28 70  */ .  assert( (p
26040 4f 70 2d 3e 70 35 20 26 20 7e 28 4f 50 46 4c 41  Op->p5 & ~(OPFLA
26050 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 7c 4f  G_SAVEPOSITION|O
26060 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 29  PFLAG_AUXDELETE)
26070 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
26080 28 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  ( OPFLAG_SAVEPOS
26090 49 54 49 4f 4e 3d 3d 42 54 52 45 45 5f 53 41 56  ITION==BTREE_SAV
260a0 45 50 4f 53 49 54 49 4f 4e 20 29 3b 0a 20 20 61  EPOSITION );.  a
260b0 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 41 55  ssert( OPFLAG_AU
260c0 58 44 45 4c 45 54 45 3d 3d 42 54 52 45 45 5f 41  XDELETE==BTREE_A
260d0 55 58 44 45 4c 45 54 45 20 29 3b 0a 0a 23 69 66  UXDELETE );..#if
260e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
260f0 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
26100 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
26110 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 3d 3d  C->isEphemeral==
26120 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  0.        && (pO
26130 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41  p->p5 & OPFLAG_A
26140 55 58 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20  UXDELETE)==0.   
26150 20 20 20 20 20 26 26 20 28 70 43 2d 3e 77 72 46       && (pC->wrF
26160 6c 61 67 20 26 20 4f 50 46 4c 41 47 5f 46 4f 52  lag & OPFLAG_FOR
26170 44 45 4c 45 54 45 29 3d 3d 30 0a 20 20 20 20 20  DELETE)==0.     
26180 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
26190 44 65 6c 65 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a  Delete++;.    }.
261a0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20      if( pOp->p2 
261b0 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  & OPFLAG_NCHANGE
261c0 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
261d0 44 65 6c 65 74 65 2d 2d 3b 0a 20 20 20 20 7d 0a  Delete--;.    }.
261e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 63    }.#endif..  rc
261f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44   = sqlite3BtreeD
26200 65 6c 65 74 65 28 70 43 2d 3e 75 63 2e 70 43 75  elete(pC->uc.pCu
26210 72 73 6f 72 2c 20 70 4f 70 2d 3e 70 35 29 3b 0a  rsor, pOp->p5);.
26220 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
26230 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
26240 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c  .  pC->seekResul
26250 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20  t = 0;.  if( rc 
26260 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
26270 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a  _to_error;..  /*
26280 20 49 6e 76 6f 6b 65 20 74 68 65 20 75 70 64 61   Invoke the upda
26290 74 65 2d 68 6f 6f 6b 20 69 66 20 72 65 71 75 69  te-hook if requi
262a0 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 70  red. */.  if( op
262b0 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4e  flags & OPFLAG_N
262c0 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 70 2d  CHANGE ){.    p-
262d0 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20 20  >nChange++;.    
262e0 69 66 28 20 64 62 2d 3e 78 55 70 64 61 74 65 43  if( db->xUpdateC
262f0 61 6c 6c 62 61 63 6b 20 26 26 20 48 61 73 52 6f  allback && HasRo
26300 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
26310 20 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61     db->xUpdateCa
26320 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 55 70 64 61  llback(db->pUpda
26330 74 65 41 72 67 2c 20 53 51 4c 49 54 45 5f 44 45  teArg, SQLITE_DE
26340 4c 45 54 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d  LETE, zDb, pTab-
26350 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
26360 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
26370 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  et);.      asser
26380 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b  t( pC->iDb>=0 );
26390 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 72  .    }.  }..  br
263a0 65 61 6b 3b 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65  eak;.}./* Opcode
263b0 3a 20 52 65 73 65 74 43 6f 75 6e 74 20 2a 20 2a  : ResetCount * *
263c0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65   * * *.**.** The
263d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
263e0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73 20  ange counter is 
263f0 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 64 61  copied to the da
26400 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
26410 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
26420 28 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62  (returned by sub
26430 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
26440 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
26450 28 29 29 2e 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ())..** Then the
26460 20 56 4d 73 20 69 6e 74 65 72 6e 61 6c 20 63 68   VMs internal ch
26470 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 72 65 73  ange counter res
26480 65 74 73 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 69  ets to 0..** Thi
26490 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72 69  s is used by tri
264a0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 2a  gger programs..*
264b0 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74 43  /.case OP_ResetC
264c0 6f 75 6e 74 3a 20 7b 0a 20 20 73 71 6c 69 74 65  ount: {.  sqlite
264d0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
264e0 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
264f0 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
26500 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  0;.  break;.}../
26510 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72  * Opcode: Sorter
26520 43 6f 6d 70 61 72 65 20 50 31 20 50 32 20 50 33  Compare P1 P2 P3
26530 20 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P4.** Synopsis:
26540 20 69 66 20 6b 65 79 28 50 31 29 21 3d 74 72 69   if key(P1)!=tri
26550 6d 28 72 5b 50 33 5d 2c 50 34 29 20 67 6f 74 6f  m(r[P3],P4) goto
26560 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20   P2.**.** P1 is 
26570 61 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e  a sorter cursor.
26580 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
26590 6e 20 63 6f 6d 70 61 72 65 73 20 61 20 70 72 65  n compares a pre
265a0 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  fix of the.** re
265b0 63 6f 72 64 20 62 6c 6f 62 20 69 6e 20 72 65 67  cord blob in reg
265c0 69 73 74 65 72 20 50 33 20 61 67 61 69 6e 73 74  ister P3 against
265d0 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
265e0 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
265f0 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
26600 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
26610 74 73 20 74 6f 2e 20 20 4f 6e 6c 79 20 74 68 65  ts to.  Only the
26620 20 66 69 72 73 74 20 50 34 20 66 69 65 6c 64 73   first P4 fields
26630 0a 2a 2a 20 6f 66 20 72 5b 50 33 5d 20 61 6e 64  .** of r[P3] and
26640 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f   the sorter reco
26650 72 64 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  rd are compared.
26660 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
26670 20 50 33 20 6f 72 20 74 68 65 20 73 6f 72 74 65   P3 or the sorte
26680 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  r contains a NUL
26690 4c 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 69  L in one of thei
266a0 72 20 73 69 67 6e 69 66 69 63 61 6e 74 0a 2a 2a  r significant.**
266b0 20 66 69 65 6c 64 73 20 28 6e 6f 74 20 63 6f 75   fields (not cou
266c0 6e 74 69 6e 67 20 74 68 65 20 50 34 20 66 69 65  nting the P4 fie
266d0 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64 20 77  lds at the end w
266e0 68 69 63 68 20 61 72 65 20 69 67 6e 6f 72 65 64  hich are ignored
266f0 29 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 6f  ) then.** the co
26700 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 73 73 75  mparison is assu
26710 6d 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e  med to be equal.
26720 0a 2a 2a 0a 2a 2a 20 46 61 6c 6c 20 74 68 72 6f  .**.** Fall thro
26730 75 67 68 20 74 6f 20 6e 65 78 74 20 69 6e 73 74  ugh to next inst
26740 72 75 63 74 69 6f 6e 20 69 66 20 74 68 65 20 74  ruction if the t
26750 77 6f 20 72 65 63 6f 72 64 73 20 63 6f 6d 70 61  wo records compa
26760 72 65 20 65 71 75 61 6c 20 74 6f 0a 2a 2a 20 65  re equal to.** e
26770 61 63 68 20 6f 74 68 65 72 2e 20 20 4a 75 6d 70  ach other.  Jump
26780 20 74 6f 20 50 32 20 69 66 20 74 68 65 79 20 61   to P2 if they a
26790 72 65 20 64 69 66 66 65 72 65 6e 74 2e 0a 2a 2f  re different..*/
267a0 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 43  .case OP_SorterC
267b0 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 56 64 62 65  ompare: {.  Vdbe
267c0 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e  Cursor *pC;.  in
267d0 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 4b 65  t res;.  int nKe
267e0 79 43 6f 6c 3b 0a 0a 20 20 70 43 20 3d 20 70 2d  yCol;..  pC = p-
267f0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
26800 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72  .  assert( isSor
26810 74 65 72 28 70 43 29 20 29 3b 0a 20 20 61 73 73  ter(pC) );.  ass
26820 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
26830 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
26840 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
26850 2d 3e 70 33 5d 3b 0a 20 20 6e 4b 65 79 43 6f 6c  ->p3];.  nKeyCol
26860 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
26870 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  res = 0;.  rc = 
26880 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
26890 72 43 6f 6d 70 61 72 65 28 70 43 2c 20 70 49 6e  rCompare(pC, pIn
268a0 33 2c 20 6e 4b 65 79 43 6f 6c 2c 20 26 72 65 73  3, nKeyCol, &res
268b0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
268c0 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a  aken(res!=0,2);.
268d0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
268e0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
268f0 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20  or;.  if( res ) 
26900 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
26910 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a  .  break;.};../*
26920 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 44   Opcode: SorterD
26930 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ata P1 P2 P3 * *
26940 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
26950 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20 57  P2]=data.**.** W
26960 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73 74  rite into regist
26970 65 72 20 50 32 20 74 68 65 20 63 75 72 72 65 6e  er P2 the curren
26980 74 20 73 6f 72 74 65 72 20 64 61 74 61 20 66 6f  t sorter data fo
26990 72 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20  r sorter cursor 
269a0 50 31 2e 0a 2a 2a 20 54 68 65 6e 20 63 6c 65 61  P1..** Then clea
269b0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 65 61  r the column hea
269c0 64 65 72 20 63 61 63 68 65 20 6f 6e 20 63 75 72  der cache on cur
269d0 73 6f 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68  sor P3..**.** Th
269e0 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 72  is opcode is nor
269f0 6d 61 6c 6c 79 20 75 73 65 20 74 6f 20 6d 6f 76  mally use to mov
26a00 65 20 61 20 72 65 63 6f 72 64 20 6f 75 74 20 6f  e a record out o
26a10 66 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  f the sorter and
26a20 20 69 6e 74 6f 0a 2a 2a 20 61 20 72 65 67 69 73   into.** a regis
26a30 74 65 72 20 74 68 61 74 20 69 73 20 74 68 65 20  ter that is the 
26a40 73 6f 75 72 63 65 20 66 6f 72 20 61 20 70 73 65  source for a pse
26a50 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72  udo-table cursor
26a60 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 2a   created using.*
26a70 2a 20 4f 70 65 6e 50 73 65 75 64 6f 2e 20 20 54  * OpenPseudo.  T
26a80 68 61 74 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  hat pseudo-table
26a90 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 20 6f   cursor is the o
26aa0 6e 65 20 74 68 61 74 20 69 73 20 69 64 65 6e 74  ne that is ident
26ab0 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 72 61  ified by.** para
26ac0 6d 65 74 65 72 20 50 33 2e 20 20 43 6c 65 61 72  meter P3.  Clear
26ad0 69 6e 67 20 74 68 65 20 50 33 20 63 6f 6c 75 6d  ing the P3 colum
26ae0 6e 20 63 61 63 68 65 20 61 73 20 70 61 72 74 20  n cache as part 
26af0 6f 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73  of this opcode s
26b00 61 76 65 73 0a 2a 2a 20 75 73 20 66 72 6f 6d 20  aves.** us from 
26b10 68 61 76 69 6e 67 20 74 6f 20 69 73 73 75 65 20  having to issue 
26b20 61 20 73 65 70 61 72 61 74 65 20 4e 75 6c 6c 52  a separate NullR
26b30 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ow instruction t
26b40 6f 20 63 6c 65 61 72 20 74 68 61 74 20 63 61 63  o clear that cac
26b50 68 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  he..*/.case OP_S
26b60 6f 72 74 65 72 44 61 74 61 3a 20 7b 0a 20 20 56  orterData: {.  V
26b70 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 0a  dbeCursor *pC;..
26b80 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
26b90 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 43 20 3d 20  Op->p2];.  pC = 
26ba0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
26bb0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
26bc0 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 72  orter(pC) );.  r
26bd0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  c = sqlite3VdbeS
26be0 6f 72 74 65 72 52 6f 77 6b 65 79 28 70 43 2c 20  orterRowkey(pC, 
26bf0 70 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74 28  pOut);.  assert(
26c00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
26c10 7c 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 20 26  | (pOut->flags &
26c20 20 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20   MEM_Blob) );.  
26c30 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
26c40 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
26c50 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66  >nCursor );.  if
26c60 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
26c70 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
26c80 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e    p->apCsr[pOp->
26c90 70 33 5d 2d 3e 63 61 63 68 65 53 74 61 74 75 73  p3]->cacheStatus
26ca0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
26cb0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
26cc0 70 63 6f 64 65 3a 20 52 6f 77 44 61 74 61 20 50  pcode: RowData P
26cd0 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
26ce0 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64  ynopsis: r[P2]=d
26cf0 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ata.**.** Write 
26d00 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
26d10 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 6f   the complete ro
26d20 77 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68  w content for th
26d30 65 20 72 6f 77 20 61 74 20 0a 2a 2a 20 77 68 69  e row at .** whi
26d40 63 68 20 63 75 72 73 6f 72 20 50 31 20 69 73 20  ch cursor P1 is 
26d50 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
26d60 6e 67 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ng..** There is 
26d70 6e 6f 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  no interpretatio
26d80 6e 20 6f 66 20 74 68 65 20 64 61 74 61 2e 20 20  n of the data.  
26d90 0a 2a 2a 20 49 74 20 69 73 20 6a 75 73 74 20 63  .** It is just c
26da0 6f 70 69 65 64 20 6f 6e 74 6f 20 74 68 65 20 50  opied onto the P
26db0 32 20 72 65 67 69 73 74 65 72 20 65 78 61 63 74  2 register exact
26dc0 6c 79 20 61 73 20 0a 2a 2a 20 69 74 20 69 73 20  ly as .** it is 
26dd0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
26de0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
26df0 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 69  * If cursor P1 i
26e00 73 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 6e  s an index, then
26e10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
26e20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 72  the key of the r
26e30 6f 77 2e 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ow..** If cursor
26e40 20 50 32 20 69 73 20 61 20 74 61 62 6c 65 2c 20   P2 is a table, 
26e50 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
26e60 20 65 78 74 72 61 63 74 65 64 20 69 73 20 74 68   extracted is th
26e70 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 49 66  e data..**.** If
26e80 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   the P1 cursor m
26e90 75 73 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ust be pointing 
26ea0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 28  to a valid row (
26eb0 6e 6f 74 20 61 20 4e 55 4c 4c 20 72 6f 77 29 0a  not a NULL row).
26ec0 2a 2a 20 6f 66 20 61 20 72 65 61 6c 20 74 61 62  ** of a real tab
26ed0 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f  le, not a pseudo
26ee0 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  -table..**.** If
26ef0 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68 69 73   P3!=0 then this
26f00 20 6f 70 63 6f 64 65 20 69 73 20 61 6c 6c 6f 77   opcode is allow
26f10 65 64 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 70  ed to make an ep
26f20 68 65 72 6d 65 72 61 6c 20 70 6f 69 6e 74 65 72  hermeral pointer
26f30 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74  .** into the dat
26f40 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 61  abase page.  Tha
26f50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
26f60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
26f70 6f 75 74 70 75 74 0a 2a 2a 20 72 65 67 69 73 74  output.** regist
26f80 65 72 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  er will be inval
26f90 69 64 61 74 65 64 20 61 73 20 73 6f 6f 6e 20 61  idated as soon a
26fa0 73 20 74 68 65 20 63 75 72 73 6f 72 20 6d 6f 76  s the cursor mov
26fb0 65 73 20 2d 20 69 6e 63 6c 75 64 69 6e 67 0a 2a  es - including.*
26fc0 2a 20 6d 6f 76 65 73 20 63 61 75 73 65 64 20 62  * moves caused b
26fd0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
26fe0 74 68 61 74 20 22 73 61 76 65 22 20 74 68 65 20  that "save" the 
26ff0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
27000 6f 72 73 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  ors.** position 
27010 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  in order that th
27020 65 79 20 63 61 6e 20 77 72 69 74 65 20 74 6f 20  ey can write to 
27030 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
27040 20 49 66 20 50 33 3d 3d 30 0a 2a 2a 20 74 68 65   If P3==0.** the
27050 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
27060 64 61 74 61 20 69 73 20 6d 61 64 65 20 69 6e 74  data is made int
27070 6f 20 6d 65 6d 6f 72 79 2e 20 20 50 33 21 3d 30  o memory.  P3!=0
27080 20 69 73 20 66 61 73 74 65 72 2c 20 62 75 74 0a   is faster, but.
27090 2a 2a 20 50 33 3d 3d 30 20 69 73 20 73 61 66 65  ** P3==0 is safe
270a0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 21 3d  r..**.** If P3!=
270b0 30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  0 then the conte
270c0 6e 74 20 6f 66 20 74 68 65 20 50 32 20 72 65 67  nt of the P2 reg
270d0 69 73 74 65 72 20 69 73 20 75 6e 73 75 69 74 61  ister is unsuita
270e0 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69  ble for use.** i
270f0 6e 20 4f 50 5f 52 65 73 75 6c 74 20 61 6e 64 20  n OP_Result and 
27100 61 6e 79 20 4f 50 5f 52 65 73 75 6c 74 20 77 69  any OP_Result wi
27110 6c 6c 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  ll invalidate th
27120 65 20 50 32 20 72 65 67 69 73 74 65 72 20 63 6f  e P2 register co
27130 6e 74 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 50 32  ntent..** The P2
27140 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 65 6e   register conten
27150 74 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64  t is invalidated
27160 20 62 79 20 6f 70 63 6f 64 65 73 20 6c 69 6b 65   by opcodes like
27170 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 72 0a   OP_Function or.
27180 2a 2a 20 62 79 20 61 6e 79 20 75 73 65 20 6f 66  ** by any use of
27190 20 61 6e 6f 74 68 65 72 20 63 75 72 73 6f 72 20   another cursor 
271a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
271b0 73 61 6d 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63  same table..*/.c
271c0 61 73 65 20 4f 50 5f 52 6f 77 44 61 74 61 3a 20  ase OP_RowData: 
271d0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
271e0 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
271f0 70 43 72 73 72 3b 0a 20 20 75 33 32 20 6e 3b 0a  pCrsr;.  u32 n;.
27200 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
27210 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
27220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
27230 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
27240 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
27250 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
27260 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
27270 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
27280 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
27290 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
272a0 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
272b0 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 30   isSorter(pC)==0
272c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
272d0 2d 3e 6e 75 6c 6c 52 6f 77 3d 3d 30 20 29 3b 0a  ->nullRow==0 );.
272e0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
272f0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
27300 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
27310 70 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 54  pCursor;..  /* T
27320 68 65 20 4f 50 5f 52 6f 77 44 61 74 61 20 6f 70  he OP_RowData op
27330 63 6f 64 65 73 20 61 6c 77 61 79 73 20 66 6f 6c  codes always fol
27340 6c 6f 77 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  low OP_NotExists
27350 20 6f 72 0a 20 20 2a 2a 20 4f 50 5f 53 65 65 6b   or.  ** OP_Seek
27360 52 6f 77 69 64 20 6f 72 20 4f 50 5f 52 65 77 69  Rowid or OP_Rewi
27370 6e 64 2f 4f 70 5f 4e 65 78 74 20 77 69 74 68 20  nd/Op_Next with 
27380 6e 6f 20 69 6e 74 65 72 76 65 6e 69 6e 67 20 69  no intervening i
27390 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a  nstructions.  **
273a0 20 74 68 61 74 20 6d 69 67 68 74 20 69 6e 76 61   that might inva
273b0 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f  lidate the curso
273c0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  r..  ** If this 
273d0 77 68 65 72 65 20 6e 6f 74 20 74 68 65 20 63 61  where not the ca
273e0 73 65 2c 20 6f 6e 20 6f 66 20 74 68 65 20 66 6f  se, on of the fo
273f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
27400 73 0a 20 20 2a 2a 20 77 6f 75 6c 64 20 66 61 69  s.  ** would fai
27410 6c 2e 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20  l.  Should this 
27420 65 76 65 72 20 63 68 61 6e 67 65 20 28 62 65 63  ever change (bec
27430 61 75 73 65 20 6f 66 20 63 68 61 6e 67 65 73 20  ause of changes 
27440 69 6e 20 74 68 65 20 63 6f 64 65 0a 20 20 2a 2a  in the code.  **
27450 20 67 65 6e 65 72 61 74 6f 72 29 20 74 68 65 6e   generator) then
27460 20 74 68 65 20 66 69 78 20 77 6f 75 6c 64 20 62   the fix would b
27470 65 20 74 6f 20 69 6e 73 65 72 74 20 61 20 63 61  e to insert a ca
27480 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  ll to.  ** sqlit
27490 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
274a0 74 6f 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  to()..  */.  ass
274b0 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
274c0 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
274d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
274e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
274f0 64 28 70 43 72 73 72 29 20 29 3b 0a 23 69 66 20  d(pCrsr) );.#if 
27500 30 20 20 2f 2a 20 4e 6f 74 20 72 65 71 75 69 72  0  /* Not requir
27510 65 64 20 64 75 65 20 74 6f 20 74 68 65 20 70 72  ed due to the pr
27520 65 76 69 6f 75 73 20 74 6f 20 61 73 73 65 72 74  evious to assert
27530 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
27540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
27550 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
27560 70 43 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  pC);.  if( rc!=S
27570 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27580 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
27590 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 20  or;.#endif..  n 
275a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
275b0 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29  yloadSize(pCrsr)
275c0 3b 0a 20 20 69 66 28 20 6e 3e 28 75 33 32 29 64  ;.  if( n>(u32)d
275d0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
275e0 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
275f0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
27600 69 67 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  ig;.  }.  testca
27610 73 65 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 72 63  se( n==0 );.  rc
27620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
27630 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 72 73 72  mFromBtree(pCrsr
27640 2c 20 30 2c 20 6e 2c 20 70 4f 75 74 29 3b 0a 20  , 0, n, pOut);. 
27650 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
27660 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
27670 72 3b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70  r;.  if( !pOp->p
27680 33 20 29 20 44 65 65 70 68 65 6d 65 72 61 6c 69  3 ) Deephemerali
27690 7a 65 28 70 4f 75 74 29 3b 0a 20 20 55 50 44 41  ze(pOut);.  UPDA
276a0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
276b0 70 4f 75 74 29 3b 0a 20 20 52 45 47 49 53 54 45  pOut);.  REGISTE
276c0 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
276d0 20 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b   pOut);.  break;
276e0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
276f0 6f 77 69 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  owid P1 P2 * * *
27700 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
27710 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  P2]=rowid.**.** 
27720 53 74 6f 72 65 20 69 6e 20 72 65 67 69 73 74 65  Store in registe
27730 72 20 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20  r P2 an integer 
27740 77 68 69 63 68 20 69 73 20 74 68 65 20 6b 65 79  which is the key
27750 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
27760 74 72 79 20 74 68 61 74 0a 2a 2a 20 50 31 20 69  try that.** P1 i
27770 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
27780 74 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 63  t to..**.** P1 c
27790 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  an be either an 
277a0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
277b0 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
277c0 65 2e 20 20 54 68 65 72 65 20 75 73 65 64 20 74  e.  There used t
277d0 6f 0a 2a 2a 20 62 65 20 61 20 73 65 70 61 72 61  o.** be a separa
277e0 74 65 20 4f 50 5f 56 52 6f 77 69 64 20 6f 70 63  te OP_VRowid opc
277f0 6f 64 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ode for use with
27800 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c   virtual tables,
27810 20 62 75 74 20 74 68 69 73 0a 2a 2a 20 6f 6e 65   but this.** one
27820 20 6f 70 63 6f 64 65 20 6e 6f 77 20 77 6f 72 6b   opcode now work
27830 73 20 66 6f 72 20 62 6f 74 68 20 74 61 62 6c 65  s for both table
27840 20 74 79 70 65 73 2e 0a 2a 2f 0a 63 61 73 65 20   types..*/.case 
27850 4f 50 5f 52 6f 77 69 64 3a 20 7b 20 20 20 20 20  OP_Rowid: {     
27860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
27870 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ut2 */.  VdbeCur
27880 73 6f 72 20 2a 70 43 3b 0a 20 20 69 36 34 20 76  sor *pC;.  i64 v
27890 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ;.  sqlite3_vtab
278a0 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74   *pVtab;.  const
278b0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
278c0 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 70 4f 75  *pModule;..  pOu
278d0 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
278e0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73  se(p, pOp);.  as
278f0 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
27900 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
27910 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
27920 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
27930 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
27940 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27950 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
27960 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
27970 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
27980 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f    if( pC->nullRo
27990 77 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  w ){.    pOut->f
279a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
279b0 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 65  .    break;.  }e
279c0 6c 73 65 20 69 66 28 20 70 43 2d 3e 64 65 66 65  lse if( pC->defe
279d0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
279e0 20 20 76 20 3d 20 70 43 2d 3e 6d 6f 76 65 74 6f    v = pC->moveto
279f0 54 61 72 67 65 74 3b 0a 23 69 66 6e 64 65 66 20  Target;.#ifndef 
27a00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
27a10 55 41 4c 54 41 42 4c 45 0a 20 20 7d 65 6c 73 65  UALTABLE.  }else
27a20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79 70   if( pC->eCurTyp
27a30 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e==CURTYPE_VTAB 
27a40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27a50 43 2d 3e 75 63 2e 70 56 43 75 72 21 3d 30 20 29  C->uc.pVCur!=0 )
27a60 3b 0a 20 20 20 20 70 56 74 61 62 20 3d 20 70 43  ;.    pVtab = pC
27a70 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
27a80 62 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 20 3d  b;.    pModule =
27a90 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b   pVtab->pModule;
27aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 6f  .    assert( pMo
27ab0 64 75 6c 65 2d 3e 78 52 6f 77 69 64 20 29 3b 0a  dule->xRowid );.
27ac0 20 20 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65      rc = pModule
27ad0 2d 3e 78 52 6f 77 69 64 28 70 43 2d 3e 75 63 2e  ->xRowid(pC->uc.
27ae0 70 56 43 75 72 2c 20 26 76 29 3b 0a 20 20 20 20  pVCur, &v);.    
27af0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
27b00 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
27b10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27b20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
27b30 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 20  o_error;.#endif 
27b40 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
27b50 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 20  IRTUALTABLE */. 
27b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
27b70 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
27b80 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
27b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27ba0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
27bb0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
27bc0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
27bd0 73 74 6f 72 65 28 70 43 29 3b 0a 20 20 20 20 69  store(pC);.    i
27be0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
27bf0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
27c00 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 6e 75 6c  .    if( pC->nul
27c10 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 4f  lRow ){.      pO
27c20 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
27c30 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
27c40 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d  k;.    }.    v =
27c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
27c60 65 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70  egerKey(pC->uc.p
27c70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  Cursor);.  }.  p
27c80 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Out->u.i = v;.  
27c90 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
27ca0 6f 64 65 3a 20 4e 75 6c 6c 52 6f 77 20 50 31 20  ode: NullRow P1 
27cb0 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4d 6f  * * * *.**.** Mo
27cc0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 50 31  ve the cursor P1
27cd0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 2e 20   to a null row. 
27ce0 20 41 6e 79 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f   Any OP_Column o
27cf0 70 65 72 61 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  perations.** tha
27d00 74 20 6f 63 63 75 72 20 77 68 69 6c 65 20 74 68  t occur while th
27d10 65 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 20 74  e cursor is on t
27d20 68 65 20 6e 75 6c 6c 20 72 6f 77 20 77 69 6c 6c  he null row will
27d30 20 61 6c 77 61 79 73 0a 2a 2a 20 77 72 69 74 65   always.** write
27d40 20 61 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65   a NULL..*/.case
27d50 20 4f 50 5f 4e 75 6c 6c 52 6f 77 3a 20 7b 0a 20   OP_NullRow: {. 
27d60 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
27d70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
27d80 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
27d90 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
27da0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
27db0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
27dc0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70  rt( pC!=0 );.  p
27dd0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  C->nullRow = 1;.
27de0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
27df0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
27e00 0a 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54  .  if( pC->eCurT
27e10 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
27e20 45 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EE ){.    assert
27e30 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
27e40 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
27e50 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
27e60 6f 72 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  or(pC->uc.pCurso
27e70 72 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  r);.  }.  break;
27e80 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  .}../* Opcode: L
27e90 61 73 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ast P1 P2 P3 * *
27ea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
27eb0 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
27ec0 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 50 72   or Column or Pr
27ed0 65 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ev instruction f
27ee0 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
27ef0 65 66 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74  efer to the last
27f00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
27f10 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
27f20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65  index..** If the
27f30 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
27f40 69 73 20 65 6d 70 74 79 20 61 6e 64 20 50 32 3e  is empty and P2>
27f50 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  0, then jump imm
27f60 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a  ediately to P2..
27f70 2a 2a 20 49 66 20 50 32 20 69 73 20 30 20 6f 72  ** If P2 is 0 or
27f80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   if the table or
27f90 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d   index is not em
27fa0 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  pty, fall throug
27fb0 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c  h.** to the foll
27fc0 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f  owing instructio
27fd0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
27fe0 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
27ff0 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
28000 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76  d to move in rev
28010 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  erse order,.** f
28020 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61  rom the end towa
28030 72 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rd the beginning
28040 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
28050 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
28060 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
28070 6f 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20  o use Prev, not 
28080 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  Next..**.** If P
28090 33 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68  3 is -1, then th
280a0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 73 69  e cursor is posi
280b0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 65 6e  tioned at the en
280c0 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 0a 2a  d of the btree.*
280d0 2a 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * for the purpos
280e0 65 20 6f 66 20 61 70 70 65 6e 64 69 6e 67 20 61  e of appending a
280f0 20 6e 65 77 20 65 6e 74 72 79 20 6f 6e 74 6f 20   new entry onto 
28100 74 68 65 20 62 74 72 65 65 2e 20 20 49 6e 20 74  the btree.  In t
28110 68 61 74 0a 2a 2a 20 63 61 73 65 20 50 32 20 6d  hat.** case P2 m
28120 75 73 74 20 62 65 20 30 2e 20 20 49 74 20 69 73  ust be 0.  It is
28130 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28140 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
28150 20 6f 6e 6c 79 20 66 6f 72 0a 2a 2a 20 61 70 70   only for.** app
28160 65 6e 64 69 6e 67 20 61 6e 64 20 73 6f 20 69 66  ending and so if
28170 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
28180 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 63  alid, then the c
28190 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 72 65 61  ursor must alrea
281a0 64 79 0a 2a 2a 20 62 65 20 70 6f 69 6e 74 69 6e  dy.** be pointin
281b0 67 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  g at the end of 
281c0 74 68 65 20 62 74 72 65 65 20 61 6e 64 20 73 6f  the btree and so
281d0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
281e0 6d 61 64 65 20 74 6f 0a 2a 2a 20 74 68 65 20 63  made to.** the c
281f0 75 72 73 6f 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ursor..*/.case O
28200 50 5f 4c 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Last: {       
28210 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
28220 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
28230 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
28240 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
28250 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
28260 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
28270 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
28280 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
28290 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
282a0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
282b0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
282c0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
282d0 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
282e0 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 72 65 73  c.pCursor;.  res
282f0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
28300 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20 70 43  pCrsr!=0 );.  pC
28310 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 70  ->seekResult = p
28320 4f 70 2d 3e 70 33 3b 0a 23 69 66 64 65 66 20 53  Op->p3;.#ifdef S
28330 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43  QLITE_DEBUG.  pC
28340 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61  ->seekOp = OP_La
28350 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  st;.#endif.  if(
28360 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 21   pOp->p3==0 || !
28370 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
28380 6f 72 49 73 56 61 6c 69 64 4e 4e 28 70 43 72 73  orIsValidNN(pCrs
28390 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  r) ){.    rc = s
283a0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
283b0 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20 20  pCrsr, &res);.  
283c0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
283d0 28 75 38 29 72 65 73 3b 0a 20 20 20 20 70 43 2d  (u8)res;.    pC-
283e0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
283f0 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
28400 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
28410 5f 53 54 41 4c 45 3b 0a 20 20 20 20 69 66 28 20  _STALE;.    if( 
28420 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
28430 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
28440 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30 20    if( pOp->p2>0 
28450 29 7b 0a 20 20 20 20 20 20 56 64 62 65 42 72 61  ){.      VdbeBra
28460 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c  nchTaken(res!=0,
28470 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  2);.      if( re
28480 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
28490 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  _p2;.    }.  }el
284a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
284b0 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b 0a 20 20  pOp->p2==0 );.  
284c0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
284d0 20 4f 70 63 6f 64 65 3a 20 49 66 53 6d 61 6c 6c   Opcode: IfSmall
284e0 65 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  er P1 P2 P3 * *.
284f0 2a 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  **.** Estimate t
28500 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
28510 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 50  s in the table P
28520 31 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  1.  Jump to P2 i
28530 66 20 74 68 61 74 0a 2a 2a 20 65 73 74 69 6d 61  f that.** estima
28540 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
28550 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 32 2a  approximately 2*
28560 2a 28 30 2e 31 2a 50 33 29 2e 0a 2a 2f 0a 63 61  *(0.1*P3)..*/.ca
28570 73 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 3a  se OP_IfSmaller:
28580 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
28590 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
285a0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
285b0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
285c0 72 65 73 3b 0a 20 20 69 36 34 20 73 7a 3b 0a 0a  res;.  i64 sz;..
285d0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
285e0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
285f0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
28600 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
28610 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
28620 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 70 43 72  ( pC!=0 );.  pCr
28630 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
28640 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  sor;.  assert( p
28650 43 72 73 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  Crsr );.  rc = s
28660 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
28670 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a 20  (pCrsr, &res);. 
28680 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
28690 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
286a0 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  r;.  if( res==0 
286b0 29 7b 0a 20 20 20 20 73 7a 20 3d 20 73 71 6c 69  ){.    sz = sqli
286c0 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
286d0 45 73 74 28 70 43 72 73 72 29 3b 0a 20 20 20 20  Est(pCrsr);.    
286e0 69 66 28 20 41 4c 57 41 59 53 28 73 7a 3e 3d 30  if( ALWAYS(sz>=0
286f0 29 20 26 26 20 73 71 6c 69 74 65 33 4c 6f 67 45  ) && sqlite3LogE
28700 73 74 28 28 75 36 34 29 73 7a 29 3c 70 4f 70 2d  st((u64)sz)<pOp-
28710 3e 70 33 20 29 20 72 65 73 20 3d 20 31 3b 0a 20  >p3 ) res = 1;. 
28720 20 7d 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54   }.  VdbeBranchT
28730 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a  aken(res!=0,2);.
28740 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
28750 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
28760 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
28770 6f 64 65 3a 20 53 6f 72 74 65 72 53 6f 72 74 20  ode: SorterSort 
28780 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
28790 2a 20 41 66 74 65 72 20 61 6c 6c 20 72 65 63 6f  * After all reco
287a0 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  rds have been in
287b0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
287c0 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a  Sorter object.**
287d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 50   identified by P
287e0 31 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f  1, invoke this o
287f0 70 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c  pcode to actuall
28800 79 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67  y do the sorting
28810 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  ..** Jump to P2 
28820 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
28830 72 65 63 6f 72 64 73 20 74 6f 20 62 65 20 73 6f  records to be so
28840 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rted..**.** This
28850 20 6f 70 63 6f 64 65 20 69 73 20 61 6e 20 61 6c   opcode is an al
28860 69 61 73 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20  ias for OP_Sort 
28870 61 6e 64 20 4f 50 5f 52 65 77 69 6e 64 20 74 68  and OP_Rewind th
28880 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f  at is used.** fo
28890 72 20 53 6f 72 74 65 72 20 6f 62 6a 65 63 74 73  r Sorter objects
288a0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
288b0 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  Sort P1 P2 * * *
288c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
288d0 64 65 20 64 6f 65 73 20 65 78 61 63 74 6c 79 20  de does exactly 
288e0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
288f0 73 20 4f 50 5f 52 65 77 69 6e 64 20 65 78 63 65  s OP_Rewind exce
28900 70 74 20 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e  pt that.** it in
28910 63 72 65 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f  crements an undo
28920 63 75 6d 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20  cumented global 
28930 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 66 6f  variable used fo
28940 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r testing..**.**
28950 20 53 6f 72 74 69 6e 67 20 69 73 20 61 63 63 6f   Sorting is acco
28960 6d 70 6c 69 73 68 65 64 20 62 79 20 77 72 69 74  mplished by writ
28970 69 6e 67 20 72 65 63 6f 72 64 73 20 69 6e 74 6f  ing records into
28980 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
28990 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 77 69 6e 64  ,.** then rewind
289a0 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 61  ing that index a
289b0 6e 64 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  nd playing it ba
289c0 63 6b 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  ck from beginnin
289d0 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65  g to.** end.  We
289e0 20 75 73 65 20 74 68 65 20 4f 50 5f 53 6f 72 74   use the OP_Sort
289f0 20 6f 70 63 6f 64 65 20 69 6e 73 74 65 61 64 20   opcode instead 
28a00 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20  of OP_Rewind to 
28a10 64 6f 20 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64  do the.** rewind
28a20 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20  ing so that the 
28a30 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
28a40 77 69 6c 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e  will be incremen
28a50 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65  ted and.** regre
28a60 73 73 69 6f 6e 20 74 65 73 74 73 20 63 61 6e 20  ssion tests can 
28a70 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
28a80 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6f 70 74  r or not the opt
28a90 69 6d 69 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72  imizer is.** cor
28aa0 72 65 63 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e  rectly optimizin
28ab0 67 20 6f 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a  g out sorts..*/.
28ac0 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f  case OP_SorterSo
28ad0 72 74 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  rt:    /* jump *
28ae0 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20  /.case OP_Sort: 
28af0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
28b00 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
28b10 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
28b20 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  _sort_count++;. 
28b30 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
28b40 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  count--;.#endif.
28b50 20 20 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51    p->aCounter[SQ
28b60 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
28b70 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61  SORT]++;.  /* Fa
28b80 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
28b90 4f 50 5f 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f  OP_Rewind */.}./
28ba0 2a 20 4f 70 63 6f 64 65 3a 20 52 65 77 69 6e 64  * Opcode: Rewind
28bb0 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
28bc0 2a 2a 20 54 68 65 20 6e 65 78 74 20 75 73 65 20  ** The next use 
28bd0 6f 66 20 74 68 65 20 52 6f 77 69 64 20 6f 72 20  of the Rowid or 
28be0 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69  Column or Next i
28bf0 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20 50  nstruction for P
28c00 31 20 0a 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72  1 .** will refer
28c10 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
28c20 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
28c30 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
28c40 65 78 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  ex..** If the ta
28c50 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
28c60 65 6d 70 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65  empty, jump imme
28c70 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a  diately to P2..*
28c80 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f  * If the table o
28c90 72 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 65  r index is not e
28ca0 6d 70 74 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75  mpty, fall throu
28cb0 67 68 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  gh to the follow
28cc0 69 6e 67 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74  ing .** instruct
28cd0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
28ce0 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
28cf0 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
28d00 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66  red to move in f
28d10 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a  orward order,.**
28d20 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
28d30 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 65  ing toward the e
28d40 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  nd.  In other wo
28d50 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
28d60 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
28d70 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f   to use Next, no
28d80 74 20 50 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20  t Prev..*/.case 
28d90 4f 50 5f 52 65 77 69 6e 64 3a 20 7b 20 20 20 20  OP_Rewind: {    
28da0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
28db0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
28dc0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 72  .  BtCursor *pCr
28dd0 73 72 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  sr;.  int res;..
28de0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
28df0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
28e00 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
28e10 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
28e20 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
28e30 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
28e40 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
28e50 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  )==(pOp->opcode=
28e60 3d 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 29 20  =OP_SorterSort) 
28e70 29 3b 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 69  );.  res = 1;.#i
28e80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28e90 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d  G.  pC->seekOp =
28ea0 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64   OP_Rewind;.#end
28eb0 69 66 0a 20 20 69 66 28 20 69 73 53 6f 72 74 65  if.  if( isSorte
28ec0 72 28 70 43 29 20 29 7b 0a 20 20 20 20 72 63 20  r(pC) ){.    rc 
28ed0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
28ee0 74 65 72 52 65 77 69 6e 64 28 70 43 2c 20 26 72  terRewind(pC, &r
28ef0 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
28f00 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
28f10 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
28f20 42 54 52 45 45 20 29 3b 0a 20 20 20 20 70 43 72  BTREE );.    pCr
28f30 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  sr = pC->uc.pCur
28f40 73 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sor;.    assert(
28f50 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20 72 63   pCrsr );.    rc
28f60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
28f70 69 72 73 74 28 70 43 72 73 72 2c 20 26 72 65 73  irst(pCrsr, &res
28f80 29 3b 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72  );.    pC->defer
28f90 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
28fa0 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74     pC->cacheStat
28fb0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
28fc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
28fd0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
28fe0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e  to_error;.  pC->
28ff0 6e 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65  nullRow = (u8)re
29000 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  s;.  assert( pOp
29010 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
29020 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64  2<p->nOp );.  Vd
29030 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65  beBranchTaken(re
29040 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72  s!=0,2);.  if( r
29050 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  es ) goto jump_t
29060 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
29070 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78  ../* Opcode: Nex
29080 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  t P1 P2 P3 P4 P5
29090 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63  .**.** Advance c
290a0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
290b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
290c0 65 20 6e 65 78 74 20 6b 65 79 2f 64 61 74 61 20  e next key/data 
290d0 70 61 69 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74  pair in its.** t
290e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20  able or index.  
290f0 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
29100 6d 6f 72 65 20 6b 65 79 2f 76 61 6c 75 65 20 70  more key/value p
29110 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74  airs then fall t
29120 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
29130 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
29140 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20  uction.  But if 
29150 74 68 65 20 63 75 72 73 6f 72 20 61 64 76 61 6e  the cursor advan
29160 63 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ce was successfu
29170 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64  l,.** jump immed
29180 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a  iately to P2..**
29190 0a 2a 2a 20 54 68 65 20 4e 65 78 74 20 6f 70 63  .** The Next opc
291a0 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ode is only vali
291b0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53  d following an S
291c0 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f  eekGT, SeekGE, o
291d0 72 0a 2a 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f  r.** OP_Rewind o
291e0 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f  pcode used to po
291f0 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
29200 72 2e 20 20 4e 65 78 74 20 69 73 20 6e 6f 74 20  r.  Next is not 
29210 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f  allowed.** to fo
29220 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c 20 53 65 65  llow SeekLT, See
29230 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e  kLE, or OP_Last.
29240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75  .**.** The P1 cu
29250 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72  rsor must be for
29260 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e   a real table, n
29270 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  ot a pseudo-tabl
29280 65 2e 20 20 50 31 20 6d 75 73 74 20 68 61 76 65  e.  P1 must have
29290 0a 2a 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  .** been opened 
292a0 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 6f 70  prior to this op
292b0 63 6f 64 65 20 6f 72 20 74 68 65 20 70 72 6f 67  code or the prog
292c0 72 61 6d 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  ram will segfaul
292d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20  t..**.** The P3 
292e0 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20  value is a hint 
292f0 74 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70  to the btree imp
29300 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20  lementation. If 
29310 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d  P3==1, that.** m
29320 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51  eans P1 is an SQ
29330 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74  L index and that
29340 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
29350 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
29360 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20  n.** omitted if 
29370 74 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62  that index had b
29380 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20  een unique.  P3 
29390 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50  is usually 0.  P
293a0 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65  3 is.** always e
293b0 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a  ither 0 or 1..**
293c0 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73  .** P4 is always
293d0 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41   of type P4_ADVA
293e0 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  NCE. The functio
293f0 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  n pointer points
29400 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
29410 72 65 65 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a  reeNext()..**.**
29420 20 49 66 20 50 35 20 69 73 20 70 6f 73 69 74 69   If P5 is positi
29430 76 65 20 61 6e 64 20 74 68 65 20 6a 75 6d 70 20  ve and the jump 
29440 69 73 20 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65  is taken, then e
29450 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  vent counter.** 
29460 6e 75 6d 62 65 72 20 50 35 2d 31 20 69 6e 20 74  number P5-1 in t
29470 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
29480 65 6d 65 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  ement is increme
29490 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  nted..**.** See 
294a0 61 6c 73 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74  also: Prev, Next
294b0 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63  IfOpen.*/./* Opc
294c0 6f 64 65 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20  ode: NextIfOpen 
294d0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
294e0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
294f0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
29500 20 4e 65 78 74 20 65 78 63 65 70 74 20 74 68 61   Next except tha
29510 74 20 69 66 20 63 75 72 73 6f 72 20 50 31 20 69  t if cursor P1 i
29520 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74  s not.** open it
29530 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70   behaves a no-op
29540 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
29550 50 72 65 76 20 50 31 20 50 32 20 50 33 20 50 34  Prev P1 P2 P3 P4
29560 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75   P5.**.** Back u
29570 70 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74  p cursor P1 so t
29580 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
29590 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
295a0 79 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20 69  y/data pair in i
295b0 74 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  ts.** table or i
295c0 6e 64 65 78 2e 20 20 49 66 20 74 68 65 72 65 20  ndex.  If there 
295d0 69 73 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b  is no previous k
295e0 65 79 2f 76 61 6c 75 65 20 70 61 69 72 73 20 74  ey/value pairs t
295f0 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
29600 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  .** to the follo
29610 77 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  wing instruction
29620 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 63 75  .  But if the cu
29630 72 73 6f 72 20 62 61 63 6b 75 70 20 77 61 73 20  rsor backup was 
29640 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a  successful,.** j
29650 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
29660 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  to P2..**.**.** 
29670 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65 20  The Prev opcode 
29680 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
29690 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c  llowing an SeekL
296a0 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a  T, SeekLE, or.**
296b0 20 4f 50 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20   OP_Last opcode 
296c0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
296d0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 50 72   the cursor.  Pr
296e0 65 76 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ev is not allowe
296f0 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53  d.** to follow S
29700 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f  eekGT, SeekGE, o
29710 72 20 4f 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a  r OP_Rewind..**.
29720 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f 72  ** The P1 cursor
29730 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20 72   must be for a r
29740 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  eal table, not a
29750 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20   pseudo-table.  
29760 49 66 20 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20  If P1 is.** not 
29770 6f 70 65 6e 20 74 68 65 6e 20 74 68 65 20 62 65  open then the be
29780 68 61 76 69 6f 72 20 69 73 20 75 6e 64 65 66 69  havior is undefi
29790 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ned..**.** The P
297a0 33 20 76 61 6c 75 65 20 69 73 20 61 20 68 69 6e  3 value is a hin
297b0 74 20 74 6f 20 74 68 65 20 62 74 72 65 65 20 69  t to the btree i
297c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49  mplementation. I
297d0 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a  f P3==1, that.**
297e0 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61 6e 20   means P1 is an 
297f0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68  SQL index and th
29800 61 74 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  at this instruct
29810 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
29820 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69  een.** omitted i
29830 66 20 74 68 61 74 20 69 6e 64 65 78 20 68 61 64  f that index had
29840 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20 20 50   been unique.  P
29850 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30 2e 20  3 is usually 0. 
29860 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73   P3 is.** always
29870 20 65 69 74 68 65 72 20 30 20 6f 72 20 31 2e 0a   either 0 or 1..
29880 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c 77 61  **.** P4 is alwa
29890 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f 41 44  ys of type P4_AD
298a0 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e 63 74  VANCE. The funct
298b0 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ion pointer poin
298c0 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ts to.** sqlite3
298d0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
298e0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
298f0 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
29900 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
29910 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
29920 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
29930 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
29940 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
29950 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f  ncremented..*/./
29960 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65 76 49 66  * Opcode: PrevIf
29970 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20 50 34  Open P1 P2 P3 P4
29980 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f   P5.**.** This o
29990 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74  pcode works just
299a0 20 6c 69 6b 65 20 50 72 65 76 20 65 78 63 65 70   like Prev excep
299b0 74 20 74 68 61 74 20 69 66 20 63 75 72 73 6f 72  t that if cursor
299c0 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70   P1 is not.** op
299d0 65 6e 20 69 74 20 62 65 68 61 76 65 73 20 61 20  en it behaves a 
299e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63  no-op..*/./* Opc
299f0 6f 64 65 3a 20 53 6f 72 74 65 72 4e 65 78 74 20  ode: SorterNext 
29a00 50 31 20 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a  P1 P2 * * P5.**.
29a10 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  ** This opcode w
29a20 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f  orks just like O
29a30 50 5f 4e 65 78 74 20 65 78 63 65 70 74 20 74 68  P_Next except th
29a40 61 74 20 50 31 20 6d 75 73 74 20 62 65 20 61 0a  at P1 must be a.
29a50 2a 2a 20 73 6f 72 74 65 72 20 6f 62 6a 65 63 74  ** sorter object
29a60 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 4f   for which the O
29a70 50 5f 53 6f 72 74 65 72 53 6f 72 74 20 6f 70 63  P_SorterSort opc
29a80 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
29a90 69 6e 76 6f 6b 65 64 2e 20 20 54 68 69 73 20 6f  invoked.  This o
29aa0 70 63 6f 64 65 20 61 64 76 61 6e 63 65 73 20 74  pcode advances t
29ab0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
29ac0 20 6e 65 78 74 20 73 6f 72 74 65 64 0a 2a 2a 20   next sorted.** 
29ad0 72 65 63 6f 72 64 2c 20 6f 72 20 6a 75 6d 70 73  record, or jumps
29ae0 20 74 6f 20 50 32 20 69 66 20 74 68 65 72 65 20   to P2 if there 
29af0 61 72 65 20 6e 6f 20 6d 6f 72 65 20 73 6f 72 74  are no more sort
29b00 65 64 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63  ed records..*/.c
29b10 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  ase OP_SorterNex
29b20 74 3a 20 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f  t: {  /* jump */
29b30 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
29b40 43 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70  C;..  pC = p->ap
29b50 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
29b60 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
29b70 28 70 43 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  (pC) );.  rc = s
29b80 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
29b90 4e 65 78 74 28 64 62 2c 20 70 43 29 3b 0a 20 20  Next(db, pC);.  
29ba0 67 6f 74 6f 20 6e 65 78 74 5f 74 61 69 6c 3b 0a  goto next_tail;.
29bb0 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
29bc0 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a  en:    /* jump *
29bd0 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66  /.case OP_NextIf
29be0 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Open:    /* jump
29bf0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   */.  if( p->apC
29c00 73 72 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30 20 29  sr[pOp->p1]==0 )
29c10 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46 61 6c   break;.  /* Fal
29c20 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 63 61 73  l through */.cas
29c30 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20 20 20  e OP_Prev:      
29c40 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
29c50 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 20 20 20  ase OP_Next:    
29c60 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
29c70 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
29c80 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
29c90 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20  <p->nCursor );. 
29ca0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
29cb0 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 43  <ArraySize(p->aC
29cc0 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20 70 43 20  ounter) );.  pC 
29cd0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
29ce0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
29cf0 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
29d00 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f  ( pC->deferredMo
29d10 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  veto==0 );.  ass
29d20 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
29d30 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
29d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
29d50 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65  p->opcode!=OP_Ne
29d60 78 74 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41  xt || pOp->p4.xA
29d70 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42  dvance==sqlite3B
29d80 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73  treeNext );.  as
29d90 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
29da0 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f  e!=OP_Prev || pO
29db0 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
29dc0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
29dd0 69 6f 75 73 20 29 3b 0a 20 20 61 73 73 65 72 74  ious );.  assert
29de0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
29df0 50 5f 4e 65 78 74 49 66 4f 70 65 6e 20 7c 7c 20  P_NextIfOpen || 
29e00 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
29e10 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  ==sqlite3BtreeNe
29e20 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  xt );.  assert( 
29e30 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
29e40 50 72 65 76 49 66 4f 70 65 6e 20 7c 7c 20 70 4f  PrevIfOpen || pO
29e50 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d  p->p4.xAdvance==
29e60 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
29e70 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ious);..  /* The
29e80 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69 73 20   Next opcode is 
29e90 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65 72 20  only used after 
29ea0 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45 2c 20  SeekGT, SeekGE, 
29eb0 61 6e 64 20 52 65 77 69 6e 64 2e 0a 20 20 2a 2a  and Rewind..  **
29ec0 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f 64 65   The Prev opcode
29ed0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66   is only used af
29ee0 74 65 72 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b  ter SeekLT, Seek
29ef0 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e 20 2a 2f  LE, and Last. */
29f00 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
29f10 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20  opcode!=OP_Next 
29f20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  || pOp->opcode!=
29f30 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 0a 20 20  OP_NextIfOpen.  
29f40 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
29f50 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c  Op==OP_SeekGT ||
29f60 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
29f70 53 65 65 6b 47 45 0a 20 20 20 20 20 20 20 7c 7c  SeekGE.       ||
29f80 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
29f90 52 65 77 69 6e 64 20 7c 7c 20 70 43 2d 3e 73 65  Rewind || pC->se
29fa0 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64 29 3b  ekOp==OP_Found);
29fb0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
29fc0 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20  opcode!=OP_Prev 
29fd0 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d  || pOp->opcode!=
29fe0 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 0a 20 20  OP_PrevIfOpen.  
29ff0 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b       || pC->seek
2a000 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c  Op==OP_SeekLT ||
2a010 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
2a020 53 65 65 6b 4c 45 0a 20 20 20 20 20 20 20 7c 7c  SeekLE.       ||
2a030 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f   pC->seekOp==OP_
2a040 4c 61 73 74 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Last );..  rc = 
2a050 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
2a060 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
2a070 20 70 4f 70 2d 3e 70 33 29 3b 0a 6e 65 78 74 5f   pOp->p3);.next_
2a080 74 61 69 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68  tail:.  pC->cach
2a090 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
2a0a0 53 54 41 4c 45 3b 0a 20 20 56 64 62 65 42 72 61  STALE;.  VdbeBra
2a0b0 6e 63 68 54 61 6b 65 6e 28 72 63 3d 3d 53 51 4c  nchTaken(rc==SQL
2a0c0 49 54 45 5f 4f 4b 2c 32 29 3b 0a 20 20 69 66 28  ITE_OK,2);.  if(
2a0d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a0e0 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  {.    pC->nullRo
2a0f0 77 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43  w = 0;.    p->aC
2a100 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 5d 2b  ounter[pOp->p5]+
2a110 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
2a120 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
2a130 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
2a140 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 67 6f 74  ;.#endif.    got
2a150 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  o jump_to_p2_and
2a160 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
2a170 72 75 70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rupt;.  }.  if( 
2a180 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
2a190 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2a1a0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20  _to_error;.  rc 
2a1b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
2a1c0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  C->nullRow = 1;.
2a1d0 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72    goto check_for
2a1e0 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f  _interrupt;.}../
2a1f0 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78 49 6e 73  * Opcode: IdxIns
2a200 65 72 74 20 50 31 20 50 32 20 50 33 20 50 34 20  ert P1 P2 P3 P4 
2a210 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
2a220 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  key=r[P2].**.** 
2a230 52 65 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64  Register P2 hold
2a240 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b  s an SQL index k
2a250 65 79 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68  ey made using th
2a260 65 0a 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20  e.** MakeRecord 
2a270 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54  instructions.  T
2a280 68 69 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65  his opcode write
2a290 73 20 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e  s that key.** in
2a2a0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 50 31 2e  to the index P1.
2a2b0 20 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 65    Data for the e
2a2c0 6e 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a  ntry is nil..**.
2a2d0 2a 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  ** If P4 is not 
2a2e0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
2a2f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
2a300 61 6c 75 65 73 20 69 6e 20 74 68 65 20 75 6e 70  alues in the unp
2a310 61 63 6b 65 64 0a 2a 2a 20 6b 65 79 20 6f 66 20  acked.** key of 
2a320 72 65 67 28 50 32 29 2e 20 20 49 6e 20 74 68 61  reg(P2).  In tha
2a330 74 20 63 61 73 65 2c 20 50 33 20 69 73 20 74 68  t case, P3 is th
2a340 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
2a350 69 72 73 74 20 72 65 67 69 73 74 65 72 0a 2a 2a  irst register.**
2a360 20 66 6f 72 20 74 68 65 20 75 6e 70 61 63 6b 65   for the unpacke
2a370 64 20 6b 65 79 2e 20 20 54 68 65 20 61 76 61 69  d key.  The avai
2a380 6c 61 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  lability of the 
2a390 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 63 61 6e  unpacked key can
2a3a0 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65   sometimes.** be
2a3b0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2a3c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61  ..**.** If P5 ha
2a3d0 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 41 50 50  s the OPFLAG_APP
2a3e0 45 4e 44 20 62 69 74 20 73 65 74 2c 20 74 68 61  END bit set, tha
2a3f0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
2a400 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 0a  he b-tree layer.
2a410 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 6e 73  ** that this ins
2a420 65 72 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f  ert is likely to
2a430 20 62 65 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a   be an append..*
2a440 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74  *.** If P5 has t
2a450 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
2a460 45 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20  E bit set, then 
2a470 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
2a480 65 72 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65  er is.** increme
2a490 6e 74 65 64 20 62 79 20 74 68 69 73 20 69 6e 73  nted by this ins
2a4a0 74 72 75 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  truction.  If th
2a4b0 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  e OPFLAG_NCHANGE
2a4c0 20 62 69 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a   bit is clear,.*
2a4d0 2a 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  * then the chang
2a4e0 65 20 63 6f 75 6e 74 65 72 20 69 73 20 75 6e 63  e counter is unc
2a4f0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
2a500 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53   the OPFLAG_USES
2a510 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f  EEKRESULT flag o
2a520 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
2a530 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a540 6d 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73  might.** run fas
2a550 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20  ter by avoiding 
2a560 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  an unnecessary s
2a570 65 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31  eek on cursor P1
2a580 2e 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74  .  However,.** t
2a590 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  he OPFLAG_USESEE
2a5a0 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73  KRESULT flag mus
2a5b0 74 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66  t only be set if
2a5c0 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
2a5d0 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65   no prior.** see
2a5e0 6b 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ks on the cursor
2a5f0 20 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20   or if the most 
2a600 72 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64  recent seek used
2a610 20 61 20 6b 65 79 20 65 71 75 69 76 61 6c 65 6e   a key equivalen
2a620 74 0a 2a 2a 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a  t.** to P2. .**.
2a630 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
2a640 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  ion only works f
2a650 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 54 68 65  or indices.  The
2a660 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 73 74   equivalent inst
2a670 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  ruction.** for t
2a680 61 62 6c 65 73 20 69 73 20 4f 50 5f 49 6e 73 65  ables is OP_Inse
2a690 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  rt..*/./* Opcode
2a6a0 3a 20 53 6f 72 74 65 72 49 6e 73 65 72 74 20 50  : SorterInsert P
2a6b0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
2a6c0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32  nopsis: key=r[P2
2a6d0 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ].**.** Register
2a6e0 20 50 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c   P2 holds an SQL
2a6f0 20 69 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20   index key made 
2a700 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b  using the.** Mak
2a710 65 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74  eRecord instruct
2a720 69 6f 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f  ions.  This opco
2a730 64 65 20 77 72 69 74 65 73 20 74 68 61 74 20 6b  de writes that k
2a740 65 79 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  ey.** into the s
2a750 6f 72 74 65 72 20 50 31 2e 20 20 44 61 74 61 20  orter P1.  Data 
2a760 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 69 73  for the entry is
2a770 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50   nil..*/.case OP
2a780 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3a 20 20  _SorterInsert:  
2a790 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 63       /* in2 */.c
2a7a0 61 73 65 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  ase OP_IdxInsert
2a7b0 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69 6e  : {        /* in
2a7c0 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  2 */.  VdbeCurso
2a7d0 72 20 2a 70 43 3b 0a 20 20 42 74 72 65 65 50 61  r *pC;.  BtreePa
2a7e0 79 6c 6f 61 64 20 78 3b 0a 0a 20 20 61 73 73 65  yload x;..  asse
2a7f0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2a800 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2a810 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2a820 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2a830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2a840 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
2a850 73 53 6f 72 74 65 72 28 70 43 29 3d 3d 28 70 4f  sSorter(pC)==(pO
2a860 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
2a870 72 74 65 72 49 6e 73 65 72 74 29 20 29 3b 0a 20  rterInsert) );. 
2a880 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
2a890 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
2a8a0 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20  ( pIn2->flags & 
2a8b0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66  MEM_Blob );.  if
2a8c0 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
2a8d0 41 47 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e  AG_NCHANGE ) p->
2a8e0 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73  nChange++;.  ass
2a8f0 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
2a900 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
2a910 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2a920 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74  =OP_SorterInsert
2a930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a940 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  ->isTable==0 );.
2a950 20 20 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f    rc = ExpandBlo
2a960 62 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 72  b(pIn2);.  if( r
2a970 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2a980 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69  ue_to_error;.  i
2a990 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2a9a0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20  OP_SorterInsert 
2a9b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2a9c0 74 65 33 56 64 62 65 53 6f 72 74 65 72 57 72 69  te3VdbeSorterWri
2a9d0 74 65 28 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20  te(pC, pIn2);.  
2a9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65  }else{.    x.nKe
2a9f0 79 20 3d 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20  y = pIn2->n;.   
2aa00 20 78 2e 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e   x.pKey = pIn2->
2aa10 7a 3b 0a 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20  z;.    x.aMem = 
2aa20 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a  aMem + pOp->p3;.
2aa30 20 20 20 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31      x.nMem = (u1
2aa40 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20  6)pOp->p4.i;.   
2aa50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2aa60 65 65 49 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e  eeInsert(pC->uc.
2aa70 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20  pCursor, &x,.   
2aa80 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
2aa90 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c   (OPFLAG_APPEND|
2aaa0 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
2aab0 49 4f 4e 29 29 2c 20 0a 20 20 20 20 20 20 20 20  ION)), .        
2aac0 28 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ((pOp->p5 & OPFL
2aad0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
2aae0 29 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ) ? pC->seekResu
2aaf0 6c 74 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  lt : 0).        
2ab00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ab10 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  C->deferredMovet
2ab20 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e  o==0 );.    pC->
2ab30 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
2ab40 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
2ab50 20 69 66 28 20 72 63 29 20 67 6f 74 6f 20 61 62   if( rc) goto ab
2ab60 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2ab70 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2ab80 20 4f 70 63 6f 64 65 3a 20 49 64 78 44 65 6c 65   Opcode: IdxDele
2ab90 74 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  te P1 P2 P3 * *.
2aba0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
2abb0 3d 72 5b 50 32 40 50 33 5d 0a 2a 2a 0a 2a 2a 20  =r[P2@P3].**.** 
2abc0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 50  The content of P
2abd0 33 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  3 registers star
2abe0 74 69 6e 67 20 61 74 20 72 65 67 69 73 74 65 72  ting at register
2abf0 20 50 32 20 66 6f 72 6d 0a 2a 2a 20 61 6e 20 75   P2 form.** an u
2ac00 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2ac10 79 2e 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72  y. This opcode r
2ac20 65 6d 6f 76 65 73 20 74 68 61 74 20 65 6e 74 72  emoves that entr
2ac30 79 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 69  y from the .** i
2ac40 6e 64 65 78 20 6f 70 65 6e 65 64 20 62 79 20 63  ndex opened by c
2ac50 75 72 73 6f 72 20 50 31 2e 0a 2a 2f 0a 63 61 73  ursor P1..*/.cas
2ac60 65 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 3a 20  e OP_IdxDelete: 
2ac70 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
2ac80 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
2ac90 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
2aca0 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  ;.  UnpackedReco
2acb0 72 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rd r;..  assert(
2acc0 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20   pOp->p3>0 );.  
2acd0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e  assert( pOp->p2>
2ace0 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70  0 && pOp->p2+pOp
2acf0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
2ad00 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
2ad10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2ad20 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2ad30 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2ad40 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2ad50 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2ad60 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2ad70 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
2ad80 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
2ad90 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
2ada0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
2adb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
2adc0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
2add0 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a  ( pOp->p5==0 );.
2ade0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
2adf0 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72  C->pKeyInfo;.  r
2ae00 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
2ae10 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61  Op->p3;.  r.defa
2ae20 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e  ult_rc = 0;.  r.
2ae30 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
2ae40 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71  ->p2];.  rc = sq
2ae50 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2ae60 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20  Unpacked(pCrsr, 
2ae70 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  &r, 0, 0, &res);
2ae80 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2ae90 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2aea0 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  ror;.  if( res==
2aeb0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2aec0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2aed0 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f 41 55  (pCrsr, BTREE_AU
2aee0 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 69 66  XDELETE);.    if
2aef0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2af00 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2af10 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2af20 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2af30 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63  ==0 );.  pC->cac
2af40 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2af50 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65  _STALE;.  pC->se
2af60 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  ekResult = 0;.  
2af70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2af80 6f 64 65 3a 20 44 65 66 65 72 72 65 64 53 65 65  ode: DeferredSee
2af90 6b 20 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a  k P1 * P3 P4 *.*
2afa0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65  * Synopsis: Move
2afb0 20 50 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 20   P3 to P1.rowid 
2afc0 69 66 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a 20  if needed.**.** 
2afd0 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e  P1 is an open in
2afe0 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50  dex cursor and P
2aff0 33 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e  3 is a cursor on
2b000 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2b010 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ng.** table.  Th
2b020 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61  is opcode does a
2b030 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
2b040 66 20 74 68 65 20 50 33 20 74 61 62 6c 65 20 63  f the P3 table c
2b050 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20  ursor.** to the 
2b060 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65 73 70  row that corresp
2b070 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75 72 72  onds to the curr
2b080 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a  ent row of P1..*
2b090 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
2b0a0 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e  eferred seek.  N
2b0b0 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20  othing actually 
2b0c0 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a  happens until.**
2b0d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   the cursor is u
2b0e0 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72 65  sed to read a re
2b0f0 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c  cord.  That way,
2b100 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20   if no reads.** 
2b110 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65  occur, no unnece
2b120 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e  ssary I/O happen
2b130 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20  s..**.** P4 may 
2b140 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  be an array of i
2b150 6e 74 65 67 65 72 73 20 28 74 79 70 65 20 50 34  ntegers (type P4
2b160 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61  _INTARRAY) conta
2b170 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74  ining.** one ent
2b180 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ry for each colu
2b190 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74 61 62  mn in the P3 tab
2b1a0 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e  le.  If array en
2b1b0 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e  try a(i).** is n
2b1c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65  on-zero, then re
2b1d0 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69  ading column a(i
2b1e0 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20  )-1 from cursor 
2b1f0 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61  P3 is .** equiva
2b200 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69  lent to performi
2b210 6e 67 20 74 68 65 20 64 65 66 65 72 72 65 64 20  ng the deferred 
2b220 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65  seek and then re
2b230 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a  ading column i .
2b240 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69  ** from P1.  Thi
2b250 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2b260 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e   stored in P3 an
2b270 64 20 75 73 65 64 20 74 6f 20 72 65 64 69 72 65  d used to redire
2b280 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69  ct.** reads agai
2b290 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50  nst P3 over to P
2b2a0 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79  1, thus possibly
2b2b0 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65   avoiding the ne
2b2c0 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e  ed to.** seek an
2b2d0 64 20 72 65 61 64 20 63 75 72 73 6f 72 20 50 33  d read cursor P3
2b2e0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2b2f0 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a  IdxRowid P1 P2 *
2b300 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
2b310 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a  : r[P2]=rowid.**
2b320 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
2b330 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
2b340 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
2b350 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2b360 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
2b370 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
2b380 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
2b390 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
2b3a0 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
2b3b0 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
2b3c0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2b3d0 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
2b3e0 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
2b3f0 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
2b400 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
2b410 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
2b420 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 66 65  .*/.case OP_Defe
2b430 72 72 65 64 53 65 65 6b 3a 0a 63 61 73 65 20 4f  rredSeek:.case O
2b440 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20  P_IdxRowid: {   
2b450 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
2b460 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2b470 2a 70 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pC;            
2b480 20 2f 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78   /* The P1 index
2b490 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62   cursor */.  Vdb
2b4a0 65 43 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72  eCursor *pTabCur
2b4b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2b4c0 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  P2 table cursor 
2b4d0 28 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b  (OP_DeferredSeek
2b4e0 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20   only) */.  i64 
2b4f0 72 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  rowid;          
2b500 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2b510 20 74 68 61 74 20 50 31 20 63 75 72 72 65 6e 74   that P1 current
2b520 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20   points to */.. 
2b530 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2b540 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2b550 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2b560 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2b570 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2b580 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2b590 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2b5a0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2b5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2b5c0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
2b5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2b5e0 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
2b5f0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
2b600 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
2b610 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e  .  assert( !pC->
2b620 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e  nullRow || pOp->
2b630 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f  opcode==OP_IdxRo
2b640 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  wid );..  /* The
2b650 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20 53 65   IdxRowid and Se
2b660 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65 20 63  ek opcodes are c
2b670 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73 65 20  ombined because 
2b680 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69  of the commonali
2b690 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74  ty.  ** of sqlit
2b6a0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2b6b0 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ore() and sqlite
2b6c0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 29 2e  3VdbeIdxRowid().
2b6d0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2b6e0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2b6f0 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73  ore(pC);..  /* s
2b700 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f 72 52  qlite3VbeCursorR
2b710 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c  estore() can onl
2b720 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 72 65  y fail if the re
2b730 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20 64 65  cord has been de
2b740 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66  leted.  ** out f
2b750 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
2b760 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69 6c 6c  rsor.  That will
2b770 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73 20 66   never happens f
2b780 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64 0a 20  or an IdxRowid. 
2b790 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f   ** or Seek opco
2b7a0 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  de */.  if( NEVE
2b7b0 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  R(rc!=SQLITE_OK)
2b7c0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2b7d0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69  e_to_error;..  i
2b7e0 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  f( !pC->nullRow 
2b7f0 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 30  ){.    rowid = 0
2b800 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
2b810 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
2b820 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
2b830 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2b840 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
2b850 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43  id(db, pC->uc.pC
2b860 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a  ursor, &rowid);.
2b870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2b890 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b8a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
2b8b0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2b8c0 65 3d 3d 4f 50 5f 44 65 66 65 72 72 65 64 53 65  e==OP_DeferredSe
2b8d0 65 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ek ){.      asse
2b8e0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26  rt( pOp->p3>=0 &
2b8f0 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75  & pOp->p3<p->nCu
2b900 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 70 54  rsor );.      pT
2b910 61 62 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72  abCur = p->apCsr
2b920 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
2b930 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2b940 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2b950 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 65 43  ert( pTabCur->eC
2b960 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2b970 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61  BTREE );.      a
2b980 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e  ssert( pTabCur->
2b990 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
2b9a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b9b0 54 61 62 43 75 72 2d 3e 69 73 54 61 62 6c 65 20  TabCur->isTable 
2b9c0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  );.      pTabCur
2b9d0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
2b9e0 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f       pTabCur->mo
2b9f0 76 65 74 6f 54 61 72 67 65 74 20 3d 20 72 6f 77  vetoTarget = row
2ba00 69 64 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75  id;.      pTabCu
2ba10 72 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  r->deferredMovet
2ba20 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  o = 1;.      ass
2ba30 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
2ba40 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c  ==P4_INTARRAY ||
2ba50 20 70 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29   pOp->p4.ai==0 )
2ba60 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d  ;.      pTabCur-
2ba70 3e 61 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e  >aAltMap = pOp->
2ba80 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 70 54 61  p4.ai;.      pTa
2ba90 62 43 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72  bCur->pAltCursor
2baa0 20 3d 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65   = pC;.    }else
2bab0 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 6f  {.      pOut = o
2bac0 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
2bad0 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f 75   pOp);.      pOu
2bae0 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a  t->u.i = rowid;.
2baf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2bb00 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2bb10 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f  opcode==OP_IdxRo
2bb20 77 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  wid );.    sqlit
2bb30 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
2bb40 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29  (&aMem[pOp->p2])
2bb50 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2bb60 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  ../* Opcode: Idx
2bb70 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50  GE P1 P2 P3 P4 P
2bb80 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  5.** Synopsis: k
2bb90 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
2bba0 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
2bbb0 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
2bbc0 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
2bbd0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
2bbe0 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
2bbf0 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59  mits the PRIMARY
2bc00 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74   KEY.  Compare t
2bc10 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67  his key value ag
2bc20 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
2bc30 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63  .** that P1 is c
2bc40 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2bc50 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2bc60 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2bc70 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c  r ROWID .** fiel
2bc80 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ds at the end..*
2bc90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
2bca0 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72  ndex entry is gr
2bcb0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
2bcc0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
2bcd0 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d  alue.** then jum
2bce0 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
2bcf0 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
2bd00 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2bd10 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  truction..*/./* 
2bd20 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50 31  Opcode: IdxGT P1
2bd30 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
2bd40 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2bd50 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P3@P4].**.** The
2bd60 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
2bd70 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
2bd80 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
2bd90 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
2bda0 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
2bdb0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
2bdc0 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2bdd0 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2bde0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74   the index .** t
2bdf0 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e  hat P1 is curren
2be00 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c  tly pointing to,
2be10 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52   ignoring the PR
2be20 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57  IMARY KEY or ROW
2be30 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74  ID .** fields at
2be40 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
2be50 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78 20  If the P1 index 
2be60 65 6e 74 72 79 20 69 73 20 67 72 65 61 74 65 72  entry is greater
2be70 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
2be80 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70  lue.** then jump
2be90 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69   to P2.  Otherwi
2bea0 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2beb0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2bec0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  ruction..*/./* O
2bed0 70 63 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20  pcode: IdxLT P1 
2bee0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2bef0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2bf00 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3@P4].**.** The 
2bf10 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  P4 register valu
2bf20 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  es beginning wit
2bf30 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70  h P3 form an unp
2bf40 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20  acked index .** 
2bf50 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74  key that omits t
2bf60 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2bf70 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  r ROWID.  Compar
2bf80 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2bf90 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
2bfa0 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73  index that P1 is
2bfb0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2bfc0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
2bfd0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2bfe0 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20   or.** ROWID on 
2bff0 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a  the P1 index..**
2c000 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2c010 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73  dex entry is les
2c020 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
2c030 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74  alue then jump t
2c040 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o P2..** Otherwi
2c050 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2c060 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2c070 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  ruction..*/./* O
2c080 70 63 6f 64 65 3a 20 49 64 78 4c 45 20 50 31 20  pcode: IdxLE P1 
2c090 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2c0a0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2c0b0 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3@P4].**.** The 
2c0c0 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  P4 register valu
2c0d0 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  es beginning wit
2c0e0 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70  h P3 form an unp
2c0f0 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20  acked index .** 
2c100 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74  key that omits t
2c110 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2c120 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  r ROWID.  Compar
2c130 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2c140 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
2c150 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73  index that P1 is
2c160 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2c170 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
2c180 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2c190 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20   or.** ROWID on 
2c1a0 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a  the P1 index..**
2c1b0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2c1c0 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73  dex entry is les
2c1d0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2c1e0 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  to the key value
2c1f0 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f   then jump.** to
2c200 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 20 66   P2. Otherwise f
2c210 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
2c220 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2c230 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2c240 49 64 78 4c 45 3a 20 20 20 20 20 20 20 20 20 20  IdxLE:          
2c250 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
2c260 4f 50 5f 49 64 78 47 54 3a 20 20 20 20 20 20 20  OP_IdxGT:       
2c270 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
2c280 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20  se OP_IdxLT:    
2c290 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2c2a0 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20  .case OP_IdxGE: 
2c2b0 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
2c2c0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
2c2d0 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b   *pC;.  int res;
2c2e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2c2f0 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
2c300 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2c310 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2c320 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2c330 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2c340 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2c350 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
2c360 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73  sOrdered );.  as
2c370 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2c380 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2c390 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
2c3a0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
2c3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2c3c0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2c3d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2c3e0 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
2c3f0 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73  p->p5==1 );.  as
2c400 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
2c410 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
2c420 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
2c430 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e  ->pKeyInfo;.  r.
2c440 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
2c450 70 2d 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20 70  p->p4.i;.  if( p
2c460 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64  Op->opcode<OP_Id
2c470 78 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  xLT ){.    asser
2c480 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
2c490 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d  OP_IdxLE || pOp-
2c4a0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  >opcode==OP_IdxG
2c4b0 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75  T );.    r.defau
2c4c0 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65  lt_rc = -1;.  }e
2c4d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2c4e0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2c4f0 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f  _IdxGE || pOp->o
2c500 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20  pcode==OP_IdxLT 
2c510 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  );.    r.default
2c520 5f 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  _rc = 0;.  }.  r
2c530 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
2c540 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53  p->p3];.#ifdef S
2c550 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
2c560 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20  int i; for(i=0; 
2c570 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  i<r.nField; i++)
2c580 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2c590 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
2c5a0 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  ); }.#endif.  re
2c5b0 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e  s = 0;  /* Not n
2c5c0 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65  eeded.  Only use
2c5d0 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77  d to silence a w
2c5e0 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  arning. */.  rc 
2c5f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
2c600 4b 65 79 43 6f 6d 70 61 72 65 28 64 62 2c 20 70  KeyCompare(db, p
2c610 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20  C, &r, &res);.  
2c620 61 73 73 65 72 74 28 20 28 4f 50 5f 49 64 78 4c  assert( (OP_IdxL
2c630 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26  E&1)==(OP_IdxLT&
2c640 31 29 20 26 26 20 28 4f 50 5f 49 64 78 47 45 26  1) && (OP_IdxGE&
2c650 31 29 3d 3d 28 4f 50 5f 49 64 78 47 54 26 31 29  1)==(OP_IdxGT&1)
2c660 20 29 3b 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e   );.  if( (pOp->
2c670 6f 70 63 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49  opcode&1)==(OP_I
2c680 64 78 4c 54 26 31 29 20 29 7b 0a 20 20 20 20 61  dxLT&1) ){.    a
2c690 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2c6a0 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20  de==OP_IdxLE || 
2c6b0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c6c0 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 65 73  IdxLT );.    res
2c6d0 20 3d 20 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65   = -res;.  }else
2c6e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
2c6f0 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2c700 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  xGE || pOp->opco
2c710 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
2c720 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20      res++;.  }. 
2c730 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
2c740 28 72 65 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28  (res>0,2);.  if(
2c750 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2c760 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2c770 20 69 66 28 20 72 65 73 3e 30 20 29 20 67 6f 74   if( res>0 ) got
2c780 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
2c790 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2c7a0 6f 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20  ode: Destroy P1 
2c7b0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2c7c0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
2c7d0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
2c7e0 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72  or index whose r
2c7f0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2c800 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2c810 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e   is given by P1.
2c820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
2c830 20 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64   being destroyed
2c840 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
2c850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
2c860 20 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50   P3==0.  If.** P
2c870 33 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61  3==1 then the ta
2c880 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20  ble to be clear 
2c890 69 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  is in the auxili
2c8a0 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
2c8b0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65  e.** that is use
2c8c0 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65  d to store table
2c8d0 73 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43  s create using C
2c8e0 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20  REATE TEMPORARY 
2c8f0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TABLE..**.** If 
2c900 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2c910 61 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73  abled then it is
2c920 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61   possible that a
2c930 6e 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65  nother root page
2c940 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76  .** might be mov
2c950 65 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c  ed into the newl
2c960 79 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70  y deleted root p
2c970 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
2c980 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  keep all.** root
2c990 20 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75   pages contiguou
2c9a0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2c9b0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
2c9c0 73 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a  se.  The former.
2c9d0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
2c9e0 72 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d  root page that m
2c9f0 6f 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65  oved - its value
2ca00 20 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65   before the move
2ca10 20 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69   occurred -.** i
2ca20 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
2ca30 73 74 65 72 20 50 32 2e 20 49 66 20 6e 6f 20 70  ster P2. If no p
2ca40 61 67 65 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73  age movement was
2ca50 20 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75   required (becau
2ca60 73 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  se the.** table 
2ca70 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61  being dropped wa
2ca80 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6c 61  s already the la
2ca90 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
2caa0 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 0a  tabase) then a .
2cab0 2a 2a 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65  ** zero is store
2cac0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
2cad0 2e 20 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  .  If AUTOVACUUM
2cae0 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65   is disabled the
2caf0 6e 20 61 20 7a 65 72 6f 20 0a 2a 2a 20 69 73 20  n a zero .** is 
2cb00 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
2cb10 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
2cb20 73 20 6f 70 63 6f 64 65 20 74 68 72 6f 77 73 20  s opcode throws 
2cb30 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 72  an error if ther
2cb40 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76 65  e are any active
2cb50 20 72 65 61 64 65 72 20 56 4d 73 20 77 68 65 6e   reader VMs when
2cb60 0a 2a 2a 20 69 74 20 69 73 20 69 6e 76 6f 6b 65  .** it is invoke
2cb70 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
2cb80 74 6f 20 61 76 6f 69 64 20 74 68 65 20 64 69 66  to avoid the dif
2cb90 66 69 63 75 6c 74 79 20 61 73 73 6f 63 69 61 74  ficulty associat
2cba0 65 64 20 77 69 74 68 20 0a 2a 2a 20 75 70 64 61  ed with .** upda
2cbb0 74 69 6e 67 20 65 78 69 73 74 69 6e 67 20 63 75  ting existing cu
2cbc0 72 73 6f 72 73 20 77 68 65 6e 20 61 20 72 6f 6f  rsors when a roo
2cbd0 74 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  t page is moved 
2cbe0 69 6e 20 61 6e 20 41 55 54 4f 56 41 43 55 55 4d  in an AUTOVACUUM
2cbf0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
2cc00 68 69 73 20 65 72 72 6f 72 20 69 73 20 74 68 72  his error is thr
2cc10 6f 77 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20  own even if the 
2cc20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
2cc30 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a  an AUTOVACUUM .*
2cc40 2a 20 64 62 20 69 6e 20 6f 72 64 65 72 20 74 6f  * db in order to
2cc50 20 61 76 6f 69 64 20 69 6e 74 72 6f 64 75 63 69   avoid introduci
2cc60 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
2cc70 69 6c 69 74 79 20 62 65 74 77 65 65 6e 20 61 75  ility between au
2cc80 74 6f 76 61 63 75 75 6d 20 0a 2a 2a 20 61 6e 64  tovacuum .** and
2cc90 20 6e 6f 6e 2d 61 75 74 6f 76 61 63 75 75 6d 20   non-autovacuum 
2cca0 6d 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  modes..**.** See
2ccb0 20 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a   also: Clear.*/.
2ccc0 63 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a  case OP_Destroy:
2ccd0 20 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a   {     /* out2 *
2cce0 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a  /.  int iMoved;.
2ccf0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
2cd00 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
2cd10 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
2cd20 28 20 70 4f 70 2d 3e 70 31 3e 31 20 29 3b 0a 20  ( pOp->p1>1 );. 
2cd30 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
2cd40 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
2cd50 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
2cd60 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 69 66 28 20  MEM_Null;.  if( 
2cd70 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 3e 20  db->nVdbeRead > 
2cd80 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 31 20  db->nVDestroy+1 
2cd90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2cda0 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 70  TE_LOCKED;.    p
2cdb0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
2cdc0 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 67 6f  OE_Abort;.    go
2cdd0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2cde0 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  error;.  }else{.
2cdf0 20 20 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e 70      iDb = pOp->p
2ce00 33 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 44  3;.    assert( D
2ce10 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
2ce20 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b 0a  eeMask, iDb) );.
2ce30 20 20 20 20 69 4d 6f 76 65 64 20 3d 20 30 3b 20      iMoved = 0; 
2ce40 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
2ce50 20 4f 6e 6c 79 20 74 6f 20 73 69 6c 65 6e 63 65   Only to silence
2ce60 20 61 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20   a warning. */. 
2ce70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2ce80 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 64 62  treeDropTable(db
2ce90 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
2cea0 70 4f 70 2d 3e 70 31 2c 20 26 69 4d 6f 76 65 64  pOp->p1, &iMoved
2ceb0 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  );.    pOut->fla
2cec0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
2ced0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 4d    pOut->u.i = iM
2cee0 6f 76 65 64 3b 0a 20 20 20 20 69 66 28 20 72 63  oved;.    if( rc
2cef0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2cf00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 69 66 6e  e_to_error;.#ifn
2cf10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cf20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2cf30 66 28 20 69 4d 6f 76 65 64 21 3d 30 20 29 7b 0a  f( iMoved!=0 ){.
2cf40 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6f        sqlite3Roo
2cf50 74 50 61 67 65 4d 6f 76 65 64 28 64 62 2c 20 69  tPageMoved(db, i
2cf60 44 62 2c 20 69 4d 6f 76 65 64 2c 20 70 4f 70 2d  Db, iMoved, pOp-
2cf70 3e 70 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41  >p1);.      /* A
2cf80 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 70  ll OP_Destroy op
2cf90 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 6f  erations occur o
2cfa0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
2cfb0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2cfc0 28 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46  ( resetSchemaOnF
2cfd0 61 75 6c 74 3d 3d 30 20 7c 7c 20 72 65 73 65 74  ault==0 || reset
2cfe0 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 69  SchemaOnFault==i
2cff0 44 62 2b 31 20 29 3b 0a 20 20 20 20 20 20 72 65  Db+1 );.      re
2d000 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
2d010 20 3d 20 69 44 62 2b 31 3b 0a 20 20 20 20 7d 0a   = iDb+1;.    }.
2d020 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72 65  #endif.  }.  bre
2d030 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2d040 3a 20 43 6c 65 61 72 20 50 31 20 50 32 20 50 33  : Clear P1 P2 P3
2d050 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  .**.** Delete al
2d060 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  l contents of th
2d070 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  e database table
2d080 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20   or index whose 
2d090 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 6e 20  root page.** in 
2d0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d0b0 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31  e is given by P1
2d0c0 2e 20 20 42 75 74 2c 20 75 6e 6c 69 6b 65 20 44  .  But, unlike D
2d0d0 65 73 74 72 6f 79 2c 20 64 6f 20 6e 6f 74 0a 2a  estroy, do not.*
2d0e0 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * remove the tab
2d0f0 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 72 6f 6d  le or index from
2d100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d110 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  le..**.** The ta
2d120 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 20  ble being clear 
2d130 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  is in the main d
2d140 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2d150 50 32 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50 32  P2==0.  If.** P2
2d160 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61 62  ==1 then the tab
2d170 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20 69  le to be clear i
2d180 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  s in the auxilia
2d190 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
2d1a0 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65 64  .** that is used
2d1b0 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65 73   to store tables
2d1c0 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43 52   create using CR
2d1d0 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20 54  EATE TEMPORARY T
2d1e0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ABLE..**.** If t
2d1f0 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 6e  he P3 value is n
2d200 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2d210 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
2d220 20 74 6f 20 6d 75 73 74 20 62 65 20 61 6e 0a 2a   to must be an.*
2d230 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 28  * intkey table (
2d240 61 6e 20 53 51 4c 20 74 61 62 6c 65 2c 20 6e 6f  an SQL table, no
2d250 74 20 61 6e 20 69 6e 64 65 78 29 2e 20 49 6e 20  t an index). In 
2d260 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 6f  this case the ro
2d270 77 20 63 68 61 6e 67 65 20 0a 2a 2a 20 63 6f 75  w change .** cou
2d280 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
2d290 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2d2a0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2d2b0 61 62 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72  able being clear
2d2c0 65 64 2e 20 0a 2a 2a 20 49 66 20 50 33 20 69 73  ed. .** If P3 is
2d2d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2d2e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ro, then the val
2d2f0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ue stored in reg
2d300 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a 20 61  ister P3 is.** a
2d310 6c 73 6f 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  lso incremented 
2d320 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
2d330 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2d340 6c 65 20 62 65 69 6e 67 20 63 6c 65 61 72 65 64  le being cleared
2d350 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2d360 3a 20 44 65 73 74 72 6f 79 0a 2a 2f 0a 63 61 73  : Destroy.*/.cas
2d370 65 20 4f 50 5f 43 6c 65 61 72 3a 20 7b 0a 20 20  e OP_Clear: {.  
2d380 69 6e 74 20 6e 43 68 61 6e 67 65 3b 0a 20 0a 20  int nChange;. . 
2d390 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20   nChange = 0;.  
2d3a0 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
2d3b0 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
2d3c0 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
2d3d0 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70  ->btreeMask, pOp
2d3e0 2d 3e 70 32 29 20 29 3b 0a 20 20 72 63 20 3d 20  ->p2) );.  rc = 
2d3f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
2d400 72 54 61 62 6c 65 28 0a 20 20 20 20 20 20 64 62  rTable(.      db
2d410 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 32 5d 2e 70  ->aDb[pOp->p2].p
2d420 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 28 70 4f  Bt, pOp->p1, (pO
2d430 70 2d 3e 70 33 20 3f 20 26 6e 43 68 61 6e 67 65  p->p3 ? &nChange
2d440 20 3a 20 30 29 0a 20 20 29 3b 0a 20 20 69 66 28   : 0).  );.  if(
2d450 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20 20   pOp->p3 ){.    
2d460 70 2d 3e 6e 43 68 61 6e 67 65 20 2b 3d 20 6e 43  p->nChange += nC
2d470 68 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 70  hange;.    if( p
2d480 4f 70 2d 3e 70 33 3e 30 20 29 7b 0a 20 20 20 20  Op->p3>0 ){.    
2d490 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
2d4a0 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
2d4b0 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 6d 65  p3]) );.      me
2d4c0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
2d4d0 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  , &aMem[pOp->p3]
2d4e0 29 3b 0a 20 20 20 20 20 20 61 4d 65 6d 5b 70 4f  );.      aMem[pO
2d4f0 70 2d 3e 70 33 5d 2e 75 2e 69 20 2b 3d 20 6e 43  p->p3].u.i += nC
2d500 68 61 6e 67 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  hange;.    }.  }
2d510 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2d520 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2d530 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
2d540 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65  ./* Opcode: Rese
2d550 74 53 6f 72 74 65 72 20 50 31 20 2a 20 2a 20 2a  tSorter P1 * * *
2d560 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20   *.**.** Delete 
2d570 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20 66 72 6f  all contents fro
2d580 6d 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  m the ephemeral 
2d590 74 61 62 6c 65 20 6f 72 20 73 6f 72 74 65 72 0a  table or sorter.
2d5a0 2a 2a 20 74 68 61 74 20 69 73 20 6f 70 65 6e 20  ** that is open 
2d5b0 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a  on cursor P1..**
2d5c0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
2d5d0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 63  only works for c
2d5e0 75 72 73 6f 72 73 20 75 73 65 64 20 66 6f 72 20  ursors used for 
2d5f0 73 6f 72 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 6f  sorting and.** o
2d600 70 65 6e 65 64 20 77 69 74 68 20 4f 50 5f 4f 70  pened with OP_Op
2d610 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 72 20 4f  enEphemeral or O
2d620 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2e 0a 2a 2f  P_SorterOpen..*/
2d630 0a 63 61 73 65 20 4f 50 5f 52 65 73 65 74 53 6f  .case OP_ResetSo
2d640 72 74 65 72 3a 20 7b 0a 20 20 56 64 62 65 43 75  rter: {.  VdbeCu
2d650 72 73 6f 72 20 2a 70 43 3b 0a 20 0a 20 20 61 73  rsor *pC;. .  as
2d660 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
2d670 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
2d680 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d  Cursor );.  pC =
2d690 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
2d6a0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
2d6b0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 53  !=0 );.  if( isS
2d6c0 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20  orter(pC) ){.   
2d6d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
2d6e0 65 72 52 65 73 65 74 28 64 62 2c 20 70 43 2d 3e  erReset(db, pC->
2d6f0 75 63 2e 70 53 6f 72 74 65 72 29 3b 0a 20 20 7d  uc.pSorter);.  }
2d700 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2d710 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2d720 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2d730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
2d740 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 3b 0a  >isEphemeral );.
2d750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d760 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 4f  BtreeClearTableO
2d770 66 43 75 72 73 6f 72 28 70 43 2d 3e 75 63 2e 70  fCursor(pC->uc.p
2d780 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
2d790 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2d7a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2d7b0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2d7c0 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65  * Opcode: Create
2d7d0 54 61 62 6c 65 20 50 31 20 50 32 20 2a 20 2a 20  Table P1 P2 * * 
2d7e0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
2d7f0 5b 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31  [P2]=root iDb=P1
2d800 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  .**.** Allocate 
2d810 61 20 6e 65 77 20 74 61 62 6c 65 20 69 6e 20 74  a new table in t
2d820 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2d830 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f   file if P1==0 o
2d840 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69  r in the.** auxi
2d850 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
2d860 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20  ile if P1==1 or 
2d870 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  in an attached d
2d880 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31  atabase if.** P1
2d890 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72  >1.  Write the r
2d8a0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
2d8b0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2d8c0 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
2d8d0 72 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  r P2.**.** The d
2d8e0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
2d8f0 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 6e  n a table and an
2d900 20 69 6e 64 65 78 20 69 73 20 74 68 69 73 3a 20   index is this: 
2d910 20 41 20 74 61 62 6c 65 20 6d 75 73 74 0a 2a 2a   A table must.**
2d920 20 68 61 76 65 20 61 20 34 2d 62 79 74 65 20 69   have a 4-byte i
2d930 6e 74 65 67 65 72 20 6b 65 79 20 61 6e 64 20 63  nteger key and c
2d940 61 6e 20 68 61 76 65 20 61 72 62 69 74 72 61 72  an have arbitrar
2d950 79 20 64 61 74 61 2e 20 20 41 6e 20 69 6e 64 65  y data.  An inde
2d960 78 0a 2a 2a 20 68 61 73 20 61 6e 20 61 72 62 69  x.** has an arbi
2d970 74 72 61 72 79 20 6b 65 79 20 62 75 74 20 6e 6f  trary key but no
2d980 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   data..**.** See
2d990 20 61 6c 73 6f 3a 20 43 72 65 61 74 65 49 6e 64   also: CreateInd
2d9a0 65 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ex.*/./* Opcode:
2d9b0 20 43 72 65 61 74 65 49 6e 64 65 78 20 50 31 20   CreateIndex P1 
2d9c0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
2d9d0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f 74  psis: r[P2]=root
2d9e0 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41 6c   iDb=P1.**.** Al
2d9f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 69 6e 64  locate a new ind
2da00 65 78 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  ex in the main d
2da10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2da20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a  P1==0 or in the.
2da30 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2da40 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31  abase file if P1
2da50 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74 74  ==1 or in an att
2da60 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 69  ached database i
2da70 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69 74  f.** P1>1.  Writ
2da80 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  e the root page 
2da90 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2daa0 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  w table into.** 
2dab0 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
2dac0 2a 2a 20 53 65 65 20 64 6f 63 75 6d 65 6e 74 61  ** See documenta
2dad0 74 69 6f 6e 20 6f 6e 20 4f 50 5f 43 72 65 61 74  tion on OP_Creat
2dae0 65 54 61 62 6c 65 20 66 6f 72 20 61 64 64 69 74  eTable for addit
2daf0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2db00 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 72  n..*/.case OP_Cr
2db10 65 61 74 65 49 6e 64 65 78 3a 20 20 20 20 20 20  eateIndex:      
2db20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
2db30 0a 63 61 73 65 20 4f 50 5f 43 72 65 61 74 65 54  .case OP_CreateT
2db40 61 62 6c 65 3a 20 7b 20 20 20 20 20 20 20 20 20  able: {         
2db50 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e   /* out2 */.  in
2db60 74 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 66 6c  t pgno;.  int fl
2db70 61 67 73 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ags;.  Db *pDb;.
2db80 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
2db90 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
2dba0 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  ;.  pgno = 0;.  
2dbb0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2dbc0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62  =0 && pOp->p1<db
2dbd0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
2dbe0 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  t( DbMaskTest(p-
2dbf0 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d  >btreeMask, pOp-
2dc00 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >p1) );.  assert
2dc10 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
2dc20 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
2dc30 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  >aDb[pOp->p1];. 
2dc40 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42   assert( pDb->pB
2dc50 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  t!=0 );.  if( pO
2dc60 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72  p->opcode==OP_Cr
2dc70 65 61 74 65 54 61 62 6c 65 20 29 7b 0a 20 20 20  eateTable ){.   
2dc80 20 2f 2a 20 66 6c 61 67 73 20 3d 20 42 54 52 45   /* flags = BTRE
2dc90 45 5f 49 4e 54 4b 45 59 3b 20 2a 2f 0a 20 20 20  E_INTKEY; */.   
2dca0 20 66 6c 61 67 73 20 3d 20 42 54 52 45 45 5f 49   flags = BTREE_I
2dcb0 4e 54 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NTKEY;.  }else{.
2dcc0 20 20 20 20 66 6c 61 67 73 20 3d 20 42 54 52 45      flags = BTRE
2dcd0 45 5f 42 4c 4f 42 4b 45 59 3b 0a 20 20 7d 0a 20  E_BLOBKEY;.  }. 
2dce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2dcf0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 44  eeCreateTable(pD
2dd00 62 2d 3e 70 42 74 2c 20 26 70 67 6e 6f 2c 20 66  b->pBt, &pgno, f
2dd10 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
2dd20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2dd30 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75  _to_error;.  pOu
2dd40 74 2d 3e 75 2e 69 20 3d 20 70 67 6e 6f 3b 0a 20  t->u.i = pgno;. 
2dd50 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2dd60 63 6f 64 65 3a 20 53 71 6c 45 78 65 63 20 2a 20  code: SqlExec * 
2dd70 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
2dd80 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  un the SQL state
2dd90 6d 65 6e 74 20 6f 72 20 73 74 61 74 65 6d 65 6e  ment or statemen
2dda0 74 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ts specified in 
2ddb0 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e 0a 2a  the P4 string..*
2ddc0 2f 0a 63 61 73 65 20 4f 50 5f 53 71 6c 45 78 65  /.case OP_SqlExe
2ddd0 63 3a 20 7b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45  c: {.  db->nSqlE
2dde0 78 65 63 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71  xec++;.  rc = sq
2ddf0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 70  lite3_exec(db, p
2de00 4f 70 2d 3e 70 34 2e 7a 2c 20 30 2c 20 30 2c 20  Op->p4.z, 0, 0, 
2de10 30 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45 78  0);.  db->nSqlEx
2de20 65 63 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29  ec--;.  if( rc )
2de30 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2de40 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
2de50 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2de60 20 50 61 72 73 65 53 63 68 65 6d 61 20 50 31 20   ParseSchema P1 
2de70 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
2de80 65 61 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c  ead and parse al
2de90 6c 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  l entries from t
2dea0 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
2deb0 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61   table of databa
2dec0 73 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61  se P1.** that ma
2ded0 74 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c  tch the WHERE cl
2dee0 61 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20  ause P4. .**.** 
2def0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f  This opcode invo
2df00 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  kes the parser t
2df10 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  o create a new v
2df20 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a  irtual machine,.
2df30 2a 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65  ** then runs the
2df40 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63   new virtual mac
2df50 68 69 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75  hine.  It is thu
2df60 73 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f  s a re-entrant o
2df70 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
2df80 50 5f 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b  P_ParseSchema: {
2df90 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f  .  int iDb;.  co
2dfa0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2dfb0 72 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  r;.  char *zSql;
2dfc0 0a 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74  .  InitData init
2dfd0 44 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  Data;..  /* Any 
2dfe0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2dff0 6e 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  nt that invokes 
2e000 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c  this opcode will
2e010 20 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20   hold mutexes.  
2e020 2a 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ** on every btre
2e030 65 2e 20 20 54 68 69 73 20 69 73 20 61 20 70 72  e.  This is a pr
2e040 65 72 65 71 75 69 73 69 74 65 20 66 6f 72 20 69  erequisite for i
2e050 6e 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71  nvoking .  ** sq
2e060 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63  lite3InitCallbac
2e070 6b 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  k()..  */.#ifdef
2e080 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2e090 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
2e0a0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
2e0b0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d      assert( iDb=
2e0c0 3d 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =1 || sqlite3Btr
2e0d0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d  eeHoldsMutex(db-
2e0e0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29  >aDb[iDb].pBt) )
2e0f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2e100 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  iDb = pOp->p1;. 
2e110 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
2e120 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
2e130 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 48 61  ;.  assert( DbHa
2e140 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44  sProperty(db, iD
2e150 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  b, DB_SchemaLoad
2e160 65 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64  ed) );.  /* Used
2e170 20 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 74 69   to be a conditi
2e180 6f 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d  onal */ {.    zM
2e190 61 73 74 65 72 20 3d 20 4d 41 53 54 45 52 5f 4e  aster = MASTER_N
2e1a0 41 4d 45 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  AME;.    initDat
2e1b0 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69  a.db = db;.    i
2e1c0 6e 69 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f  nitData.iDb = pO
2e1d0 70 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44  p->p1;.    initD
2e1e0 61 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26  ata.pzErrMsg = &
2e1f0 70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20  p->zErrMsg;.    
2e200 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50  zSql = sqlite3MP
2e210 72 69 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20  rintf(db,.      
2e220 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72   "SELECT name, r
2e230 6f 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f  ootpage, sql FRO
2e240 4d 20 27 25 71 27 2e 25 73 20 57 48 45 52 45 20  M '%q'.%s WHERE 
2e250 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  %s ORDER BY rowi
2e260 64 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  d",.       db->a
2e270 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
2e280 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e  , zMaster, pOp->
2e290 70 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a  p4.z);.    if( z
2e2a0 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
2e2b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e2c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
2e2d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2e2e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
2e2f0 30 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  0 );.      db->i
2e300 6e 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20  nit.busy = 1;.  
2e310 20 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20      initData.rc 
2e320 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e330 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
2e340 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
2e350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e360 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2e370 2c 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c  , sqlite3InitCal
2e380 6c 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61  lback, &initData
2e390 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2e3b0 72 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63  rc = initData.rc
2e3c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2e3d0 62 46 72 65 65 4e 4e 28 64 62 2c 20 7a 53 71 6c  bFreeNN(db, zSql
2e3e0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
2e3f0 74 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  t.busy = 0;.    
2e400 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
2e410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
2e420 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
2e430 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
2e440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e450 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
2e460 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
2e470 20 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72   }.    goto abor
2e480 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2e490 20 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d    }.  break;  .}
2e4a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2e4b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
2e4c0 5a 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c  ZE)./* Opcode: L
2e4d0 6f 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a  oadAnalysis P1 *
2e4e0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61   * * *.**.** Rea
2e4f0 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  d the sqlite_sta
2e500 74 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74  t1 table for dat
2e510 61 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61  abase P1 and loa
2e520 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  d the content.**
2e530 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   of that table i
2e540 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  nto the internal
2e550 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2e560 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
2e570 75 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79  use.** the analy
2e580 73 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 77  sis to be used w
2e590 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c  hen preparing al
2e5a0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65  l subsequent que
2e5b0 72 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ries..*/.case OP
2e5c0 5f 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b  _LoadAnalysis: {
2e5d0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2e5e0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
2e5f0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63  <db->nDb );.  rc
2e600 20 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73   = sqlite3Analys
2e610 69 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e  isLoad(db, pOp->
2e620 70 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  p1);.  if( rc ) 
2e630 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2e640 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
2e650 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
2e660 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e670 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f  OMIT_ANALYZE) */
2e680 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
2e690 70 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34  pTable P1 * * P4
2e6a0 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20   *.**.** Remove 
2e6b0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e  the internal (in
2e6c0 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74  -memory) data st
2e6d0 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
2e6e0 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61  scribe.** the ta
2e6f0 62 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  ble named P4 in 
2e700 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
2e710 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
2e720 65 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73  er a table.** is
2e730 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69   dropped from di
2e740 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65  sk (using the De
2e750 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e  stroy opcode) in
2e760 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a   order to keep .
2e770 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
2e780 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2e790 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
2e7a0 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
2e7b0 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
2e7c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
2e7d0 54 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74  Table: {.  sqlit
2e7e0 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
2e7f0 65 54 61 62 6c 65 28 64 62 2c 20 70 4f 70 2d 3e  eTable(db, pOp->
2e800 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2e810 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2e820 70 63 6f 64 65 3a 20 44 72 6f 70 49 6e 64 65 78  pcode: DropIndex
2e830 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
2e840 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 6e  ** Remove the in
2e850 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72  ternal (in-memor
2e860 79 29 20 64 61 74 61 20 73 74 72 75 63 74 75 72  y) data structur
2e870 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  es that describe
2e880 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6e 61  .** the index na
2e890 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61 62 61  med P4 in databa
2e8a0 73 65 20 50 31 2e 20 20 54 68 69 73 20 69 73 20  se P1.  This is 
2e8b0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20  called after an 
2e8c0 69 6e 64 65 78 0a 2a 2a 20 69 73 20 64 72 6f 70  index.** is drop
2e8d0 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75  ped from disk (u
2e8e0 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79  sing the Destroy
2e8f0 20 6f 70 63 6f 64 65 29 0a 2a 2a 20 69 6e 20 6f   opcode).** in o
2e900 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
2e910 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
2e920 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
2e930 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73  ** schema consis
2e940 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69  tent with what i
2e950 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61  s on disk..*/.ca
2e960 73 65 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 3a  se OP_DropIndex:
2e970 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69   {.  sqlite3Unli
2e980 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
2e990 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
2e9a0 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
2e9b0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
2e9c0 20 44 72 6f 70 54 72 69 67 67 65 72 20 50 31 20   DropTrigger P1 
2e9d0 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
2e9e0 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
2e9f0 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
2ea00 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
2ea10 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
2ea20 74 68 65 20 74 72 69 67 67 65 72 20 6e 61 6d 65  the trigger name
2ea30 64 20 50 34 20 69 6e 20 64 61 74 61 62 61 73 65  d P4 in database
2ea40 20 50 31 2e 20 20 54 68 69 73 20 69 73 20 63 61   P1.  This is ca
2ea50 6c 6c 65 64 20 61 66 74 65 72 20 61 20 74 72 69  lled after a tri
2ea60 67 67 65 72 0a 2a 2a 20 69 73 20 64 72 6f 70 70  gger.** is dropp
2ea70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 75 73  ed from disk (us
2ea80 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f 79 20  ing the Destroy 
2ea90 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64 65 72  opcode) in order
2eaa0 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74 68 65   to keep .** the
2eab0 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
2eac0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
2ead0 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73 69 73  ** schema consis
2eae0 74 65 6e 74 20 77 69 74 68 20 77 68 61 74 20 69  tent with what i
2eaf0 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61  s on disk..*/.ca
2eb00 73 65 20 4f 50 5f 44 72 6f 70 54 72 69 67 67 65  se OP_DropTrigge
2eb10 72 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e  r: {.  sqlite3Un
2eb20 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69  linkAndDeleteTri
2eb30 67 67 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31  gger(db, pOp->p1
2eb40 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
2eb50 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  break;.}...#ifnd
2eb60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2eb70 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
2eb80 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72  * Opcode: Integr
2eb90 69 74 79 43 6b 20 50 31 20 50 32 20 50 33 20 50  ityCk P1 P2 P3 P
2eba0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e  4 P5.**.** Do an
2ebb0 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
2ebc0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
2ebd0 64 61 74 61 62 61 73 65 2e 20 20 53 74 6f 72 65  database.  Store
2ebe0 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20   in.** register 
2ebf0 50 31 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  P1 the text of a
2ec00 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2ec10 64 65 73 63 72 69 62 69 6e 67 20 61 6e 79 20 70  describing any p
2ec20 72 6f 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e  roblems..** If n
2ec30 6f 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  o problems are f
2ec40 6f 75 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e 55  ound, store a NU
2ec50 4c 4c 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  LL in register P
2ec60 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67  1..**.** The reg
2ec70 69 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e  ister P3 contain
2ec80 73 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20  s one less than 
2ec90 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2eca0 65 72 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72  er of allowed er
2ecb0 72 6f 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74  rors..** At most
2ecc0 20 72 65 67 28 50 33 29 20 65 72 72 6f 72 73 20   reg(P3) errors 
2ecd0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
2ece0 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  ..** In other wo
2ecf0 72 64 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  rds, the analysi
2ed00 73 20 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20  s stops as soon 
2ed10 61 73 20 72 65 67 28 50 31 29 20 65 72 72 6f 72  as reg(P1) error
2ed20 73 20 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20  s are .** seen. 
2ed30 20 52 65 67 28 50 31 29 20 69 73 20 75 70 64 61   Reg(P1) is upda
2ed40 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ted with the num
2ed50 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65  ber of errors re
2ed60 6d 61 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  maining..**.** T
2ed70 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
2ed80 62 65 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  bers of all tabl
2ed90 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
2eda0 73 65 20 61 72 65 20 69 6e 74 65 67 65 72 73 0a  se are integers.
2edb0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 34 5f  ** stored in P4_
2edc0 49 4e 54 41 52 52 41 59 20 61 72 67 75 6d 65 6e  INTARRAY argumen
2edd0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69  t..**.** If P5 i
2ede0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20  s not zero, the 
2edf0 63 68 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e  check is done on
2ee00 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
2ee10 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c  atabase.** file,
2ee20 20 6e 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61   not the main da
2ee30 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2ee40 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
2ee50 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
2ee60 65 6e 74 20 74 68 65 20 69 6e 74 65 67 72 69 74  ent the integrit
2ee70 79 5f 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a  y_check pragma..
2ee80 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67  */.case OP_Integ
2ee90 72 69 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20  rityCk: {.  int 
2eea0 6e 52 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e  nRoot;      /* N
2eeb0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
2eec0 74 6f 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62  to check.  (Numb
2eed0 65 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  er of root pages
2eee0 2e 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  .) */.  int *aRo
2eef0 6f 74 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ot;     /* Array
2ef00 20 6f 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d   of rootpage num
2ef10 62 65 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20  bers for tables 
2ef20 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
2ef30 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
2ef40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ef50 65 72 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20  errors reported 
2ef60 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
2ef70 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
2ef80 74 68 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74  the error report
2ef90 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72   */.  Mem *pnErr
2efa0 3b 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65  ;     /* Registe
2efb0 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  r keeping track 
2efc0 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e  of errors remain
2efd0 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ing */..  assert
2efe0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
2eff0 3b 0a 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d  ;.  nRoot = pOp-
2f000 3e 70 32 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 70  >p2;.  aRoot = p
2f010 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 61 73 73  Op->p4.ai;.  ass
2f020 65 72 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a  ert( nRoot>0 );.
2f030 20 20 61 73 73 65 72 74 28 20 61 52 6f 6f 74 5b    assert( aRoot[
2f040 6e 52 6f 6f 74 5d 3d 3d 30 20 29 3b 0a 20 20 61  nRoot]==0 );.  a
2f050 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
2f060 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
2f070 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
2f080 72 73 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72 72  rsor) );.  pnErr
2f090 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
2f0a0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e  ];.  assert( (pn
2f0b0 45 72 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Err->flags & MEM
2f0c0 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61 73  _Int)!=0 );.  as
2f0d0 73 65 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c  sert( (pnErr->fl
2f0e0 61 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d  ags & (MEM_Str|M
2f0f0 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a  EM_Blob))==0 );.
2f100 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
2f110 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2f120 74 28 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e  t( pOp->p5<db->n
2f130 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
2f140 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
2f150 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 35  reeMask, pOp->p5
2f160 29 20 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ) );.  z = sqlit
2f170 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
2f180 43 68 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f  Check(db->aDb[pO
2f190 70 2d 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f  p->p5].pBt, aRoo
2f1a0 74 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20  t, nRoot,.      
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1c0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
2f1d0 70 6e 45 72 72 2d 3e 75 2e 69 2b 31 2c 20 26 6e  pnErr->u.i+1, &n
2f1e0 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Err);.  sqlite3V
2f1f0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
2f200 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72 72 3d  n1);.  if( nErr=
2f210 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
2f220 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  ( z==0 );.  }els
2f230 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20  e if( z==0 ){.  
2f240 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
2f250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 6e 45 72   }else{.    pnEr
2f260 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72 2d 31  r->u.i -= nErr-1
2f270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f280 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e 31 2c  eMemSetStr(pIn1,
2f290 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
2f2a0 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  TF8, sqlite3_fre
2f2b0 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41 54 45  e);.  }.  UPDATE
2f2c0 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49  _MAX_BLOBSIZE(pI
2f2d0 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  n1);.  sqlite3Vd
2f2e0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
2f2f0 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn1, encoding)
2f300 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
2f310 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2f320 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2f330 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65  CK */../* Opcode
2f340 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31 20 50  : RowSetAdd P1 P
2f350 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2f360 73 69 73 3a 20 72 6f 77 73 65 74 28 50 31 29 3d  sis: rowset(P1)=
2f370 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e 73 65  r[P2].**.** Inse
2f380 72 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rt the integer v
2f390 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72 65 67  alue held by reg
2f3a0 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20 61 20  ister P2 into a 
2f3b0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 0a 2a 2a  RowSet object.**
2f3c0 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65   held in registe
2f3d0 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61  r P1..**.** An a
2f3e0 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
2f3f0 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e 20 69  f P2 is not an i
2f400 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20  nteger..*/.case 
2f410 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20 7b 20  OP_RowSetAdd: { 
2f420 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 69 6e        /* in1, in
2f430 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
2f440 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
2f450 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn2 = &aMem[pOp
2f460 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p2];.  assert(
2f470 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20   (pIn2->flags & 
2f480 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20  MEM_Int)!=0 );. 
2f490 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
2f4a0 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
2f4b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2f4c0 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77 53 65  3VdbeMemSetRowSe
2f4d0 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69 66 28  t(pIn1);.    if(
2f4e0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
2f4f0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
2f500 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
2f510 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65  }.  sqlite3RowSe
2f520 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e 75 2e  tInsert(pIn1->u.
2f530 70 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d 3e 75  pRowSet, pIn2->u
2f540 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .i);.  break;.}.
2f550 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53  ./* Opcode: RowS
2f560 65 74 52 65 61 64 20 50 31 20 50 32 20 50 33 20  etRead P1 P2 P3 
2f570 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
2f580 20 72 5b 50 33 5d 3d 72 6f 77 73 65 74 28 50 31   r[P3]=rowset(P1
2f590 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ).**.** Extract 
2f5a0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76 61 6c  the smallest val
2f5b0 75 65 20 66 72 6f 6d 20 74 68 65 20 52 6f 77 53  ue from the RowS
2f5c0 65 74 20 6f 62 6a 65 63 74 20 69 6e 20 50 31 0a  et object in P1.
2f5d0 2a 2a 20 61 6e 64 20 70 75 74 20 74 68 61 74 20  ** and put that 
2f5e0 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73  value into regis
2f5f0 74 65 72 20 50 33 2e 0a 2a 2a 20 4f 72 2c 20 69  ter P3..** Or, i
2f600 66 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  f RowSet object 
2f610 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
2f620 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a  empty, leave P3.
2f630 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
2f640 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63   jump to instruc
2f650 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  tion P2..*/.case
2f660 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20   OP_RowSetRead: 
2f670 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c  {       /* jump,
2f680 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20   in1, out3 */.  
2f690 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49 6e 31  i64 val;..  pIn1
2f6a0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
2f6b0 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  ];.  if( (pIn1->
2f6c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
2f6d0 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71  et)==0 .   || sq
2f6e0 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28  lite3RowSetNext(
2f6f0 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
2f700 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20   &val)==0.  ){. 
2f710 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61     /* The boolea
2f720 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  n index is empty
2f730 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
2f740 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49  dbeMemSetNull(pI
2f750 6e 31 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61  n1);.    VdbeBra
2f760 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b 0a 20  nchTaken(1,2);. 
2f770 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
2f780 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72  p2_and_check_for
2f790 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 65  _interrupt;.  }e
2f7a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61  lse{.    /* A va
2f7b0 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66  lue was pulled f
2f7c0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  rom the index */
2f7d0 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
2f7e0 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20 20 73  aken(0,2);.    s
2f7f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2f800 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d  Int64(&aMem[pOp-
2f810 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a  >p3], val);.  }.
2f820 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72    goto check_for
2f830 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f  _interrupt;.}../
2f840 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74  * Opcode: RowSet
2f850 54 65 73 74 20 50 31 20 50 32 20 50 33 20 50 34  Test P1 P2 P3 P4
2f860 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
2f870 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73 65 74   r[P3] in rowset
2f880 28 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  (P1) goto P2.**.
2f890 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 69  ** Register P3 i
2f8a0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c  s assumed to hol
2f8b0 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  d a 64-bit integ
2f8c0 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72 65 67  er value. If reg
2f8d0 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74  ister P1.** cont
2f8e0 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20 6f 62  ains a RowSet ob
2f8f0 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 52 6f  ject and that Ro
2f900 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74  wSet object cont
2f910 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
2f920 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75  e held in P3, ju
2f930 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  mp to register P
2f940 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  2. Otherwise, in
2f950 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65  sert the.** inte
2f960 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f 20 74  ger in P3 into t
2f970 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20 63 6f  he RowSet and co
2f980 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65  ntinue on to the
2f990 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e  .** next opcode.
2f9a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65  .**.** The RowSe
2f9b0 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 74 69  t object is opti
2f9c0 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20 63 61  mized for the ca
2f9d0 73 65 20 77 68 65 72 65 20 73 65 74 73 20 6f 66  se where sets of
2f9e0 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65   integers.** are
2f9f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 64 69 73   inserted in dis
2fa00 74 69 6e 63 74 20 70 68 61 73 65 73 2c 20 77 68  tinct phases, wh
2fa10 69 63 68 20 65 61 63 68 20 73 65 74 20 63 6f 6e  ich each set con
2fa20 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69 63 61  tains no duplica
2fa30 74 65 73 2e 0a 2a 2a 20 45 61 63 68 20 73 65 74  tes..** Each set
2fa40 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
2fa50 79 20 61 20 75 6e 69 71 75 65 20 50 34 20 76 61  y a unique P4 va
2fa60 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74 20 73  lue. The first s
2fa70 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  et.** must have 
2fa80 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e 61 6c  P4==0, the final
2fa90 20 73 65 74 20 6d 75 73 74 20 68 61 76 65 20 50   set must have P
2faa0 34 3d 3d 2d 31 2c 20 61 6e 64 20 66 6f 72 20 61  4==-1, and for a
2fab0 6c 6c 20 6f 74 68 65 72 20 73 65 74 73 0a 2a 2a  ll other sets.**
2fac0 20 6d 75 73 74 20 68 61 76 65 20 50 34 3e 30 2e   must have P4>0.
2fad0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
2fae0 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ws optimizations
2faf0 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30  : (a) when P4==0
2fb00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2fb10 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65  d to test.** the
2fb20 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 66   RowSet object f
2fb30 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20  or P3, as it is 
2fb40 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74  guaranteed not t
2fb50 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a  o contain it,.**
2fb60 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31   (b) when P4==-1
2fb70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2fb80 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
2fb90 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c  value, as it wil
2fba0 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65  l.** never be te
2fbb0 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63  sted for, and (c
2fbc0 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74  ) when a value t
2fbd0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73  hat is part of s
2fbe0 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72  et X is.** inser
2fbf0 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
2fc00 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20   need to search 
2fc10 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61  to see if the sa
2fc20 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20  me value was.** 
2fc30 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72  previously inser
2fc40 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  ted as part of s
2fc50 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74  et X (only if it
2fc60 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   was previously.
2fc70 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70  ** inserted as p
2fc80 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65  art of some othe
2fc90 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20  r set)..*/.case 
2fca0 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b  OP_RowSetTest: {
2fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcc0 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
2fcd0 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  1, in3 */.  int 
2fce0 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73  iSet;.  int exis
2fcf0 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  ts;..  pIn1 = &a
2fd00 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
2fd10 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
2fd20 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20  ->p3];.  iSet = 
2fd30 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73  pOp->p4.i;.  ass
2fd40 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
2fd50 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f  &MEM_Int );..  /
2fd60 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
2fd70 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
2fd80 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63  n a rowset objec
2fd90 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
2fda0 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65   P1,.  ** delete
2fdb0 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74   it now and init
2fdc0 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61  ialize P1 with a
2fdd0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20  n empty rowset. 
2fde0 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   */.  if( (pIn1-
2fdf0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
2fe00 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Set)==0 ){.    s
2fe10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
2fe20 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20  RowSet(pIn1);.  
2fe30 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
2fe40 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
2fe50 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
2fe60 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  m;.  }..  assert
2fe70 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
2fe80 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
2fe90 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c  ert( iSet==-1 ||
2fea0 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66   iSet>=0 );.  if
2feb0 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78  ( iSet ){.    ex
2fec0 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f  ists = sqlite3Ro
2fed0 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75  wSetTest(pIn1->u
2fee0 2e 70 52 6f 77 53 65 74 2c 20 69 53 65 74 2c 20  .pRowSet, iSet, 
2fef0 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pIn3->u.i);.    
2ff00 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
2ff10 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20  exists!=0,2);.  
2ff20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 20 67    if( exists ) g
2ff30 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
2ff40 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e 3d    }.  if( iSet>=
2ff50 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2ff60 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49 6e  RowSetInsert(pIn
2ff70 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 49  1->u.pRowSet, pI
2ff80 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20 20  n3->u.i);.  }.  
2ff90 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  break;.}...#ifnd
2ffa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
2ffb0 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64  RIGGER../* Opcod
2ffc0 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20 50 32  e: Program P1 P2
2ffd0 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
2ffe0 45 78 65 63 75 74 65 20 74 68 65 20 74 72 69 67  Execute the trig
2fff0 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61 73 73  ger program pass
30000 65 64 20 61 73 20 50 34 20 28 74 79 70 65 20 50  ed as P4 (type P
30010 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a  4_SUBPROGRAM). .
30020 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e  **.** P1 contain
30030 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  s the address of
30040 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
30050 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
30060 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
30070 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  .** cell in an a
30080 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 75  rray of values u
30090 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73  sed as arguments
300a0 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72 6f 67   to the sub-prog
300b0 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74  ram. P2 .** cont
300c0 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
300d0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 74   to jump to if t
300e0 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 74  he sub-program t
300f0 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45 20  hrows an IGNORE 
30100 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 75 73  .** exception us
30110 69 6e 67 20 74 68 65 20 52 41 49 53 45 28 29 20  ing the RAISE() 
30120 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73 74  function. Regist
30130 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
30140 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f  he address .** o
30150 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  f a memory cell 
30160 69 6e 20 74 68 69 73 20 28 74 68 65 20 70 61 72  in this (the par
30170 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69 73 20  ent) VM that is 
30180 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
30190 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20   the .** memory 
301a0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
301b0 73 75 62 2d 76 64 62 65 20 61 74 20 72 75 6e 74  sub-vdbe at runt
301c0 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ime..**.** P4 is
301d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
301e0 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e VM containing 
301f0 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
30200 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  ram..**.** If P5
30210 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
30220 65 6e 20 72 65 63 75 72 73 69 76 65 20 70 72 6f  en recursive pro
30230 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f 6e 20  gram invocation 
30240 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63  is enabled..*/.c
30250 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d 3a 20  ase OP_Program: 
30260 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
30270 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30290 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
302a0 79 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  y registers for 
302b0 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  sub-program */. 
302c0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
302d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
302e0 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73 70 61  s of runtime spa
302f0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
30300 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  sub-program */. 
30310 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20 20 20   Mem *pRt;      
30320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
30330 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ster to allocate
30340 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 2a   runtime space *
30350 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
30360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
30370 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
30380 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65  hrough memory ce
30390 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45  lls */.  Mem *pE
303a0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
303b0 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72 79 20   /* Last memory 
303c0 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72 72 61  cell in new arra
303d0 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65  y */.  VdbeFrame
303e0 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 20 2f   *pFrame;      /
303f0 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61 6d 65  * New vdbe frame
30400 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e 20 2a   to execute in *
30410 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
30420 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a 20 53  pProgram;   /* S
30430 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  ub-program to ex
30440 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69 64 20  ecute */.  void 
30450 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *t;             
30460 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64 65 6e     /* Token iden
30470 74 69 66 79 69 6e 67 20 74 72 69 67 67 65 72 20  tifying trigger 
30480 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d 20 3d  */..  pProgram =
30490 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
304a0 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d 65 6d  m;.  pRt = &aMem
304b0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
304c0 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
304d0 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  Op>0 );.  .  /* 
304e0 49 66 20 74 68 65 20 70 35 20 66 6c 61 67 20 69  If the p5 flag i
304f0 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65  s clear, then re
30500 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69  cursive invocati
30510 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73 20 69  on of triggers i
30520 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64  s .  ** disabled
30530 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   for backwards c
30540 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28 70 35  ompatibility (p5
30550 20 69 73 20 73 65 74 20 69 66 20 74 68 69 73 20   is set if this 
30560 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20 2a 2a  sub-program.  **
30570 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74 72 69   is really a tri
30580 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f 72 65  gger, not a fore
30590 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20  ign key action, 
305a0 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73 65 74  and the flag set
305b0 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 65  .  ** and cleare
305c0 64 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  d by the "PRAGMA
305d0 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
305e0 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ers" command is 
305f0 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a 20 20  clear)..  ** .  
30600 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72 73 69  ** It is recursi
30610 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ve invocation of
30620 20 74 72 69 67 67 65 72 73 2c 20 61 74 20 74 68   triggers, at th
30630 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74 68 61  e SQL level, tha
30640 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62  t is .  ** disab
30650 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  led. In some cas
30660 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72 69 67  es a single trig
30670 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61 74 65  ger may generate
30680 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 0a   more than one .
30690 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20    ** SubProgram 
306a0 28 69 66 20 74 68 65 20 74 72 69 67 67 65 72 20  (if the trigger 
306b0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
306c0 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f  with more than o
306d0 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a 20 20  ne different .  
306e0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61  ** ON CONFLICT a
306f0 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62 50 72  lgorithm). SubPr
30700 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 73  ogram structures
30710 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30720 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 74   a.  ** single t
30730 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76 65 20  rigger all have 
30740 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 66  the same value f
30750 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  or the SubProgra
30760 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76 61  m.token .  ** va
30770 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  riable.  */.  if
30780 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20  ( pOp->p5 ){.   
30790 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74   t = pProgram->t
307a0 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 70 46  oken;.    for(pF
307b0 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
307c0 70 46 72 61 6d 65 20 26 26 20 70 46 72 61 6d 65  pFrame && pFrame
307d0 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46 72 61  ->token!=t; pFra
307e0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
307f0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nt);.    if( pFr
30800 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ame ) break;.  }
30810 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d  ..  if( p->nFram
30820 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e>=db->aLimit[SQ
30830 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
30840 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20 20 20  ER_DEPTH] ){.   
30850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
30860 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
30870 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74 6f 6f  dbeError(p, "too
30880 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
30890 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
308a0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  n");.    goto ab
308b0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
308c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
308d0 73 74 65 72 20 70 52 74 20 69 73 20 75 73 65 64  ster pRt is used
308e0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6d 65   to store the me
308f0 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 74 6f  mory required to
30900 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 0a   save the state.
30910 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72    ** of the curr
30920 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64  ent program, and
30930 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
30940 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d 65 20  ired at runtime 
30950 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a 2a 20  to execute.  ** 
30960 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
30970 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74 72 69  ram. If this tri
30980 67 67 65 72 20 68 61 73 20 62 65 65 6e 20 66 69  gger has been fi
30990 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  red before, then
309a0 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c   pRt .  ** is al
309b0 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e  ready allocated.
309c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
309d0 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ust be initializ
309e0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  ed.  */.  if( (p
309f0 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72  Rt->flags&MEM_Fr
30a00 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ame)==0 ){.    /
30a10 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65  * SubProgram.nMe
30a20 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  m is set to the 
30a30 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  number of memory
30a40 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79 20 74   cells used by t
30a50 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72  he .    ** progr
30a60 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53 75 62  am stored in Sub
30a70 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20  Program.aOp. As 
30a80 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c 20 6f  well as these, o
30a90 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  ne memory.    **
30aa0 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69 72 65   cell is require
30ab0 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73 6f  d for each curso
30ac0 72 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  r used by the pr
30ad0 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c  ogram. Set local
30ae0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
30af0 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74 65 72   nMem (and later
30b00 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43 68 69  , VdbeFrame.nChi
30b10 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73 20 76  ldMem) to this v
30b20 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
30b30 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d   nMem = pProgram
30b40 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61  ->nMem + pProgra
30b50 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61 73 73  m->nCsr;.    ass
30b60 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20  ert( nMem>0 );. 
30b70 20 20 20 69 66 28 20 70 50 72 6f 67 72 61 6d 2d     if( pProgram-
30b80 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b  >nCsr==0 ) nMem+
30b90 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52  +;.    nByte = R
30ba0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64 62  OUND8(sizeof(Vdb
30bb0 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20 20 20  eFrame)).       
30bc0 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20         + nMem * 
30bd0 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20  sizeof(Mem).    
30be0 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72 6f            + pPro
30bf0 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a  gram->nCsr * siz
30c00 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
30c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b  .              +
30c20 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20   (pProgram->nOp 
30c30 2b 20 37 29 2f 38 3b 0a 20 20 20 20 70 46 72 61  + 7)/8;.    pFra
30c40 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
30c50 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
30c60 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 46  te);.    if( !pF
30c70 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 67 6f  rame ){.      go
30c80 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
30c90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30ca0 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74 29 3b  MemRelease(pRt);
30cb0 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67 73 20  .    pRt->flags 
30cc0 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20  = MEM_Frame;.   
30cd0 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d   pRt->u.pFrame =
30ce0 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46   pFrame;..    pF
30cf0 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20  rame->v = p;.   
30d00 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d   pFrame->nChildM
30d10 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70  em = nMem;.    p
30d20 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72  Frame->nChildCsr
30d30 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73   = pProgram->nCs
30d40 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 70  r;.    pFrame->p
30d50 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  c = (int)(pOp - 
30d60 61 4f 70 29 3b 0a 20 20 20 20 70 46 72 61 6d 65  aOp);.    pFrame
30d70 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d  ->aMem = p->aMem
30d80 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d  ;.    pFrame->nM
30d90 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20  em = p->nMem;.  
30da0 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 20    pFrame->apCsr 
30db0 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20  = p->apCsr;.    
30dc0 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20  pFrame->nCursor 
30dd0 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  = p->nCursor;.  
30de0 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20    pFrame->aOp = 
30df0 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46 72 61  p->aOp;.    pFra
30e00 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  me->nOp = p->nOp
30e10 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f  ;.    pFrame->to
30e20 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e  ken = pProgram->
30e30 74 6f 6b 65 6e 3b 0a 23 69 66 64 65 66 20 53 51  token;.#ifdef SQ
30e40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
30e50 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
30e60 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 20 3d  pFrame->anExec =
30e70 20 70 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64   p->anExec;.#end
30e80 69 66 0a 0a 20 20 20 20 70 45 6e 64 20 3d 20 26  if..    pEnd = &
30e90 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
30ea0 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68  ame)[pFrame->nCh
30eb0 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72  ildMem];.    for
30ec0 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d  (pMem=VdbeFrameM
30ed0 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d  em(pFrame); pMem
30ee0 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b  !=pEnd; pMem++){
30ef0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
30f00 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
30f10 65 64 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ed;.      pMem->
30f20 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
30f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 61   }else{.    pFra
30f40 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61  me = pRt->u.pFra
30f50 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
30f60 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70  pProgram->nMem+p
30f70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70  Program->nCsr==p
30f80 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Frame->nChildMem
30f90 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50   .        || (pP
30fa0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20  rogram->nCsr==0 
30fb0 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65  && pProgram->nMe
30fc0 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68  m+1==pFrame->nCh
30fd0 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20 20 20 61  ildMem) );.    a
30fe0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
30ff0 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e  >nCsr==pFrame->n
31000 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20 20 20  ChildCsr );.    
31010 61 73 73 65 72 74 28 20 28 69 6e 74 29 28 70 4f  assert( (int)(pO
31020 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72 61 6d 65  p - aOp)==pFrame
31030 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70  ->pc );.  }..  p
31040 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46  ->nFrame++;.  pF
31050 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  rame->pParent = 
31060 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70 46 72  p->pFrame;.  pFr
31070 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  ame->lastRowid =
31080 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
31090 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67    pFrame->nChang
310a0 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65 3b 0a  e = p->nChange;.
310b0 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61    pFrame->nDbCha
310c0 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e 6e 43 68  nge = p->db->nCh
310d0 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  ange;.  assert( 
310e0 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61  pFrame->pAuxData
310f0 3d 3d 30 20 29 3b 0a 20 20 70 46 72 61 6d 65 2d  ==0 );.  pFrame-
31100 3e 70 41 75 78 44 61 74 61 20 3d 20 70 2d 3e 70  >pAuxData = p->p
31110 41 75 78 44 61 74 61 3b 0a 20 20 70 2d 3e 70 41  AuxData;.  p->pA
31120 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 70 2d  uxData = 0;.  p-
31130 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
31140 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61  p->pFrame = pFra
31150 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  me;.  p->aMem = 
31160 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
31170 4d 65 6d 28 70 46 72 61 6d 65 29 3b 0a 20 20 70  Mem(pFrame);.  p
31180 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
31190 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20 20 70 2d  >nChildMem;.  p-
311a0 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29  >nCursor = (u16)
311b0 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43 73  pFrame->nChildCs
311c0 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  r;.  p->apCsr = 
311d0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
311e0 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20  aMem[p->nMem];. 
311f0 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 20 3d   pFrame->aOnce =
31200 20 28 75 38 2a 29 26 70 2d 3e 61 70 43 73 72 5b   (u8*)&p->apCsr[
31210 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 5d 3b  pProgram->nCsr];
31220 0a 20 20 6d 65 6d 73 65 74 28 70 46 72 61 6d 65  .  memset(pFrame
31230 2d 3e 61 4f 6e 63 65 2c 20 30 2c 20 28 70 50 72  ->aOnce, 0, (pPr
31240 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20 37 29 2f  ogram->nOp + 7)/
31250 38 29 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 61  8);.  p->aOp = a
31260 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 61  Op = pProgram->a
31270 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d 20 70  Op;.  p->nOp = p
31280 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a 23 69  Program->nOp;.#i
31290 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
312a0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
312b0 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d  US.  p->anExec =
312c0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4f 70   0;.#endif.  pOp
312d0 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a 0a 20 20   = &aOp[-1];..  
312e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
312f0 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20 50 32  ode: Param P1 P2
31300 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
31310 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79  s opcode is only
31320 20 65 76 65 72 20 70 72 65 73 65 6e 74 20 69 6e   ever present in
31330 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 61   sub-programs ca
31340 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a 2a 2a  lled via the .**
31350 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e 73 74   OP_Program inst
31360 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20 61 20  ruction. Copy a 
31370 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
31380 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65 6d 6f  stored in a memo
31390 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66 20 74  ry .** cell of t
313a0 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61 72 65  he calling (pare
313b0 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63 65 6c  nt) frame to cel
313c0 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75 72 72  l P2 in the curr
313d0 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a 20 61  ent frames .** a
313e0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 54 68  ddress space. Th
313f0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 72  is is used by tr
31400 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 74  igger programs t
31410 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e 65 77  o access the new
31420 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64 2e 2a  .* .** and old.*
31430 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   values..**.** T
31440 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
31450 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
31460 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20 64 65  rent frame is de
31470 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64 64 69  termined by addi
31480 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  ng.** the value 
31490 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
314a0 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  nt to the value 
314b0 6f 66 20 74 68 65 20 50 31 20 61 72 67 75 6d 65  of the P1 argume
314c0 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63 61 6c  nt to the.** cal
314d0 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d 20  ling OP_Program 
314e0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
314f0 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a 20 7b  case OP_Param: {
31500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
31510 74 32 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  t2 */.  VdbeFram
31520 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d 65 6d  e *pFrame;.  Mem
31530 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74 20 3d 20   *pIn;.  pOut = 
31540 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
31550 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72 61 6d 65  , pOp);.  pFrame
31560 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20   = p->pFrame;.  
31570 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61  pIn = &pFrame->a
31580 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20 70 46  Mem[pOp->p1 + pF
31590 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61 6d 65  rame->aOp[pFrame
315a0 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a 20 20  ->pc].p1];   .  
315b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
315c0 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20  allowCopy(pOut, 
315d0 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  pIn, MEM_Ephem);
315e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 65 6e  .  break;.}..#en
315f0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
31600 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
31610 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ER */..#ifndef S
31620 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
31630 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f 64 65  GN_KEY./* Opcode
31640 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31 20 50  : FkCounter P1 P
31650 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
31660 73 69 73 3a 20 66 6b 63 74 72 5b 50 31 5d 2b 3d  sis: fkctr[P1]+=
31670 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  P2.**.** Increme
31680 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69 6e 74  nt a "constraint
31690 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50 32 20   counter" by P2 
316a0 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67 61 74  (P2 may be negat
316b0 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76 65 29  ive or positive)
316c0 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f  ..** If P1 is no
316d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61 74 61  n-zero, the data
316e0 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  base constraint 
316f0 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65  counter is incre
31700 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65 66 65  mented .** (defe
31710 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
31720 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e 20 4f   constraints). O
31730 74 68 65 72 77 69 73 65 2c 20 69 66 20 50 31 20  therwise, if P1 
31740 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a 2a 2a  is zero, the .**
31750 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75 6e 74   statement count
31760 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  er is incremente
31770 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  d (immediate for
31780 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
31790 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ints)..*/.case O
317a0 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b 0a 20  P_FkCounter: {. 
317b0 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26   if( db->flags &
317c0 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73   SQLITE_DeferFKs
317d0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
317e0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 2b 3d 20  erredImmCons += 
317f0 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65  pOp->p2;.  }else
31800 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a   if( pOp->p1 ){.
31810 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
31820 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32  dCons += pOp->p2
31830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
31840 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
31850 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 0a  += pOp->p2;.  }.
31860 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
31870 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72 6f 20  pcode: FkIfZero 
31880 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
31890 79 6e 6f 70 73 69 73 3a 20 69 66 20 66 6b 63 74  ynopsis: if fkct
318a0 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f 20 50 32  r[P1]==0 goto P2
318b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
318c0 64 65 20 74 65 73 74 73 20 69 66 20 61 20 66 6f  de tests if a fo
318d0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
318e0 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69 73 20  aint-counter is 
318f0 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2e 0a  currently zero..
31900 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70 20 74  ** If so, jump t
31910 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32  o instruction P2
31920 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  . Otherwise, fal
31930 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
31940 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74 72 75   next .** instru
31950 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
31960 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P1 is non-zero, 
31970 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20 69 73  then the jump is
31980 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 64 61   taken if the da
31990 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
319a0 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69 73 20  t-counter.** is 
319b0 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20 74 68  zero (the one th
319c0 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65 72 72  at counts deferr
319d0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  ed constraint vi
319e0 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20 50 31  olations). If P1
319f0 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74 68 65   is.** zero, the
31a00 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69   jump is taken i
31a10 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
31a20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
31a30 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 69  er is zero.** (i
31a40 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
31a50 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20   key constraint 
31a60 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a 2f 0a  violations)..*/.
31a70 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65 72 6f  case OP_FkIfZero
31a80 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  : {         /* j
31a90 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 70  ump */.  if( pOp
31aa0 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56 64 62 65  ->p1 ){.    Vdbe
31ab0 42 72 61 6e 63 68 54 61 6b 65 6e 28 64 62 2d 3e  BranchTaken(db->
31ac0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30  nDeferredCons==0
31ad0 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   && db->nDeferre
31ae0 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b  dImmCons==0, 2);
31af0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 44 65  .    if( db->nDe
31b00 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20 26 26  ferredCons==0 &&
31b10 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
31b20 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20  mCons==0 ) goto 
31b30 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65  jump_to_p2;.  }e
31b40 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72 61  lse{.    VdbeBra
31b50 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e 46 6b 43  nchTaken(p->nFkC
31b60 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20  onstraint==0 && 
31b70 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
31b80 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20 20 20  Cons==0, 2);.   
31b90 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74   if( p->nFkConst
31ba0 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62 2d 3e  raint==0 && db->
31bb0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
31bc0 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ==0 ) goto jump_
31bd0 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
31be0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
31bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31c00 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 20  MIT_FOREIGN_KEY 
31c10 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
31c20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
31c30 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  EMENT./* Opcode:
31c40 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20 2a 20   MemMax P1 P2 * 
31c50 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
31c60 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b 50 31 5d   r[P1]=max(r[P1]
31c70 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 50 31  ,r[P2]).**.** P1
31c80 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 69   is a register i
31c90 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65  n the root frame
31ca0 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74 68 65   of this VM (the
31cb0 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73 0a 2a   root frame is.*
31cc0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
31cd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
31ce0 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73 74 72  me if this instr
31cf0 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  uction is being 
31d00 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69 74 68  executed.** with
31d10 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d  in a sub-program
31d20 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ). Set the value
31d30 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
31d40 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  to the maximum o
31d50 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72 65 6e  f .** its curren
31d60 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  t value and the 
31d70 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
31d80 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P2..**.** This
31d90 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 72   instruction thr
31da0 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ows an error if 
31db0 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
31dc0 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
31dd0 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  .** an integer..
31de0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d 4d 61  */.case OP_MemMa
31df0 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 69  x: {        /* i
31e00 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d  n2 */.  VdbeFram
31e10 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69 66 28  e *pFrame;.  if(
31e20 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
31e30 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
31e40 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
31e50 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
31e60 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
31e70 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 70 46  ;.    pIn1 = &pF
31e80 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e  rame->aMem[pOp->
31e90 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  p1];.  }else{.  
31ea0 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
31eb0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20 20 61  Op->p1];.  }.  a
31ec0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
31ed0 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73 71 6c  d(pIn1) );.  sql
31ee0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67  ite3VdbeMemInteg
31ef0 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70  erify(pIn1);.  p
31f00 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
31f10 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2];.  sqlite3V
31f20 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66 79  dbeMemIntegerify
31f30 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20 70 49  (pIn2);.  if( pI
31f40 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e 75 2e  n1->u.i<pIn2->u.
31f50 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e  i){.    pIn1->u.
31f60 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20  i = pIn2->u.i;. 
31f70 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
31f80 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31f90 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
31fa0 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  T */../* Opcode:
31fb0 20 49 66 50 6f 73 20 50 31 20 50 32 20 50 33 20   IfPos P1 P2 P3 
31fc0 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
31fd0 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e   if r[P1]>0 then
31fe0 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f 74 6f   r[P1]-=P3, goto
31ff0 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74   P2.**.** Regist
32000 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61  er P1 must conta
32010 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  in an integer..*
32020 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f  * If the value o
32030 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  f register P1 is
32040 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c 20 73   1 or greater, s
32050 75 62 74 72 61 63 74 20 50 33 20 66 72 6f 6d 20  ubtract P3 from 
32060 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e 20  the.** value in 
32070 50 31 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50  P1 and jump to P
32080 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  2..**.** If the 
32090 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
320a0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
320b0 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74 68 65  less than 1, the
320c0 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  n the.** value i
320d0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
320e0 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65 73 20 74  control passes t
320f0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
32100 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  xt instruction..
32110 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50 6f 73  */.case OP_IfPos
32120 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
32130 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e  mp, in1 */.  pIn
32140 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
32150 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  1];.  assert( pI
32160 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  n1->flags&MEM_In
32170 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  t );.  VdbeBranc
32180 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d 3e 75 2e  hTaken( pIn1->u.
32190 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  i>0, 2);.  if( p
321a0 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a 20 20  In1->u.i>0 ){.  
321b0 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d 20 70    pIn1->u.i -= p
321c0 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f 74 6f  Op->p3;.    goto
321d0 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
321e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
321f0 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74 4c 69  Opcode: OffsetLi
32200 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  mit P1 P2 P3 * *
32210 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
32220 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20 72 5b   r[P1]>0 then r[
32230 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28 30 2c  P2]=r[P1]+max(0,
32240 72 5b 50 33 5d 29 20 65 6c 73 65 20 72 5b 50 32  r[P3]) else r[P2
32250 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54 68 69  ]=(-1).**.** Thi
32260 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d  s opcode perform
32270 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65  s a commonly use
32280 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 61 73  d computation as
32290 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
322a0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
322b0 54 20 70 72 6f 63 65 73 73 2e 20 20 72 5b 50 31  T process.  r[P1
322c0 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 6d 69  ] holds the limi
322d0 74 20 63 6f 75 6e 74 65 72 2e 20 20 72 5b 50 33  t counter.  r[P3
322e0 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 6f  ].** holds the o
322f0 66 66 73 65 74 20 63 6f 75 6e 74 65 72 2e 20 20  ffset counter.  
32300 54 68 65 20 6f 70 63 6f 64 65 20 63 6f 6d 70 75  The opcode compu
32310 74 65 73 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  tes the combined
32320 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
32330 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
32340 54 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61  T and stores tha
32350 74 20 76 61 6c 75 65 20 69 6e 20 72 5b 50 32 5d  t value in r[P2]
32360 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a 2a 2a 20  .  The r[P2].** 
32370 76 61 6c 75 65 20 63 6f 6d 70 75 74 65 64 20 69  value computed i
32380 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
32390 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
323a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 0a  will need to be.
323b0 2a 2a 20 76 69 73 69 74 65 64 20 69 6e 20 6f 72  ** visited in or
323c0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
323d0 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  the query..**.**
323e0 20 49 66 20 72 5b 50 33 5d 20 69 73 20 7a 65 72   If r[P3] is zer
323f0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74  o or negative, t
32400 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20  hat means there 
32410 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a 2a 2a 20  is no OFFSET.** 
32420 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74  and r[P2] is set
32430 20 74 6f 20 62 65 20 74 68 65 20 76 61 6c 75 65   to be the value
32440 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 2c 20 72   of the LIMIT, r
32450 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 72  [P1]..**.** if r
32460 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20 6f 72 20  [P1] is zero or 
32470 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74 20 6d  negative, that m
32480 65 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f  eans there is no
32490 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64 20 72 5b   LIMIT.** and r[
324a0 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20 2d 31  P2] is set to -1
324b0 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  . .**.** Otherwi
324c0 73 65 2c 20 72 5b 50 32 5d 20 69 73 20 73 65 74  se, r[P2] is set
324d0 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 72   to the sum of r
324e0 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33 5d 2e 0a  [P1] and r[P3]..
324f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66 73 65  */.case OP_Offse
32500 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20 2f 2a 20  tLimit: {    /* 
32510 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e 33 20 2a  in1, out2, in3 *
32520 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20 70 49 6e  /.  i64 x;.  pIn
32530 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
32540 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
32550 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70  em[pOp->p3];.  p
32560 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
32570 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
32580 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c  assert( pIn1->fl
32590 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
325a0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d  .  assert( pIn3-
325b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
325c0 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e 31 2d 3e   );.  x = pIn1->
325d0 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c 3d 30 20  u.i;.  if( x<=0 
325e0 7c 7c 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74  || sqlite3AddInt
325f0 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e 75 2e 69  64(&x, pIn3->u.i
32600 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30 29 20  >0?pIn3->u.i:0) 
32610 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
32620 20 4c 49 4d 49 54 20 69 73 20 6c 65 73 73 20 74   LIMIT is less t
32630 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
32640 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72 65 76  zero, loop forev
32650 65 72 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a  er.  This.    **
32660 20 69 73 20 64 6f 63 75 6d 65 6e 74 65 64 2e 20   is documented. 
32670 20 42 75 74 20 61 6c 73 6f 2c 20 69 66 20 74 68   But also, if th
32680 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65  e LIMIT+OFFSET e
32690 78 63 65 65 64 73 20 32 5e 36 33 20 74 68 65 6e  xceeds 2^63 then
326a0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6c 6f 6f  .    ** also loo
326b0 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73  p forever.  This
326c0 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   is undocumented
326d0 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f 6e 65 20  .  In fact, one 
326e0 63 6f 75 6c 64 20 61 72 67 75 65 0a 20 20 20 20  could argue.    
326f0 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  ** that the loop
32700 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e 61 74   should terminat
32710 65 2e 20 20 42 75 74 20 61 73 73 75 6d 69 6e 67  e.  But assuming
32720 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74 65 72 61   1 billion itera
32730 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 70 65 72  tions.    ** per
32740 20 73 65 63 6f 6e 64 20 28 66 61 72 20 65 78 63   second (far exc
32750 65 65 64 69 6e 67 20 74 68 65 20 63 61 70 61 62  eeding the capab
32760 69 6c 69 74 69 65 73 20 6f 66 20 61 6e 79 20 63  ilities of any c
32770 75 72 72 65 6e 74 20 68 61 72 64 77 61 72 65 29  urrent hardware)
32780 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64  .    ** it would
32790 20 74 61 6b 65 20 6e 65 61 72 6c 79 20 33 30 30   take nearly 300
327a0 20 79 65 61 72 73 20 74 6f 20 61 63 74 75 61 6c   years to actual
327b0 6c 79 20 72 65 61 63 68 20 74 68 65 20 6c 69 6d  ly reach the lim
327c0 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 6c  it.  So.    ** l
327d0 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65 72 20 69  ooping forever i
327e0 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61  s a reasonable a
327f0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e 20 2a 2f  pproximation. */
32800 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
32810 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
32820 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 78 3b    pOut->u.i = x;
32830 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
32840 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f  ./* Opcode: IfNo
32850 74 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20  tZero P1 P2 * * 
32860 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
32870 66 20 72 5b 50 31 5d 21 3d 30 20 74 68 65 6e 20  f r[P1]!=0 then 
32880 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20 50 32  r[P1]--, goto P2
32890 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
328a0 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  P1 must contain 
328b0 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20  an integer.  If 
328c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
328d0 65 67 69 73 74 65 72 20 50 31 20 69 73 0a 2a 2a  egister P1 is.**
328e0 20 69 6e 69 74 69 61 6c 6c 79 20 67 72 65 61 74   initially great
328f0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
32900 65 6e 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  en decrement the
32910 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
32920 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20 69 74 20  er P1..** If it 
32930 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 65 67  is non-zero (neg
32940 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76  ative or positiv
32950 65 29 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f  e) and then also
32960 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20 0a 2a   jump to P2.  .*
32970 2a 20 49 66 20 72 65 67 69 73 74 65 72 20 50 31  * If register P1
32980 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 7a 65   is initially ze
32990 72 6f 2c 20 6c 65 61 76 65 20 69 74 20 75 6e 63  ro, leave it unc
329a0 68 61 6e 67 65 64 20 61 6e 64 20 66 61 6c 6c 20  hanged and fall 
329b0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65  through..*/.case
329c0 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a 20 7b   OP_IfNotZero: {
329d0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
329e0 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
329f0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
32a00 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
32a10 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
32a20 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
32a30 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c 30 2c  ken(pIn1->u.i<0,
32a40 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d   2);.  if( pIn1-
32a50 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 69 66 28  >u.i ){.     if(
32a60 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 20 70   pIn1->u.i>0 ) p
32a70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 20 20  In1->u.i--;.    
32a80 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
32a90 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
32aa0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 63  ../* Opcode: Dec
32ab0 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20 50 32 20  rJumpZero P1 P2 
32ac0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
32ad0 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31 5d 29 3d  s: if (--r[P1])=
32ae0 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a  =0 goto P2.**.**
32af0 20 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73   Register P1 mus
32b00 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74 65 67 65  t hold an intege
32b10 72 2e 20 20 44 65 63 72 65 6d 65 6e 74 20 74 68  r.  Decrement th
32b20 65 20 76 61 6c 75 65 20 69 6e 20 50 31 0a 2a 2a  e value in P1.**
32b30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50 32 20   and jump to P2 
32b40 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  if the new value
32b50 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65 72 6f   is exactly zero
32b60 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 63  ..*/.case OP_Dec
32b70 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20 20 20  rJumpZero: {    
32b80 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a    /* jump, in1 *
32b90 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  /.  pIn1 = &aMem
32ba0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
32bb0 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
32bc0 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 69 66  &MEM_Int );.  if
32bd0 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d 41 4c  ( pIn1->u.i>SMAL
32be0 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 70 49 6e  LEST_INT64 ) pIn
32bf0 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64 62 65  1->u.i--;.  Vdbe
32c00 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31  BranchTaken(pIn1
32c10 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a 20 20  ->u.i==0, 2);.  
32c20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30  if( pIn1->u.i==0
32c30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
32c40 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
32c50 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53  ./* Opcode: AggS
32c60 74 65 70 30 20 2a 20 50 32 20 50 33 20 50 34 20  tep0 * P2 P3 P4 
32c70 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
32c80 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70  accum=r[P3] step
32c90 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a  (r[P2@P5]).**.**
32ca0 20 45 78 65 63 75 74 65 20 74 68 65 20 73 74 65   Execute the ste
32cb0 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  p function for a
32cc0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
32cd0 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61  e.** function ha
32ce0 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20  s P5 arguments. 
32cf0 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65    P4 is a pointe
32d00 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66  r to the FuncDef
32d10 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
32d20 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  at specifies the
32d30 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 67 69   function.  Regi
32d40 73 74 65 72 20 50 33 20 69 73 20 74 68 65 0a 2a  ster P3 is the.*
32d50 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  * accumulator..*
32d60 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72 67 75  *.** The P5 argu
32d70 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65 6e 20  ments are taken 
32d80 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 32  from register P2
32d90 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75 63 63   and its.** succ
32da0 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70  essors..*/./* Op
32db0 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20 2a 20  code: AggStep * 
32dc0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
32dd0 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d 72  ynopsis: accum=r
32de0 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32 40 50  [P3] step(r[P2@P
32df0 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74  5]).**.** Execut
32e00 65 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74  e the step funct
32e10 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65  ion for an aggre
32e20 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75  gate.  The.** fu
32e30 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20 61 72  nction has P5 ar
32e40 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20 69 73  guments.   P4 is
32e50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
32e60 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
32e70 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
32e80 69 73 20 75 73 65 64 20 74 6f 20 72 75 6e 20 74  is used to run t
32e90 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  he function.  Re
32ea0 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a 2a 20  gister P3 is.** 
32eb0 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  as the accumulat
32ec0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35  or..**.** The P5
32ed0 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
32ee0 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74  aken from regist
32ef0 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a  er P2 and its.**
32f00 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2a 0a   successors..**.
32f10 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
32f20 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 64 65  s initially code
32f30 64 20 61 73 20 4f 50 5f 41 67 67 53 74 65 70 30  d as OP_AggStep0
32f40 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 76 61 6c  .  On first eval
32f50 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 46  uation,.** the F
32f60 75 6e 63 44 65 66 20 73 74 6f 72 65 64 20 69 6e  uncDef stored in
32f70 20 50 34 20 69 73 20 63 6f 6e 76 65 72 74 65 64   P4 is converted
32f80 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33   into an sqlite3
32f90 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a 2a 20  _context and.** 
32fa0 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68  the opcode is ch
32fb0 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 69 73 20  anged.  In this 
32fc0 77 61 79 2c 20 74 68 65 20 69 6e 69 74 69 61 6c  way, the initial
32fd0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ization of the.*
32fe0 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  * sqlite3_contex
32ff0 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f  t only happens o
33000 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  nce, instead of 
33010 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  on each call to 
33020 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 75 6e 63  the.** step func
33030 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
33040 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a 20 20 69  _AggStep0: {.  i
33050 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt n;.  sqlite3_
33060 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 0a  context *pCtx;..
33070 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
33080 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44 45  4type==P4_FUNCDE
33090 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e  F );.  n = pOp->
330a0 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p5;.  assert( pO
330b0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
330c0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
330d0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
330e0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 7c    assert( n==0 |
330f0 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  | (pOp->p2>0 && 
33100 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e 6e  pOp->p2+n<=(p->n
33110 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
33120 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  or)+1) );.  asse
33130 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d  rt( pOp->p3<pOp-
33140 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d  >p2 || pOp->p3>=
33150 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20 70  pOp->p2+n );.  p
33160 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ctx = sqlite3DbM
33170 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
33180 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b 20 28  izeof(*pCtx) + (
33190 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71 6c 69  n-1)*sizeof(sqli
331a0 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a 20 20  te3_value*));.  
331b0 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20 67 6f  if( pCtx==0 ) go
331c0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 74  to no_mem;.  pCt
331d0 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  x->pMem = 0;.  p
331e0 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f 70  Ctx->pFunc = pOp
331f0 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70 43  ->p4.pFunc;.  pC
33200 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29 28  tx->iOp = (int)(
33210 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70 43  pOp - aOp);.  pC
33220 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20  tx->pVdbe = p;. 
33230 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e 3b   pCtx->argc = n;
33240 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
33250 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20 70   P4_FUNCCTX;.  p
33260 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70 43  Op->p4.pCtx = pC
33270 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  tx;.  pOp->opcod
33280 65 20 3d 20 4f 50 5f 41 67 67 53 74 65 70 3b 0a  e = OP_AggStep;.
33290 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
332a0 68 20 69 6e 74 6f 20 4f 50 5f 41 67 67 53 74 65  h into OP_AggSte
332b0 70 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f 50 5f 41  p */.}.case OP_A
332c0 67 67 53 74 65 70 3a 20 7b 0a 20 20 69 6e 74 20  ggStep: {.  int 
332d0 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  i;.  sqlite3_con
332e0 74 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 4d 65  text *pCtx;.  Me
332f0 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d 65 6d 20 74  m *pMem;.  Mem t
33300 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
33310 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e  ->p4type==P4_FUN
33320 43 43 54 58 20 29 3b 0a 20 20 70 43 74 78 20 3d  CCTX );.  pCtx =
33330 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 20   pOp->p4.pCtx;. 
33340 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f   pMem = &aMem[pO
33350 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20 49 66  p->p3];..  /* If
33360 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33370 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74 72  s inside of a tr
33380 69 67 67 65 72 2c 20 74 68 65 20 72 65 67 69 73  igger, the regis
33390 74 65 72 20 61 72 72 61 79 20 69 6e 20 61 4d 65  ter array in aMe
333a0 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20 63  m[].  ** might c
333b0 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20 65  hange from one e
333c0 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68 65  valuation to the
333d0 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65 78 74   next.  The next
333e0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a 20   block of code. 
333f0 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73 65   ** checks to se
33400 65 20 69 66 20 74 68 65 20 72 65 67 69 73 74 65  e if the registe
33410 72 20 61 72 72 61 79 20 68 61 73 20 63 68 61 6e  r array has chan
33420 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 69  ged, and if so i
33430 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69 61 6c  t.  ** reinitial
33440 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76 61 6e  izes the relavan
33450 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 73  t parts of the s
33460 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f  qlite3_context o
33470 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28 20 70  bject */.  if( p
33480 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70 4d 65  Ctx->pMem != pMe
33490 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 70  m ){.    pCtx->p
334a0 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20  Mem = pMem;.    
334b0 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72 67 63  for(i=pCtx->argc
334c0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 70  -1; i>=0; i--) p
334d0 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 26  Ctx->argv[i] = &
334e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b  aMem[pOp->p2+i];
334f0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
33500 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
33510 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72 67  i=0; i<pCtx->arg
33520 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
33530 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
33540 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20 29  pCtx->argv[i]) )
33550 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
33560 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c 20  RACE(pOp->p2+i, 
33570 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b 0a  pCtx->argv[i]);.
33580 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4d    }.#endif..  pM
33590 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74  em->n++;.  sqlit
335a0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 74  e3VdbeMemInit(&t
335b0 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
335c0 0a 20 20 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20  .  pCtx->pOut = 
335d0 26 74 3b 0a 20 20 70 43 74 78 2d 3e 66 45 72 72  &t;.  pCtx->fErr
335e0 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20 20 70  orOrAux = 0;.  p
335f0 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d 20  Ctx->skipFlag = 
33600 30 3b 0a 20 20 28 70 43 74 78 2d 3e 70 46 75 6e  0;.  (pCtx->pFun
33610 63 2d 3e 78 53 46 75 6e 63 29 28 70 43 74 78 2c  c->xSFunc)(pCtx,
33620 70 43 74 78 2d 3e 61 72 67 63 2c 70 43 74 78 2d  pCtx->argc,pCtx-
33630 3e 61 72 67 76 29 3b 20 2f 2a 20 49 4d 50 3a 20  >argv); /* IMP: 
33640 52 2d 32 34 35 30 35 2d 32 33 32 33 30 20 2a 2f  R-24505-23230 */
33650 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66 45 72  .  if( pCtx->fEr
33660 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20 20 20  rorOrAux ){.    
33670 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f  if( pCtx->isErro
33680 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
33690 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
336a0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  %s", sqlite3_val
336b0 75 65 5f 74 65 78 74 28 26 74 29 29 3b 0a 20 20  ue_text(&t));.  
336c0 20 20 20 20 72 63 20 3d 20 70 43 74 78 2d 3e 69      rc = pCtx->i
336d0 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  sError;.    }.  
336e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
336f0 52 65 6c 65 61 73 65 28 26 74 29 3b 0a 20 20 20  Release(&t);.   
33700 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
33710 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
33720 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  r;.  }else{.    
33730 61 73 73 65 72 74 28 20 74 2e 66 6c 61 67 73 3d  assert( t.flags=
33740 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 7d  =MEM_Null );.  }
33750 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 73 6b 69  .  if( pCtx->ski
33760 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73  pFlag ){.    ass
33770 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
33780 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c 53 65 71 20  ode==OP_CollSeq 
33790 29 3b 0a 20 20 20 20 69 20 3d 20 70 4f 70 5b 2d  );.    i = pOp[-
337a0 31 5d 2e 70 31 3b 0a 20 20 20 20 69 66 28 20 69  1].p1;.    if( i
337b0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
337c0 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b  mSetInt64(&aMem[
337d0 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 62 72  i], 1);.  }.  br
337e0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
337f0 65 3a 20 41 67 67 46 69 6e 61 6c 20 50 31 20 50  e: AggFinal P1 P
33800 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
33810 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 31  psis: accum=r[P1
33820 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a 20 45 78 65  ] N=P2.**.** Exe
33830 63 75 74 65 20 74 68 65 20 66 69 6e 61 6c 69 7a  cute the finaliz
33840 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
33850 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 50  an aggregate.  P
33860 31 20 69 73 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f  1 is.** the memo
33870 72 79 20 6c 6f 63 61 74 69 6f 6e 20 74 68 61 74  ry location that
33880 20 69 73 20 74 68 65 20 61 63 63 75 6d 75 6c 61   is the accumula
33890 74 6f 72 20 66 6f 72 20 74 68 65 20 61 67 67 72  tor for the aggr
338a0 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 32 20  egate..**.** P2 
338b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
338c0 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
338d0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
338e0 6e 20 74 61 6b 65 73 20 61 6e 64 0a 2a 2a 20 50  n takes and.** P
338f0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
33900 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 66 6f  o the FuncDef fo
33910 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
33920 20 20 54 68 65 20 50 32 0a 2a 2a 20 61 72 67 75    The P2.** argu
33930 6d 65 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ment is not used
33940 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 2e   by this opcode.
33950 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 74 68 65    It is only the
33960 72 65 20 74 6f 20 64 69 73 61 6d 62 69 67 75 61  re to disambigua
33970 74 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  te.** functions 
33980 74 68 61 74 20 63 61 6e 20 74 61 6b 65 20 76 61  that can take va
33990 72 79 69 6e 67 20 6e 75 6d 62 65 72 73 20 6f 66  rying numbers of
339a0 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
339b0 0a 2a 2a 20 50 34 20 61 72 67 75 6d 65 6e 74 20  .** P4 argument 
339c0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
339d0 6f 72 20 74 68 65 20 64 65 67 65 6e 65 72 61 74  or the degenerat
339e0 65 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  e case where.** 
339f0 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
33a00 6e 20 77 61 73 20 6e 6f 74 20 70 72 65 76 69 6f  n was not previo
33a10 75 73 6c 79 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  usly called..*/.
33a20 63 61 73 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c  case OP_AggFinal
33a30 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b  : {.  Mem *pMem;
33a40 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
33a50 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  p1>0 && pOp->p1<
33a60 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
33a70 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
33a80 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Mem = &aMem[pOp-
33a90 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
33aa0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 7e  (pMem->flags & ~
33ab0 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 41 67  (MEM_Null|MEM_Ag
33ac0 67 29 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  g))==0 );.  rc =
33ad0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
33ae0 69 6e 61 6c 69 7a 65 28 70 4d 65 6d 2c 20 70 4f  inalize(pMem, pO
33af0 70 2d 3e 70 34 2e 70 46 75 6e 63 29 3b 0a 20 20  p->p4.pFunc);.  
33b00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
33b10 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
33b20 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
33b30 76 61 6c 75 65 5f 74 65 78 74 28 70 4d 65 6d 29  value_text(pMem)
33b40 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  );.    goto abor
33b50 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
33b60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
33b70 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
33b80 70 4d 65 6d 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  pMem, encoding);
33b90 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
33ba0 4f 42 53 49 5a 45 28 70 4d 65 6d 29 3b 0a 20 20  OBSIZE(pMem);.  
33bb0 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
33bc0 65 6d 54 6f 6f 42 69 67 28 70 4d 65 6d 29 20 29  emTooBig(pMem) )
33bd0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
33be0 69 67 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  ig;.  }.  break;
33bf0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
33c00 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 4f  TE_OMIT_WAL./* O
33c10 70 63 6f 64 65 3a 20 43 68 65 63 6b 70 6f 69 6e  pcode: Checkpoin
33c20 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  t P1 P2 P3 * *.*
33c30 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
33c40 64 61 74 61 62 61 73 65 20 50 31 2e 20 54 68 69  database P1. Thi
33c50 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
33c60 50 31 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  P1 is not curren
33c70 74 6c 79 20 69 6e 0a 2a 2a 20 57 41 4c 20 6d 6f  tly in.** WAL mo
33c80 64 65 2e 20 50 61 72 61 6d 65 74 65 72 20 50 32  de. Parameter P2
33c90 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
33ca0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
33cb0 53 49 56 45 2c 20 46 55 4c 4c 2c 0a 2a 2a 20 52  SIVE, FULL,.** R
33cc0 45 53 54 41 52 54 2c 20 6f 72 20 54 52 55 4e 43  ESTART, or TRUNC
33cd0 41 54 45 2e 20 20 57 72 69 74 65 20 31 20 6f 72  ATE.  Write 1 or
33ce0 20 30 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 5d 20   0 into mem[P3] 
33cf0 69 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  if the checkpoin
33d00 74 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  t returns.** SQL
33d10 49 54 45 5f 42 55 53 59 20 6f 72 20 6e 6f 74 2c  ITE_BUSY or not,
33d20 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
33d30 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
33d40 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
33d50 0a 2a 2a 20 57 41 4c 20 61 66 74 65 72 20 74 68  .** WAL after th
33d60 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 6e 74  e checkpoint int
33d70 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20 61 6e 64 20  o mem[P3+1] and 
33d80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
33d90 67 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 57 41  ges.** in the WA
33da0 4c 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  L that have been
33db0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 61 66   checkpointed af
33dc0 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
33dd0 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 73 20  nt.** completes 
33de0 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 32 5d 2e 20  into mem[P3+2]. 
33df0 20 48 6f 77 65 76 65 72 20 6f 6e 20 61 6e 20 65   However on an e
33e00 72 72 6f 72 2c 20 6d 65 6d 5b 50 33 2b 31 5d 20  rror, mem[P3+1] 
33e10 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50 33 2b 32 5d  and.** mem[P3+2]
33e20 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
33e30 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63 61 73 65 20   to -1..*/.case 
33e40 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 20 7b  OP_Checkpoint: {
33e50 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
33e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e70 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
33e80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 52 65 73  er */.  int aRes
33e90 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
33ea0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
33eb0 74 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ts */.  Mem *pMe
33ec0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
33ed0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
33ee0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
33ef0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
33f00 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
33f10 61 52 65 73 5b 30 5d 20 3d 20 30 3b 0a 20 20 61  aRes[0] = 0;.  a
33f20 52 65 73 5b 31 5d 20 3d 20 61 52 65 73 5b 32 5d  Res[1] = aRes[2]
33f30 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
33f40 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
33f50 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
33f60 49 56 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  IVE.       || pO
33f70 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
33f80 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 0a 20 20  ECKPOINT_FULL.  
33f90 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d       || pOp->p2=
33fa0 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
33fb0 4e 54 5f 52 45 53 54 41 52 54 0a 20 20 20 20 20  NT_RESTART.     
33fc0 20 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51    || pOp->p2==SQ
33fd0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
33fe0 54 52 55 4e 43 41 54 45 0a 20 20 29 3b 0a 20 20  TRUNCATE.  );.  
33ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
34000 6b 70 6f 69 6e 74 28 64 62 2c 20 70 4f 70 2d 3e  kpoint(db, pOp->
34010 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 26 61 52  p1, pOp->p2, &aR
34020 65 73 5b 31 5d 2c 20 26 61 52 65 73 5b 32 5d 29  es[1], &aRes[2])
34030 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
34040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34050 5f 42 55 53 59 20 29 20 67 6f 74 6f 20 61 62 6f  _BUSY ) goto abo
34060 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
34070 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
34080 5f 4f 4b 3b 0a 20 20 20 20 61 52 65 73 5b 30 5d  _OK;.    aRes[0]
34090 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   = 1;.  }.  for(
340a0 69 3d 30 2c 20 70 4d 65 6d 20 3d 20 26 61 4d 65  i=0, pMem = &aMe
340b0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20 69 3c 33 3b  m[pOp->p3]; i<3;
340c0 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20   i++, pMem++){. 
340d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
340e0 6d 53 65 74 49 6e 74 36 34 28 70 4d 65 6d 2c 20  mSetInt64(pMem, 
340f0 28 69 36 34 29 61 52 65 73 5b 69 5d 29 3b 0a 20  (i64)aRes[i]);. 
34100 20 7d 20 20 20 20 0a 20 20 62 72 65 61 6b 3b 0a   }    .  break;.
34110 7d 3b 20 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66  };  .#endif..#if
34120 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34130 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f 70 63 6f 64  _PRAGMA./* Opcod
34140 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f 64 65 20 50  e: JournalMode P
34150 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
34160 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75  * Change the jou
34170 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 64 61 74  rnal mode of dat
34180 61 62 61 73 65 20 50 31 20 74 6f 20 50 33 2e 20  abase P1 to P3. 
34190 50 33 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  P3 must be one o
341a0 66 20 74 68 65 0a 2a 2a 20 50 41 47 45 52 5f 4a  f the.** PAGER_J
341b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58 58 58 20 76  OURNALMODE_XXX v
341c0 61 6c 75 65 73 2e 20 49 66 20 63 68 61 6e 67 69  alues. If changi
341d0 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65 20 76  ng between the v
341e0 61 72 69 6f 75 73 20 72 6f 6c 6c 62 61 63 6b 0a  arious rollback.
341f0 2a 2a 20 6d 6f 64 65 73 20 28 64 65 6c 65 74 65  ** modes (delete
34200 2c 20 74 72 75 6e 63 61 74 65 2c 20 70 65 72 73  , truncate, pers
34210 69 73 74 2c 20 6f 66 66 20 61 6e 64 20 6d 65 6d  ist, off and mem
34220 6f 72 79 29 2c 20 74 68 69 73 20 69 73 20 61 20  ory), this is a 
34230 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70 65 72 61 74  simple.** operat
34240 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69 73 20 72 65  ion. No IO is re
34250 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
34260 20 63 68 61 6e 67 69 6e 67 20 69 6e 74 6f 20 6f   changing into o
34270 72 20 6f 75 74 20 6f 66 20 57 41 4c 20 6d 6f 64  r out of WAL mod
34280 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 20  e the procedure 
34290 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61  is more complica
342a0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ted..**.** Write
342b0 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
342c0 6e 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 6a  ning the final j
342d0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 74 6f 20 72  ournal-mode to r
342e0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
342f0 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f  ase OP_JournalMo
34300 64 65 3a 20 7b 20 20 20 20 2f 2a 20 6f 75 74 32  de: {    /* out2
34310 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 42 74   */.  Btree *pBt
34320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34330 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
34340 6f 20 63 68 61 6e 67 65 20 6a 6f 75 72 6e 61 6c  o change journal
34350 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a 20 20 50 61   mode of */.  Pa
34360 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
34370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34380 20 50 61 67 65 72 20 61 73 73 6f 63 69 61 74 65   Pager associate
34390 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20  d with pBt */.  
343a0 69 6e 74 20 65 4e 65 77 3b 20 20 20 20 20 20 20  int eNew;       
343b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343c0 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e 61 6c 20 6d  /* New journal m
343d0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 6c  ode */.  int eOl
343e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
343f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
34400 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  old journal mode
34410 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
34420 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 63 6f  TE_OMIT_WAL.  co
34430 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
34440 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ame;          /*
34450 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
34460 65 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  e file for pPage
34470 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70  r */.#endif..  p
34480 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
34490 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
344a0 65 4e 65 77 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  eNew = pOp->p3;.
344b0 20 20 61 73 73 65 72 74 28 20 65 4e 65 77 3d 3d    assert( eNew==
344c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
344d0 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
344e0 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
344f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
34500 43 41 54 45 20 0a 20 20 20 20 20 20 20 7c 7c 20  CATE .       || 
34510 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
34520 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
34530 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d  .       || eNew=
34540 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34550 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 20 7c 7c  DE_OFF.       ||
34560 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34570 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
34580 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
34590 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
345a0 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  E_WAL.       || 
345b0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
345c0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
345d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
345e0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
345f0 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p1<db->nDb );.  
34600 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
34610 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nly==0 );..  pBt
34620 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
34630 70 31 5d 2e 70 42 74 3b 0a 20 20 70 50 61 67 65  p1].pBt;.  pPage
34640 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
34650 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 65 4f  Pager(pBt);.  eO
34660 6c 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ld = sqlite3Page
34670 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
34680 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 65  pPager);.  if( e
34690 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
346a0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29 20 65  ALMODE_QUERY ) e
346b0 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 69 66  New = eOld;.  if
346c0 28 20 21 73 71 6c 69 74 65 33 50 61 67 65 72 4f  ( !sqlite3PagerO
346d0 6b 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c  kToChangeJournal
346e0 4d 6f 64 65 28 70 50 61 67 65 72 29 20 29 20 65  Mode(pPager) ) e
346f0 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 0a 23 69 66  New = eOld;..#if
34700 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34710 5f 57 41 4c 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  _WAL.  zFilename
34720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
34730 69 6c 65 6e 61 6d 65 28 70 50 61 67 65 72 2c 20  ilename(pPager, 
34740 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  1);..  /* Do not
34750 20 61 6c 6c 6f 77 20 61 20 74 72 61 6e 73 69 74   allow a transit
34760 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d  ion to journal_m
34770 6f 64 65 3d 57 41 4c 20 66 6f 72 20 61 20 64 61  ode=WAL for a da
34780 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 6e 20 74  tabase.  ** in t
34790 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
347a0 20 6f 72 20 69 66 20 74 68 65 20 56 46 53 20 64   or if the VFS d
347b0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
347c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 0a 20  shared memory . 
347d0 20 2a 2f 0a 20 20 69 66 28 20 65 4e 65 77 3d 3d   */.  if( eNew==
347e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
347f0 45 5f 57 41 4c 0a 20 20 20 26 26 20 28 73 71 6c  E_WAL.   && (sql
34800 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
34810 6c 65 6e 61 6d 65 29 3d 3d 30 20 20 20 20 20 20  lename)==0      
34820 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c       /* Temp fil
34830 65 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 21  e */.       || !
34840 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53  sqlite3PagerWalS
34850 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72 29  upported(pPager)
34860 29 20 20 20 2f 2a 20 4e 6f 20 73 68 61 72 65 64  )   /* No shared
34870 2d 6d 65 6d 6f 72 79 20 73 75 70 70 6f 72 74 20  -memory support 
34880 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 65 4e 65 77  */.  ){.    eNew
34890 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20   = eOld;.  }..  
348a0 69 66 28 20 28 65 4e 65 77 21 3d 65 4f 6c 64 29  if( (eNew!=eOld)
348b0 0a 20 20 20 26 26 20 28 65 4f 6c 64 3d 3d 50 41  .   && (eOld==PA
348c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
348d0 57 41 4c 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47  WAL || eNew==PAG
348e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
348f0 41 4c 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  AL).  ){.    if(
34900 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
34910 20 7c 7c 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   || db->nVdbeRea
34920 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20  d>1 ){.      rc 
34930 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
34940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34950 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20  eError(p,.      
34960 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61 6e      "cannot chan
34970 67 65 20 25 73 20 77 61 6c 20 6d 6f 64 65 20 66  ge %s wal mode f
34980 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72 61  rom within a tra
34990 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20 20 20 20  nsaction",.     
349a0 20 20 20 20 20 28 65 4e 65 77 3d 3d 50 41 47 45       (eNew==PAGE
349b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
349c0 4c 20 3f 20 22 69 6e 74 6f 22 20 3a 20 22 6f 75  L ? "into" : "ou
349d0 74 20 6f 66 22 29 0a 20 20 20 20 20 20 29 3b 0a  t of").      );.
349e0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
349f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
34a00 20 20 20 7d 65 6c 73 65 7b 0a 20 0a 20 20 20 20     }else{. .    
34a10 20 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45    if( eOld==PAGE
34a20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
34a30 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  L ){.        /* 
34a40 49 66 20 6c 65 61 76 69 6e 67 20 57 41 4c 20 6d  If leaving WAL m
34a50 6f 64 65 2c 20 63 6c 6f 73 65 20 74 68 65 20 6c  ode, close the l
34a60 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
34a70 65 73 73 66 75 6c 2c 20 74 68 65 20 63 61 6c 6c  essful, the call
34a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 50  .        ** to P
34a90 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 29 20 63  agerCloseWal() c
34aa0 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 64 20 64  heckpoints and d
34ab0 65 6c 65 74 65 73 20 74 68 65 20 77 72 69 74 65  eletes the write
34ac0 2d 61 68 65 61 64 2d 6c 6f 67 20 0a 20 20 20 20  -ahead-log .    
34ad0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 41 6e 20      ** file. An 
34ae0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6d  EXCLUSIVE lock m
34af0 61 79 20 73 74 69 6c 6c 20 62 65 20 68 65 6c 64  ay still be held
34b00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34b10 20 66 69 6c 65 20 0a 20 20 20 20 20 20 20 20 2a   file .        *
34b20 2a 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73  * after a succes
34b30 73 66 75 6c 20 72 65 74 75 72 6e 2e 20 0a 20 20  sful return. .  
34b40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34b60 65 72 43 6c 6f 73 65 57 61 6c 28 70 50 61 67 65  erCloseWal(pPage
34b70 72 2c 20 64 62 29 3b 0a 20 20 20 20 20 20 20 20  r, db);.        
34b80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34b90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
34ba0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f  qlite3PagerSetJo
34bb0 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
34bc0 2c 20 65 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , eNew);.       
34bd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
34be0 66 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a  f( eOld==PAGER_J
34bf0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
34c00 59 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  Y ){.        /* 
34c10 43 61 6e 6e 6f 74 20 74 72 61 6e 73 69 74 69 6f  Cannot transitio
34c20 6e 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  n directly from 
34c30 4d 45 4d 4f 52 59 20 74 6f 20 57 41 4c 2e 20 20  MEMORY to WAL.  
34c40 55 73 65 20 6d 6f 64 65 20 4f 46 46 0a 20 20 20  Use mode OFF.   
34c50 20 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 69 6e       ** as an in
34c60 74 65 72 6d 65 64 69 61 74 65 20 2a 2f 0a 20 20  termediate */.  
34c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34c80 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erSetJournalMode
34c90 28 70 50 61 67 65 72 2c 20 50 41 47 45 52 5f 4a  (pPager, PAGER_J
34ca0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 3b  OURNALMODE_OFF);
34cb0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
34cc0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 72 61 6e    /* Open a tran
34cd0 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
34ce0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 52 65  atabase file. Re
34cf0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
34d00 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
34d10 20 6d 6f 64 65 2c 20 74 68 69 73 20 74 72 61 6e   mode, this tran
34d20 73 61 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75  saction always u
34d30 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
34d40 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
34d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
34d60 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
34d70 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  rans(pBt)==0 );.
34d80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
34db0 74 72 65 65 53 65 74 56 65 72 73 69 6f 6e 28 70  treeSetVersion(p
34dc0 42 74 2c 20 28 65 4e 65 77 3d 3d 50 41 47 45 52  Bt, (eNew==PAGER
34dd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
34de0 20 3f 20 32 20 3a 20 31 29 29 3b 0a 20 20 20 20   ? 2 : 1));.    
34df0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
34e00 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
34e10 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
34e20 2f 0a 0a 20 20 69 66 28 20 72 63 20 29 20 65 4e  /..  if( rc ) eN
34e30 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 65 4e 65  ew = eOld;.  eNe
34e40 77 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  w = sqlite3Pager
34e50 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  SetJournalMode(p
34e60 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 0a 20  Pager, eNew);.. 
34e70 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
34e80 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69  EM_Str|MEM_Stati
34e90 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f  c|MEM_Term;.  pO
34ea0 75 74 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  ut->z = (char *)
34eb0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4d 6f  sqlite3JournalMo
34ec0 64 65 6e 61 6d 65 28 65 4e 65 77 29 3b 0a 20 20  dename(eNew);.  
34ed0 70 4f 75 74 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pOut->n = sqlite
34ee0 33 53 74 72 6c 65 6e 33 30 28 70 4f 75 74 2d 3e  3Strlen30(pOut->
34ef0 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20  z);.  pOut->enc 
34f00 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
34f10 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
34f20 67 65 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c  geEncoding(pOut,
34f30 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 69 66   encoding);.  if
34f40 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
34f50 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
34f60 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a 23 65 6e 64    break;.};.#end
34f70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
34f80 54 5f 50 52 41 47 4d 41 20 2a 2f 0a 0a 23 69 66  T_PRAGMA */..#if
34f90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
34fa0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26  _OMIT_VACUUM) &&
34fb0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
34fc0 5f 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a  _OMIT_ATTACH)./*
34fd0 20 4f 70 63 6f 64 65 3a 20 56 61 63 75 75 6d 20   Opcode: Vacuum 
34fe0 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
34ff0 20 56 61 63 75 75 6d 20 74 68 65 20 65 6e 74 69   Vacuum the enti
35000 72 65 20 64 61 74 61 62 61 73 65 20 50 31 2e 20  re database P1. 
35010 20 50 31 20 69 73 20 30 20 66 6f 72 20 22 6d 61   P1 is 0 for "ma
35020 69 6e 22 2c 20 61 6e 64 20 32 20 6f 72 20 6d 6f  in", and 2 or mo
35030 72 65 0a 2a 2a 20 66 6f 72 20 61 6e 20 61 74 74  re.** for an att
35040 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
35050 20 54 68 65 20 22 74 65 6d 70 22 20 64 61 74 61   The "temp" data
35060 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
35070 76 61 63 75 75 6d 65 64 2e 0a 2a 2f 0a 63 61 73  vacuumed..*/.cas
35080 65 20 4f 50 5f 56 61 63 75 75 6d 3a 20 7b 0a 20  e OP_Vacuum: {. 
35090 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
350a0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Only==0 );.  rc 
350b0 3d 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75  = sqlite3RunVacu
350c0 75 6d 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  um(&p->zErrMsg, 
350d0 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  db, pOp->p1);.  
350e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
350f0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
35100 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
35110 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
35120 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
35130 54 4f 56 41 43 55 55 4d 29 0a 2f 2a 20 4f 70 63  TOVACUUM)./* Opc
35140 6f 64 65 3a 20 49 6e 63 72 56 61 63 75 75 6d 20  ode: IncrVacuum 
35150 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
35160 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
35170 6c 65 20 73 74 65 70 20 6f 66 20 74 68 65 20 69  le step of the i
35180 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
35190 6d 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 0a 2a  m procedure on.*
351a0 2a 20 74 68 65 20 50 31 20 64 61 74 61 62 61 73  * the P1 databas
351b0 65 2e 20 49 66 20 74 68 65 20 76 61 63 75 75 6d  e. If the vacuum
351c0 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 6a   has finished, j
351d0 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
351e0 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74 68 65 72 77  on.** P2. Otherw
351f0 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ise, fall throug
35200 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
35210 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
35220 73 65 20 4f 50 5f 49 6e 63 72 56 61 63 75 75 6d  se OP_IncrVacuum
35230 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
35240 6d 70 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  mp */.  Btree *p
35250 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Bt;..  assert( p
35260 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
35270 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
35280 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
35290 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
352a0 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  k, pOp->p1) );. 
352b0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
352c0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 42 74  Only==0 );.  pBt
352d0 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e   = db->aDb[pOp->
352e0 70 31 5d 2e 70 42 74 3b 0a 20 20 72 63 20 3d 20  p1].pBt;.  rc = 
352f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
35300 56 61 63 75 75 6d 28 70 42 74 29 3b 0a 20 20 56  Vacuum(pBt);.  V
35310 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72  dbeBranchTaken(r
35320 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 2c 32  c==SQLITE_DONE,2
35330 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
35340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35350 45 5f 44 4f 4e 45 20 29 20 67 6f 74 6f 20 61 62  E_DONE ) goto ab
35360 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
35370 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
35380 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 6a  E_OK;.    goto j
35390 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
353a0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
353b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 78 70  ../* Opcode: Exp
353c0 69 72 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  ire P1 * * * *.*
353d0 2a 0a 2a 2a 20 43 61 75 73 65 20 70 72 65 63 6f  *.** Cause preco
353e0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
353f0 73 20 74 6f 20 65 78 70 69 72 65 2e 20 20 57 68  s to expire.  Wh
35400 65 6e 20 61 6e 20 65 78 70 69 72 65 64 20 73 74  en an expired st
35410 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 65 78  atement.** is ex
35420 65 63 75 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ecuted using sql
35430 69 74 65 33 5f 73 74 65 70 28 29 20 69 74 20 77  ite3_step() it w
35440 69 6c 6c 20 65 69 74 68 65 72 20 61 75 74 6f 6d  ill either autom
35450 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 72 65 70 72  atically.** repr
35460 65 70 61 72 65 20 69 74 73 65 6c 66 20 28 69 66  epare itself (if
35470 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c   it was original
35480 6c 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ly created using
35490 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
354a0 5f 76 32 28 29 29 0a 2a 2a 20 6f 72 20 69 74 20  _v2()).** or it 
354b0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
354c0 51 4c 49 54 45 5f 53 43 48 45 4d 41 2e 0a 2a 2a  QLITE_SCHEMA..**
354d0 20 0a 2a 2a 20 49 66 20 50 31 20 69 73 20 30 2c   .** If P1 is 0,
354e0 20 74 68 65 6e 20 61 6c 6c 20 53 51 4c 20 73 74   then all SQL st
354f0 61 74 65 6d 65 6e 74 73 20 62 65 63 6f 6d 65 20  atements become 
35500 65 78 70 69 72 65 64 2e 20 49 66 20 50 31 20 69  expired. If P1 i
35510 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
35520 68 65 6e 20 6f 6e 6c 79 20 74 68 65 20 63 75 72  hen only the cur
35530 72 65 6e 74 6c 79 20 65 78 65 63 75 74 69 6e 67  rently executing
35540 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 65 78   statement is ex
35550 70 69 72 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pired..*/.case O
35560 50 5f 45 78 70 69 72 65 3a 20 7b 0a 20 20 69 66  P_Expire: {.  if
35570 28 20 21 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  ( !pOp->p1 ){.  
35580 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
35590 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
355a0 73 28 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  s(db);.  }else{.
355b0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
355c0 20 31 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   1;.  }.  break;
355d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
355e0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
355f0 41 43 48 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ACHE./* Opcode: 
35600 54 61 62 6c 65 4c 6f 63 6b 20 50 31 20 50 32 20  TableLock P1 P2 
35610 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
35620 73 69 73 3a 20 69 44 62 3d 50 31 20 72 6f 6f 74  sis: iDb=P1 root
35630 3d 50 32 20 77 72 69 74 65 3d 50 33 0a 2a 2a 0a  =P2 write=P3.**.
35640 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ** Obtain a lock
35650 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
35660 20 74 61 62 6c 65 2e 20 54 68 69 73 20 69 6e 73   table. This ins
35670 74 72 75 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  truction is only
35680 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68   used when.** th
35690 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66  e shared-cache f
356a0 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65  eature is enable
356b0 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  d. .**.** P1 is 
356c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
356d0 20 64 61 74 61 62 61 73 65 20 69 6e 20 73 71 6c   database in sql
356e0 69 74 65 33 2e 61 44 62 5b 5d 20 6f 66 20 74 68  ite3.aDb[] of th
356f0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 6e  e database.** on
35700 20 77 68 69 63 68 20 74 68 65 20 6c 6f 63 6b 20   which the lock 
35710 69 73 20 61 63 71 75 69 72 65 64 2e 20 20 41 20  is acquired.  A 
35720 72 65 61 64 6c 6f 63 6b 20 69 73 20 6f 62 74 61  readlock is obta
35730 69 6e 65 64 20 69 66 20 50 33 3d 3d 30 20 6f 72  ined if P3==0 or
35740 0a 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b  .** a write lock
35750 20 69 66 20 50 33 3d 3d 31 2e 0a 2a 2a 0a 2a 2a   if P3==1..**.**
35760 20 50 32 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P2 contains the
35770 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68   root-page of th
35780 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 2e  e table to lock.
35790 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f 6e 74 61 69  .**.** P4 contai
357a0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
357b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
357c0 74 61 62 6c 65 20 62 65 69 6e 67 20 6c 6f 63 6b  table being lock
357d0 65 64 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ed. This is only
357e0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 67 65 6e 65  .** used to gene
357f0 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
35800 73 73 61 67 65 20 69 66 20 74 68 65 20 6c 6f 63  ssage if the loc
35810 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
35820 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ined..*/.case OP
35830 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20 7b 0a 20 20  _TableLock: {.  
35840 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d  u8 isWriteLock =
35850 20 28 75 38 29 70 4f 70 2d 3e 70 33 3b 0a 20 20   (u8)pOp->p3;.  
35860 69 66 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 20  if( isWriteLock 
35870 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67 73  || 0==(db->flags
35880 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
35890 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  mmit) ){.    int
358a0 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a   p1 = pOp->p1; .
358b0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
358c0 30 20 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20  0 && p1<db->nDb 
358d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 44  );.    assert( D
358e0 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72  bMaskTest(p->btr
358f0 65 65 4d 61 73 6b 2c 20 70 31 29 20 29 3b 0a 20  eeMask, p1) );. 
35900 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69     assert( isWri
35910 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57  teLock==0 || isW
35920 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  riteLock==1 );. 
35930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35940 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64 62  treeLockTable(db
35950 2d 3e 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20 70  ->aDb[p1].pBt, p
35960 4f 70 2d 3e 70 32 2c 20 69 73 57 72 69 74 65 4c  Op->p2, isWriteL
35970 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ock);.    if( rc
35980 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72   ){.      if( (r
35990 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
359a0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
359b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
359c0 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
359d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
359e0 45 72 72 6f 72 28 70 2c 20 22 64 61 74 61 62 61  Error(p, "databa
359f0 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
35a00 65 64 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  ed: %s", z);.   
35a10 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
35a20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
35a30 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
35a40 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
35a50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
35a60 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
35a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35a80 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35a90 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67  ./* Opcode: VBeg
35aa0 69 6e 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  in * * * P4 *.**
35ab0 0a 2a 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20  .** P4 may be a 
35ac0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
35ad0 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75 63  lite3_vtab struc
35ae0 74 75 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c  ture. If so, cal
35af0 6c 20 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e  l the .** xBegin
35b00 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74   method for that
35b10 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c   table..**.** Al
35b20 73 6f 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e  so, whether or n
35b30 6f 74 20 50 34 20 69 73 20 73 65 74 2c 20 63 68  ot P4 is set, ch
35b40 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
35b50 20 6e 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65   not being calle
35b60 64 20 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e  d from.** within
35b70 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61   a callback to a
35b80 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78   virtual table x
35b90 53 79 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49  Sync() method. I
35ba0 66 20 69 74 20 69 73 2c 20 74 68 65 20 65 72 72  f it is, the err
35bb0 6f 72 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20  or.** code will 
35bc0 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
35bd0 5f 4c 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65  _LOCKED..*/.case
35be0 20 4f 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20   OP_VBegin: {.  
35bf0 56 54 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20  VTable *pVTab;. 
35c00 20 70 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34   pVTab = pOp->p4
35c10 2e 70 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73  .pVtab;.  rc = s
35c20 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 28  qlite3VtabBegin(
35c30 64 62 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66  db, pVTab);.  if
35c40 28 20 70 56 54 61 62 20 29 20 73 71 6c 69 74 65  ( pVTab ) sqlite
35c50 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
35c60 67 28 70 2c 20 70 56 54 61 62 2d 3e 70 56 74 61  g(p, pVTab->pVta
35c70 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  b);.  if( rc ) g
35c80 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
35c90 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
35ca0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
35cb0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
35cc0 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
35cd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
35ce0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
35cf0 63 6f 64 65 3a 20 56 43 72 65 61 74 65 20 50 31  code: VCreate P1
35d00 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
35d10 50 32 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P2 is a register
35d20 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
35d30 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61  name of a virtua
35d40 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62  l table in datab
35d50 61 73 65 20 0a 2a 2a 20 50 31 2e 20 43 61 6c 6c  ase .** P1. Call
35d60 20 74 68 65 20 78 43 72 65 61 74 65 20 6d 65 74   the xCreate met
35d70 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74 61 62  hod for that tab
35d80 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  le..*/.case OP_V
35d90 43 72 65 61 74 65 3a 20 7b 0a 20 20 4d 65 6d 20  Create: {.  Mem 
35da0 73 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  sMem;          /
35db0 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  * For storing th
35dc0 65 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  e record being d
35dd0 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  ecoded */.  cons
35de0 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 2f  t char *zTab;  /
35df0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  * Name of the vi
35e00 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a  rtual table */..
35e10 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20    memset(&sMem, 
35e20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29  0, sizeof(sMem))
35e30 3b 0a 20 20 73 4d 65 6d 2e 64 62 20 3d 20 64 62  ;.  sMem.db = db
35e40 3b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20 50  ;.  /* Because P
35e50 32 20 69 73 20 61 6c 77 61 79 73 20 61 20 73 74  2 is always a st
35e60 61 74 69 63 20 73 74 72 69 6e 67 2c 20 69 74 20  atic string, it 
35e70 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
35e80 72 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  r the.  ** sqlit
35e90 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 29 20  e3VdbeMemCopy() 
35ea0 74 6f 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  to fail */.  ass
35eb0 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e  ert( (aMem[pOp->
35ec0 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  p2].flags & MEM_
35ed0 53 74 72 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  Str)!=0 );.  ass
35ee0 65 72 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e  ert( (aMem[pOp->
35ef0 70 32 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  p2].flags & MEM_
35f00 53 74 61 74 69 63 29 21 3d 30 20 29 3b 0a 20 20  Static)!=0 );.  
35f10 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
35f20 4d 65 6d 43 6f 70 79 28 26 73 4d 65 6d 2c 20 26  MemCopy(&sMem, &
35f30 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a  aMem[pOp->p2]);.
35f40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
35f50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a 54 61  LITE_OK );.  zTa
35f60 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
35f70 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
35f80 65 78 74 28 26 73 4d 65 6d 29 3b 0a 20 20 61 73  ext(&sMem);.  as
35f90 73 65 72 74 28 20 7a 54 61 62 20 7c 7c 20 64 62  sert( zTab || db
35fa0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35fb0 3b 0a 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a  ;.  if( zTab ){.
35fc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35fd0 56 74 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64  VtabCallCreate(d
35fe0 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 7a 54 61 62  b, pOp->p1, zTab
35ff0 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  , &p->zErrMsg);.
36000 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
36010 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
36020 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  m);.  if( rc ) g
36030 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36040 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
36050 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
36060 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
36070 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  TABLE */..#ifnde
36080 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
36090 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70  RTUALTABLE./* Op
360a0 63 6f 64 65 3a 20 56 44 65 73 74 72 6f 79 20 50  code: VDestroy P
360b0 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  1 * * P4 *.**.**
360c0 20 50 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20   P4 is the name 
360d0 6f 66 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  of a virtual tab
360e0 6c 65 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  le in database P
360f0 31 2e 20 20 43 61 6c 6c 20 74 68 65 20 78 44 65  1.  Call the xDe
36100 73 74 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20  stroy method.** 
36110 6f 66 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  of that table..*
36120 2f 0a 63 61 73 65 20 4f 50 5f 56 44 65 73 74 72  /.case OP_VDestr
36130 6f 79 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56 44 65  oy: {.  db->nVDe
36140 73 74 72 6f 79 2b 2b 3b 0a 20 20 72 63 20 3d 20  stroy++;.  rc = 
36150 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44  sqlite3VtabCallD
36160 65 73 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e  estroy(db, pOp->
36170 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
36180 20 20 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2d    db->nVDestroy-
36190 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  -;.  if( rc ) go
361a0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
361b0 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
361c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
361d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
361e0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ABLE */..#ifndef
361f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
36200 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63  TUALTABLE./* Opc
36210 6f 64 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20  ode: VOpen P1 * 
36220 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20  * P4 *.**.** P4 
36230 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
36240 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
36250 6f 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74  object, an sqlit
36260 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72  e3_vtab structur
36270 65 2e 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75  e..** P1 is a cu
36280 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68  rsor number.  Th
36290 69 73 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20  is opcode opens 
362a0 61 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  a cursor to the 
362b0 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
362c0 20 61 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74   and stores that
362d0 20 63 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a   cursor in P1..*
362e0 2f 0a 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a  /.case OP_VOpen:
362f0 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
36300 2a 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33  *pCur;.  sqlite3
36310 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
36320 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
36330 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f  tab *pVtab;.  co
36340 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
36350 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  le *pModule;..  
36360 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
36370 61 64 65 72 20 29 3b 0a 20 20 70 43 75 72 20 3d  ader );.  pCur =
36380 20 30 3b 0a 20 20 70 56 43 75 72 20 3d 20 30 3b   0;.  pVCur = 0;
36390 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
363a0 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
363b0 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20  .  if( pVtab==0 
363c0 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e  || NEVER(pVtab->
363d0 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20  pModule==0) ){. 
363e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
363f0 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20  OCKED;.    goto 
36400 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
36410 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75 6c  or;.  }.  pModul
36420 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
36430 6c 65 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75  le;.  rc = pModu
36440 6c 65 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c  le->xOpen(pVtab,
36450 20 26 70 56 43 75 72 29 3b 0a 20 20 73 71 6c 69   &pVCur);.  sqli
36460 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
36470 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20  msg(p, pVtab);. 
36480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
36490 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
364a0 72 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  r;..  /* Initial
364b0 69 7a 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ize sqlite3_vtab
364c0 5f 63 75 72 73 6f 72 20 62 61 73 65 20 63 6c 61  _cursor base cla
364d0 73 73 20 2a 2f 0a 20 20 70 56 43 75 72 2d 3e 70  ss */.  pVCur->p
364e0 56 74 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20  Vtab = pVtab;.. 
364f0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76   /* Initialize v
36500 64 62 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63  dbe cursor objec
36510 74 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c  t */.  pCur = al
36520 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
36530 70 4f 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20  pOp->p1, 0, -1, 
36540 43 55 52 54 59 50 45 5f 56 54 41 42 29 3b 0a 20  CURTYPE_VTAB);. 
36550 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
36560 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 20   pCur->uc.pVCur 
36570 3d 20 70 56 43 75 72 3b 0a 20 20 20 20 70 56 74  = pVCur;.    pVt
36580 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 65  ab->nRef++;.  }e
36590 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
365a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
365b0 64 20 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  d );.    pModule
365c0 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
365d0 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
365e0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
365f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
36600 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
36610 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
36620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36630 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
36640 64 65 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50  de: VFilter P1 P
36650 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e  2 P3 P4 *.** Syn
36660 6f 70 73 69 73 3a 20 69 70 6c 61 6e 3d 72 5b 50  opsis: iplan=r[P
36670 33 5d 20 7a 70 6c 61 6e 3d 27 50 34 27 0a 2a 2a  3] zplan='P4'.**
36680 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73  .** P1 is a curs
36690 6f 72 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  or opened using 
366a0 56 4f 70 65 6e 2e 20 20 50 32 20 69 73 20 61 6e  VOpen.  P2 is an
366b0 20 61 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70   address to jump
366c0 20 74 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66 69   to if.** the fi
366d0 6c 74 65 72 65 64 20 72 65 73 75 6c 74 20 73 65  ltered result se
366e0 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  t is empty..**.*
366f0 2a 20 50 34 20 69 73 20 65 69 74 68 65 72 20 4e  * P4 is either N
36700 55 4c 4c 20 6f 72 20 61 20 73 74 72 69 6e 67 20  ULL or a string 
36710 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
36720 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
36730 6e 64 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  ndex.** method o
36740 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20 54  f the module.  T
36750 68 65 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f  he interpretatio
36760 6e 20 6f 66 20 74 68 65 20 50 34 20 73 74 72 69  n of the P4 stri
36770 6e 67 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74 6f  ng is left.** to
36780 20 74 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c   the module impl
36790 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ementation..**.*
367a0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
367b0 76 6f 6b 65 73 20 74 68 65 20 78 46 69 6c 74 65  vokes the xFilte
367c0 72 20 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20  r method on the 
367d0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 70  virtual table sp
367e0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 50 31  ecified.** by P1
367f0 2e 20 20 54 68 65 20 69 6e 74 65 67 65 72 20 71  .  The integer q
36800 75 65 72 79 20 70 6c 61 6e 20 70 61 72 61 6d 65  uery plan parame
36810 74 65 72 20 74 6f 20 78 46 69 6c 74 65 72 20 69  ter to xFilter i
36820 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
36830 73 74 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67 69  ster.** P3. Regi
36840 73 74 65 72 20 50 33 2b 31 20 73 74 6f 72 65 73  ster P3+1 stores
36850 20 74 68 65 20 61 72 67 63 20 70 61 72 61 6d 65   the argc parame
36860 74 65 72 20 74 6f 20 62 65 20 70 61 73 73 65 64  ter to be passed
36870 20 74 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c 74   to the.** xFilt
36880 65 72 20 6d 65 74 68 6f 64 2e 20 52 65 67 69 73  er method. Regis
36890 74 65 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31 2b  ters P3+2..P3+1+
368a0 61 72 67 63 20 61 72 65 20 74 68 65 20 61 72 67  argc are the arg
368b0 63 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  c.** additional 
368c0 70 61 72 61 6d 65 74 65 72 73 20 77 68 69 63 68  parameters which
368d0 20 61 72 65 20 70 61 73 73 65 64 20 74 6f 0a 2a   are passed to.*
368e0 2a 20 78 46 69 6c 74 65 72 20 61 73 20 61 72 67  * xFilter as arg
368f0 76 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 32  v. Register P3+2
36900 20 62 65 63 6f 6d 65 73 20 61 72 67 76 5b 30 5d   becomes argv[0]
36910 20 77 68 65 6e 20 70 61 73 73 65 64 20 74 6f 20   when passed to 
36920 78 46 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41  xFilter..**.** A
36930 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f   jump is made to
36940 20 50 32 20 69 66 20 74 68 65 20 72 65 73 75 6c   P2 if the resul
36950 74 20 73 65 74 20 61 66 74 65 72 20 66 69 6c 74  t set after filt
36960 65 72 69 6e 67 20 77 6f 75 6c 64 20 62 65 20 65  ering would be e
36970 6d 70 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  mpty..*/.case OP
36980 5f 56 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f 2a  _VFilter: {   /*
36990 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e   jump */.  int n
369a0 41 72 67 3b 0a 20 20 69 6e 74 20 69 51 75 65 72  Arg;.  int iQuer
369b0 79 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  y;.  const sqlit
369c0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
369d0 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65 72  le;.  Mem *pQuer
369e0 79 3b 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 3b  y;.  Mem *pArgc;
369f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
36a00 63 75 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a 20  cursor *pVCur;. 
36a10 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
36a20 56 74 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73  Vtab;.  VdbeCurs
36a30 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
36a40 72 65 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  res;.  int i;.  
36a50 4d 65 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20  Mem **apArg;..  
36a60 70 51 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70  pQuery = &aMem[p
36a70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63  Op->p3];.  pArgc
36a80 20 3d 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20   = &pQuery[1];. 
36a90 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
36aa0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
36ab0 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
36ac0 70 51 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47  pQuery) );.  REG
36ad0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
36ae0 3e 70 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  >p3, pQuery);.  
36af0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43  assert( pCur->eC
36b00 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
36b10 56 54 41 42 20 29 3b 0a 20 20 70 56 43 75 72 20  VTAB );.  pVCur 
36b20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72  = pCur->uc.pVCur
36b30 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 56 43 75  ;.  pVtab = pVCu
36b40 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
36b50 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
36b60 64 75 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62  dule;..  /* Grab
36b70 20 74 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65   the index numbe
36b80 72 20 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d  r and argc param
36b90 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72  eters */.  asser
36ba0 74 28 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67  t( (pQuery->flag
36bb0 73 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26  s&MEM_Int)!=0 &&
36bc0 20 70 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d   pArgc->flags==M
36bd0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67  EM_Int );.  nArg
36be0 20 3d 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75   = (int)pArgc->u
36bf0 2e 69 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28  .i;.  iQuery = (
36c00 69 6e 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b  int)pQuery->u.i;
36c10 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
36c20 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
36c30 20 2a 2f 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20   */.  res = 0;. 
36c40 20 61 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72   apArg = p->apAr
36c50 67 3b 0a 20 20 66 6f 72 28 69 20 3d 20 30 3b 20  g;.  for(i = 0; 
36c60 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
36c70 20 20 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41    apArg[i] = &pA
36c80 72 67 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20  rgc[i+1];.  }.  
36c90 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46  rc = pModule->xF
36ca0 69 6c 74 65 72 28 70 56 43 75 72 2c 20 69 51 75  ilter(pVCur, iQu
36cb0 65 72 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  ery, pOp->p4.z, 
36cc0 6e 41 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20  nArg, apArg);.  
36cd0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
36ce0 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
36cf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
36d00 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
36d10 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20 70  error;.  res = p
36d20 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 43  Module->xEof(pVC
36d30 75 72 29 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c  ur);.  pCur->nul
36d40 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 56 64 62 65  lRow = 0;.  Vdbe
36d50 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
36d60 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73  =0,2);.  if( res
36d70 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f   ) goto jump_to_
36d80 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  p2;.  break;.}.#
36d90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36da0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36db0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
36dc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36dd0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
36de0 3a 20 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20  : VColumn P1 P2 
36df0 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
36e00 69 73 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c 75 6d  is: r[P3]=vcolum
36e10 6e 28 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  n(P2).**.** Stor
36e20 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
36e30 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20  he P2-th column 
36e40 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66  of.** the row of
36e50 20 74 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62   the virtual-tab
36e60 6c 65 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  le that the .** 
36e70 50 31 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  P1 cursor is poi
36e80 6e 74 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65  nting to into re
36e90 67 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61  gister P3..*/.ca
36ea0 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b  se OP_VColumn: {
36eb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
36ec0 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
36ed0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
36ee0 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a  pModule;.  Mem *
36ef0 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  pDest;.  sqlite3
36f00 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78  _context sContex
36f10 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72  t;..  VdbeCursor
36f20 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73   *pCur = p->apCs
36f30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
36f40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72  sert( pCur->eCur
36f50 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54  Type==CURTYPE_VT
36f60 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
36f70 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
36f80 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
36f90 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
36fa0 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
36fb0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
36fc0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
36fd0 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66 28 20  , pDest);.  if( 
36fe0 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  pCur->nullRow ){
36ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
37000 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
37010 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
37020 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
37030 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
37040 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
37050 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
37060 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
37070 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d  ->xColumn );.  m
37080 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c  emset(&sContext,
37090 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74   0, sizeof(sCont
370a0 65 78 74 29 29 3b 0a 20 20 73 43 6f 6e 74 65 78  ext));.  sContex
370b0 74 2e 70 4f 75 74 20 3d 20 70 44 65 73 74 3b 0a  t.pOut = pDest;.
370c0 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67    MemSetTypeFlag
370d0 28 70 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c  (pDest, MEM_Null
370e0 29 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c  );.  rc = pModul
370f0 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d  e->xColumn(pCur-
37100 3e 75 63 2e 70 56 43 75 72 2c 20 26 73 43 6f 6e  >uc.pVCur, &sCon
37110 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a  text, pOp->p2);.
37120 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
37130 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
37140 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74  ab);.  if( sCont
37150 65 78 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20  ext.isError ){. 
37160 20 20 20 72 63 20 3d 20 73 43 6f 6e 74 65 78 74     rc = sContext
37170 2e 69 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  .isError;.  }.  
37180 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
37190 65 45 6e 63 6f 64 69 6e 67 28 70 44 65 73 74 2c  eEncoding(pDest,
371a0 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 52 45   encoding);.  RE
371b0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
371c0 2d 3e 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20  ->p3, pDest);.  
371d0 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
371e0 49 5a 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69  IZE(pDest);..  i
371f0 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
37200 6d 54 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29  mTooBig(pDest) )
37210 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62  {.    goto too_b
37220 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ig;.  }.  if( rc
37230 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
37240 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
37250 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
37260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
37270 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
37280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37290 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
372a0 2a 20 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74 20  * Opcode: VNext 
372b0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a  P1 P2 * * *.**.*
372c0 2a 20 41 64 76 61 6e 63 65 20 76 69 72 74 75 61  * Advance virtua
372d0 6c 20 74 61 62 6c 65 20 50 31 20 74 6f 20 74 68  l table P1 to th
372e0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 69 74  e next row in it
372f0 73 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  s result set and
37300 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74  .** jump to inst
37310 72 75 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72 2c  ruction P2.  Or,
37320 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   if the virtual 
37330 74 61 62 6c 65 20 68 61 73 20 72 65 61 63 68 65  table has reache
37340 64 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  d.** the end of 
37350 69 74 73 20 72 65 73 75 6c 74 20 73 65 74 2c 20  its result set, 
37360 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
37370 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
37380 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  struction..*/.ca
37390 73 65 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20 20  se OP_VNext: {  
373a0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73 71   /* jump */.  sq
373b0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
373c0 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
373d0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
373e0 6c 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  le;.  int res;. 
373f0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75   VdbeCursor *pCu
37400 72 3b 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20  r;..  res = 0;. 
37410 20 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72   pCur = p->apCsr
37420 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
37430 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72 54  ert( pCur->eCurT
37440 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41  ype==CURTYPE_VTA
37450 42 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  B );.  if( pCur-
37460 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
37470 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74  break;.  }.  pVt
37480 61 62 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56  ab = pCur->uc.pV
37490 43 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d  Cur->pVtab;.  pM
374a0 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70  odule = pVtab->p
374b0 4d 6f 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74  Module;.  assert
374c0 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74  ( pModule->xNext
374d0 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65   );..  /* Invoke
374e0 20 74 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74   the xNext() met
374f0 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c  hod of the modul
37500 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77  e. There is no w
37510 61 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ay for the.  ** 
37520 75 6e 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65  underlying imple
37530 6d 65 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74  mentation to ret
37540 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20  urn an error if 
37550 6f 6e 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  one occurs durin
37560 67 0a 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20  g.  ** xNext(). 
37570 49 6e 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65  Instead, if an e
37580 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75  rror occurs, tru
37590 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 69  e is returned (i
375a0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a  ndicating that .
375b0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61    ** data is ava
375c0 69 6c 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20  ilable) and the 
375d0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
375e0 6e 65 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e  ned when xColumn
375f0 20 6f 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74   or.  ** some ot
37600 68 65 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65  her method is ne
37610 78 74 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  xt invoked on th
37620 65 20 73 61 76 65 20 76 69 72 74 75 61 6c 20 74  e save virtual t
37630 61 62 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a  able cursor..  *
37640 2f 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  /.  rc = pModule
37650 2d 3e 78 4e 65 78 74 28 70 43 75 72 2d 3e 75 63  ->xNext(pCur->uc
37660 2e 70 56 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  .pVCur);.  sqlit
37670 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
37680 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
37690 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
376a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
376b0 3b 0a 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c  ;.  res = pModul
376c0 65 2d 3e 78 45 6f 66 28 70 43 75 72 2d 3e 75 63  e->xEof(pCur->uc
376d0 2e 70 56 43 75 72 29 3b 0a 20 20 56 64 62 65 42  .pVCur);.  VdbeB
376e0 72 61 6e 63 68 54 61 6b 65 6e 28 21 72 65 73 2c  ranchTaken(!res,
376f0 32 29 3b 0a 20 20 69 66 28 20 21 72 65 73 20 29  2);.  if( !res )
37700 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
37710 65 20 69 73 20 64 61 74 61 2c 20 6a 75 6d 70 20  e is data, jump 
37720 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 67 6f 74  to P2 */.    got
37730 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  o jump_to_p2_and
37740 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
37750 72 75 70 74 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f  rupt;.  }.  goto
37760 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72   check_for_inter
37770 72 75 70 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rupt;.}.#endif /
37780 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
37790 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
377a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
377b0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
377c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e 61  /* Opcode: VRena
377d0 6d 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  me P1 * * P4 *.*
377e0 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
377f0 6e 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61  nter to a virtua
37800 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20  l table object, 
37810 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  an sqlite3_vtab 
37820 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
37830 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65  is opcode invoke
37840 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
37850 69 6e 67 20 78 52 65 6e 61 6d 65 20 6d 65 74 68  ing xRename meth
37860 6f 64 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a  od. The value.**
37870 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
37880 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
37890 20 7a 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20   zName argument 
378a0 74 6f 20 74 68 65 20 78 52 65 6e 61 6d 65 20 6d  to the xRename m
378b0 65 74 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ethod..*/.case O
378c0 50 5f 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20 73  P_VRename: {.  s
378d0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
378e0 61 62 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d 65  ab;.  Mem *pName
378f0 3b 0a 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  ;..  pVtab = pOp
37900 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
37910 62 3b 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61 4d  b;.  pName = &aM
37920 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
37930 73 73 65 72 74 28 20 70 56 74 61 62 2d 3e 70 4d  ssert( pVtab->pM
37940 6f 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29  odule->xRename )
37950 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ;.  assert( memI
37960 73 56 61 6c 69 64 28 70 4e 61 6d 65 29 20 29 3b  sValid(pName) );
37970 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
37980 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 52  adOnly==0 );.  R
37990 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
379a0 70 2d 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20  p->p1, pName);. 
379b0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
379c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
379d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
379e0 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Name->enc==SQLIT
379f0 45 5f 55 54 46 38 20 29 3b 0a 20 20 74 65 73 74  E_UTF8 );.  test
37a00 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63  case( pName->enc
37a10 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
37a20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
37a30 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pName->enc==SQLI
37a40 54 45 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20  TE_UTF16LE );.  
37a50 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
37a60 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
37a70 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  Name, SQLITE_UTF
37a80 38 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  8);.  if( rc ) g
37a90 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
37aa0 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 70  _error;.  rc = p
37ab0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
37ac0 52 65 6e 61 6d 65 28 70 56 74 61 62 2c 20 70 4e  Rename(pVtab, pN
37ad0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74  ame->z);.  sqlit
37ae0 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
37af0 73 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20  sg(p, pVtab);.  
37b00 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
37b10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37b20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
37b30 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
37b40 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
37b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
37b60 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
37b70 65 3a 20 56 55 70 64 61 74 65 20 50 31 20 50 32  e: VUpdate P1 P2
37b80 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
37b90 6f 70 73 69 73 3a 20 64 61 74 61 3d 72 5b 50 33  opsis: data=r[P3
37ba0 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  @P2].**.** P4 is
37bb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37bc0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
37bd0 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33  ject, an sqlite3
37be0 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
37bf0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
37c00 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72  invokes the corr
37c10 65 73 70 6f 6e 64 69 6e 67 20 78 55 70 64 61 74  esponding xUpdat
37c20 65 20 6d 65 74 68 6f 64 2e 20 50 32 20 76 61 6c  e method. P2 val
37c30 75 65 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74 69  ues.** are conti
37c40 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65 6c  guous memory cel
37c50 6c 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 50  ls starting at P
37c60 33 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  3 to pass to the
37c70 20 78 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e 76   xUpdate .** inv
37c80 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  ocation. The val
37c90 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 28  ue in register (
37ca0 50 33 2b 50 32 2d 31 29 20 63 6f 72 72 65 73 70  P3+P2-1) corresp
37cb0 6f 6e 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20  onds to the .** 
37cc0 70 32 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  p2th element of 
37cd0 74 68 65 20 61 72 67 76 20 61 72 72 61 79 20 70  the argv array p
37ce0 61 73 73 65 64 20 74 6f 20 78 55 70 64 61 74 65  assed to xUpdate
37cf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64  ..**.** The xUpd
37d00 61 74 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20  ate method will 
37d10 64 6f 20 61 20 44 45 4c 45 54 45 20 6f 72 20 61  do a DELETE or a
37d20 6e 20 49 4e 53 45 52 54 20 6f 72 20 62 6f 74 68  n INSERT or both
37d30 2e 0a 2a 2a 20 54 68 65 20 61 72 67 76 5b 30 5d  ..** The argv[0]
37d40 20 65 6c 65 6d 65 6e 74 20 28 77 68 69 63 68 20   element (which 
37d50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6d  corresponds to m
37d60 65 6d 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a 2a  emory cell P3).*
37d70 2a 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f  * is the rowid o
37d80 66 20 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74  f a row to delet
37d90 65 2e 20 20 49 66 20 61 72 67 76 5b 30 5d 20 69  e.  If argv[0] i
37da0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 6e 6f 20 0a  s NULL then no .
37db0 2a 2a 20 64 65 6c 65 74 69 6f 6e 20 6f 63 63 75  ** deletion occu
37dc0 72 73 2e 20 20 54 68 65 20 61 72 67 76 5b 31 5d  rs.  The argv[1]
37dd0 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20   element is the 
37de0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65 77  rowid of the new
37df0 20 0a 2a 2a 20 72 6f 77 2e 20 20 54 68 69 73 20   .** row.  This 
37e00 63 61 6e 20 62 65 20 4e 55 4c 4c 20 74 6f 20 68  can be NULL to h
37e10 61 76 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ave the virtual 
37e20 74 61 62 6c 65 20 73 65 6c 65 63 74 20 74 68 65  table select the
37e30 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 69 64 20 66   new .** rowid f
37e40 6f 72 20 69 74 73 65 6c 66 2e 20 20 54 68 65 20  or itself.  The 
37e50 73 75 62 73 65 71 75 65 6e 74 20 65 6c 65 6d 65  subsequent eleme
37e60 6e 74 73 20 69 6e 20 74 68 65 20 61 72 72 61 79  nts in the array
37e70 20 61 72 65 20 0a 2a 2a 20 74 68 65 20 76 61 6c   are .** the val
37e80 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ues of columns i
37e90 6e 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 2a  n the new row..*
37ea0 2a 0a 2a 2a 20 49 66 20 50 32 3d 3d 31 20 74 68  *.** If P2==1 th
37eb0 65 6e 20 6e 6f 20 69 6e 73 65 72 74 20 69 73 20  en no insert is 
37ec0 70 65 72 66 6f 72 6d 65 64 2e 20 20 61 72 67 76  performed.  argv
37ed0 5b 30 5d 20 69 73 20 74 68 65 20 72 6f 77 69 64  [0] is the rowid
37ee0 20 6f 66 0a 2a 2a 20 61 20 72 6f 77 20 74 6f 20   of.** a row to 
37ef0 64 65 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 50 31  delete..**.** P1
37f00 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66 6c   is a boolean fl
37f10 61 67 2e 20 49 66 20 69 74 20 69 73 20 73 65 74  ag. If it is set
37f20 20 74 6f 20 74 72 75 65 20 61 6e 64 20 74 68 65   to true and the
37f30 20 78 55 70 64 61 74 65 20 63 61 6c 6c 0a 2a 2a   xUpdate call.**
37f40 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
37f50 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
37f60 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
37f70 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
37f80 6f 77 69 64 28 29 20 0a 2a 2a 20 69 73 20 73 65  owid() .** is se
37f90 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
37fa0 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
37fb0 74 68 65 20 72 6f 77 20 6a 75 73 74 20 69 6e 73  the row just ins
37fc0 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 35 20  erted..**.** P5 
37fd0 69 73 20 74 68 65 20 65 72 72 6f 72 20 61 63 74  is the error act
37fe0 69 6f 6e 73 20 28 4f 45 5f 52 65 70 6c 61 63 65  ions (OE_Replace
37ff0 2c 20 4f 45 5f 46 61 69 6c 2c 20 4f 45 5f 49 67  , OE_Fail, OE_Ig
38000 6e 6f 72 65 2c 20 65 74 63 29 20 74 6f 0a 2a 2a  nore, etc) to.**
38010 20 61 70 70 6c 79 20 69 6e 20 74 68 65 20 63 61   apply in the ca
38020 73 65 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  se of a constrai
38030 6e 74 20 66 61 69 6c 75 72 65 20 6f 6e 20 61 6e  nt failure on an
38040 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74   insert or updat
38050 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 55  e..*/.case OP_VU
38060 70 64 61 74 65 3a 20 7b 0a 20 20 73 71 6c 69 74  pdate: {.  sqlit
38070 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a  e3_vtab *pVtab;.
38080 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
38090 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b  module *pModule;
380a0 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69  .  int nArg;.  i
380b0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69  nt i;.  sqlite_i
380c0 6e 74 36 34 20 72 6f 77 69 64 3b 0a 20 20 4d 65  nt64 rowid;.  Me
380d0 6d 20 2a 2a 61 70 41 72 67 3b 0a 20 20 4d 65 6d  m **apArg;.  Mem
380e0 20 2a 70 58 3b 0a 0a 20 20 61 73 73 65 72 74 28   *pX;..  assert(
380f0 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 20 20 20 20   pOp->p2==1     
38100 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f     || pOp->p5==O
38110 45 5f 46 61 69 6c 20 20 20 7c 7c 20 70 4f 70 2d  E_Fail   || pOp-
38120 3e 70 35 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  >p5==OE_Rollback
38130 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d   .       || pOp-
38140 3e 70 35 3d 3d 4f 45 5f 41 62 6f 72 74 20 7c 7c  >p5==OE_Abort ||
38150 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 49 67 6e   pOp->p5==OE_Ign
38160 6f 72 65 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ore || pOp->p5==
38170 4f 45 5f 52 65 70 6c 61 63 65 0a 20 20 29 3b 0a  OE_Replace.  );.
38180 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
38190 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 56  dOnly==0 );.  pV
381a0 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
381b0 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 69 66  tab->pVtab;.  if
381c0 28 20 70 56 74 61 62 3d 3d 30 20 7c 7c 20 4e 45  ( pVtab==0 || NE
381d0 56 45 52 28 70 56 74 61 62 2d 3e 70 4d 6f 64 75  VER(pVtab->pModu
381e0 6c 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  le==0) ){.    rc
381f0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
38200 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
38210 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
38220 20 7d 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70   }.  pModule = p
38230 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
38240 20 6e 41 72 67 20 3d 20 70 4f 70 2d 3e 70 32 3b   nArg = pOp->p2;
38250 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
38260 70 34 74 79 70 65 3d 3d 50 34 5f 56 54 41 42 20  p4type==P4_VTAB 
38270 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
38280 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64 61 74 65  pModule->xUpdate
38290 29 20 29 7b 0a 20 20 20 20 75 38 20 76 74 61 62  ) ){.    u8 vtab
382a0 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d 20 64 62 2d  OnConflict = db-
382b0 3e 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 3b  >vtabOnConflict;
382c0 0a 20 20 20 20 61 70 41 72 67 20 3d 20 70 2d 3e  .    apArg = p->
382d0 61 70 41 72 67 3b 0a 20 20 20 20 70 58 20 3d 20  apArg;.    pX = 
382e0 26 61 4d 65 6d