/ Hex Artifact Content
Login

Artifact 9a6b75f8265756bf49c776fa9f561b0c13a123064734e8237586e4c4c11897b6:


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 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ");.}.#endif..#i
3ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4000: 47 0a 23 20 20 64 65 66 69 6e 65 20 52 45 47 49  G.#  define REGI
4010: 53 54 45 52 5f 54 52 41 43 45 28 52 2c 4d 29 20  STER_TRACE(R,M) 
4020: 69 66 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  if(db->flags&SQL
4030: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 72 65  ITE_VdbeTrace)re
4040: 67 69 73 74 65 72 54 72 61 63 65 28 52 2c 4d 29  gisterTrace(R,M)
4050: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4060: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
4070: 52 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  R,M).#endif...#i
4080: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4090: 45 0a 0a 2f 2a 20 0a 2a 2a 20 68 77 74 69 6d 65  E../* .** hwtime
40a0: 2e 68 20 63 6f 6e 74 61 69 6e 73 20 69 6e 6c 69  .h contains inli
40b0: 6e 65 20 61 73 73 65 6d 62 6c 65 72 20 63 6f 64  ne assembler cod
40c0: 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
40d0: 6e 67 20 0a 2a 2a 20 68 69 67 68 2d 70 65 72 66  ng .** high-perf
40e0: 6f 72 6d 61 6e 63 65 20 74 69 6d 69 6e 67 20 72  ormance timing r
40f0: 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 23 69 6e 63  outines..*/.#inc
4100: 6c 75 64 65 20 22 68 77 74 69 6d 65 2e 68 22 0a  lude "hwtime.h".
4110: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
4120: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68   NDEBUG./*.** Th
4130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
4140: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
4150: 77 69 74 68 69 6e 20 61 6e 20 61 73 73 65 72 74  within an assert
4160: 28 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  () expression. I
4170: 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 61 74  t.** checks that
4180: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 54 72   the sqlite3.nTr
4190: 61 6e 73 61 63 74 69 6f 6e 20 76 61 72 69 61 62  ansaction variab
41a0: 6c 65 20 69 73 20 63 6f 72 72 65 63 74 6c 79 20  le is correctly 
41b0: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75  set to.** the nu
41c0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 74 72 61 6e  mber of non-tran
41d0: 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
41e0: 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
41f0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
4200: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
4210: 73 71 6c 69 74 65 33 2e 70 53 61 76 65 70 6f 69  sqlite3.pSavepoi
4220: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 55 73 61 67 65  nt..** .** Usage
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 73 73 65  :.**.**     asse
4240: 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
4250: 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 2a  ntCount(db) );.*
4260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4270: 63 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74  ckSavepointCount
4280: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4290: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 53 61   int n = 0;.  Sa
42a0: 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 66 6f  vepoint *p;.  fo
42b0: 72 28 70 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  r(p=db->pSavepoi
42c0: 6e 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  nt; p; p=p->pNex
42d0: 74 29 20 6e 2b 2b 3b 0a 20 20 61 73 73 65 72 74  t) n++;.  assert
42e0: 28 20 6e 3d 3d 28 64 62 2d 3e 6e 53 61 76 65 70  ( n==(db->nSavep
42f0: 6f 69 6e 74 20 2b 20 64 62 2d 3e 69 73 54 72 61  oint + db->isTra
4300: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
4310: 74 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  t) );.  return 1
4320: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4330: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
4340: 69 73 74 65 72 20 6f 66 20 70 4f 70 2d 3e 70 32  ister of pOp->p2
4350: 20 61 66 74 65 72 20 66 69 72 73 74 20 70 72 65   after first pre
4360: 70 61 72 69 6e 67 20 69 74 20 74 6f 20 62 65 0a  paring it to be.
4370: 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
4380: 69 74 68 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ith an integer v
4390: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
43a0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
43b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
43c0: 61 73 65 57 69 74 68 43 6c 65 61 72 28 4d 65 6d  aseWithClear(Mem
43d0: 20 2a 70 4f 75 74 29 7b 0a 20 20 73 71 6c 69 74   *pOut){.  sqlit
43e0: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
43f0: 28 70 4f 75 74 29 3b 0a 20 20 70 4f 75 74 2d 3e  (pOut);.  pOut->
4400: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
4410: 0a 20 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a  .  return pOut;.
4420: 7d 0a 73 74 61 74 69 63 20 4d 65 6d 20 2a 6f 75  }.static Mem *ou
4430: 74 32 50 72 65 72 65 6c 65 61 73 65 28 56 64 62  t2Prerelease(Vdb
4440: 65 20 2a 70 2c 20 56 64 62 65 4f 70 20 2a 70 4f  e *p, VdbeOp *pO
4450: 70 29 7b 0a 20 20 4d 65 6d 20 2a 70 4f 75 74 3b  p){.  Mem *pOut;
4460: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
4470: 70 32 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p2>0 );.  assert
4480: 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  ( pOp->p2<=(p->n
4490: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
44a0: 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  or) );.  pOut = 
44b0: 26 70 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  &p->aMem[pOp->p2
44c0: 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
44d0: 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
44e0: 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79 6e    if( VdbeMemDyn
44f0: 61 6d 69 63 28 70 4f 75 74 29 20 29 7b 20 2f 2a  amic(pOut) ){ /*
4500: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
4510: 46 41 4c 53 45 2a 2f 0a 20 20 20 20 72 65 74 75  FALSE*/.    retu
4520: 72 6e 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73  rn out2Prereleas
4530: 65 57 69 74 68 43 6c 65 61 72 28 70 4f 75 74 29  eWithClear(pOut)
4540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4550: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
4560: 5f 49 6e 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  _Int;.    return
4570: 20 70 4f 75 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   pOut;.  }.}.../
4580: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 73 20  *.** Execute as 
4590: 6d 75 63 68 20 6f 66 20 61 20 56 44 42 45 20 70  much of a VDBE p
45a0: 72 6f 67 72 61 6d 20 61 73 20 77 65 20 63 61 6e  rogram as we can
45b0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  ..** This is the
45c0: 20 63 6f 72 65 20 6f 66 20 73 71 6c 69 74 65 33   core of sqlite3
45d0: 5f 73 74 65 70 28 29 2e 20 20 0a 2a 2f 0a 69 6e  _step().  .*/.in
45e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  t sqlite3VdbeExe
45f0: 63 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  c(.  Vdbe *p    
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
4620: 7b 0a 20 20 4f 70 20 2a 61 4f 70 20 3d 20 70 2d  {.  Op *aOp = p-
4630: 3e 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 2f  >aOp;          /
4640: 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61 4f 70  * Copy of p->aOp
4650: 20 2a 2f 0a 20 20 4f 70 20 2a 70 4f 70 20 3d 20   */.  Op *pOp = 
4660: 61 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  aOp;            
4670: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 70 65 72   /* Current oper
4680: 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 64 65 66  ation */.#if def
4690: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
46a0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
46b0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 4f 70  BE_PROFILE).  Op
46c0: 20 2a 70 4f 72 69 67 4f 70 3b 20 20 20 20 20 20   *pOrigOp;      
46d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
46e0: 65 20 6f 66 20 70 4f 70 20 61 74 20 74 68 65 20  e of pOp at the 
46f0: 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
4700: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  */.#endif.#ifdef
4710: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4720: 69 6e 74 20 6e 45 78 74 72 61 44 65 6c 65 74 65  int nExtraDelete
4730: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 56 65   = 0;      /* Ve
4740: 72 69 66 69 65 73 20 46 4f 52 44 45 4c 45 54 45  rifies FORDELETE
4750: 20 61 6e 64 20 41 55 58 44 45 4c 45 54 45 20 66   and AUXDELETE f
4760: 6c 61 67 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  lags */.#endif. 
4770: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4780: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  _OK;        /* V
4790: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
47a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
47b0: 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f  = p->db;       /
47c0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
47d0: 2f 0a 20 20 75 38 20 72 65 73 65 74 53 63 68 65  /.  u8 resetSche
47e0: 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 30 3b 20 2f  maOnFault = 0; /
47f0: 2a 20 52 65 73 65 74 20 73 63 68 65 6d 61 20 61  * Reset schema a
4800: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 66  fter an error if
4810: 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 75   positive */.  u
4820: 38 20 65 6e 63 6f 64 69 6e 67 20 3d 20 45 4e 43  8 encoding = ENC
4830: 28 64 62 29 3b 20 20 20 20 20 2f 2a 20 54 68 65  (db);     /* The
4840: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
4850: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6d  ng */.  int iCom
4860: 70 61 72 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pare = 0;       
4870: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
4880: 6c 61 73 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20  last comparison 
4890: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 56  */.  unsigned nV
48a0: 6d 53 74 65 70 20 3d 20 30 3b 20 20 20 20 20 20  mStep = 0;      
48b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 69 72  /* Number of vir
48c0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 73 74 65  tual machine ste
48d0: 70 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ps */.#ifndef SQ
48e0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
48f0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 75 6e  SS_CALLBACK.  un
4900: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
4910: 4c 69 6d 69 74 20 3d 20 30 3b 2f 2a 20 49 6e 76  Limit = 0;/* Inv
4920: 6f 6b 65 20 78 50 72 6f 67 72 65 73 73 28 29 20  oke xProgress() 
4930: 77 68 65 6e 20 6e 56 6d 53 74 65 70 20 72 65 61  when nVmStep rea
4940: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 23 65 6e  ches this */.#en
4950: 64 69 66 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20  dif.  Mem *aMem 
4960: 3d 20 70 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20  = p->aMem;      
4970: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 2d 3e 61   /* Copy of p->a
4980: 4d 65 6d 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  Mem */.  Mem *pI
4990: 6e 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n1 = 0;         
49a0: 20 20 20 20 2f 2a 20 31 73 74 20 69 6e 70 75 74      /* 1st input
49b0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
49c0: 6d 20 2a 70 49 6e 32 20 3d 20 30 3b 20 20 20 20  m *pIn2 = 0;    
49d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 32 6e 64 20           /* 2nd 
49e0: 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f  input operand */
49f0: 0a 20 20 4d 65 6d 20 2a 70 49 6e 33 20 3d 20 30  .  Mem *pIn3 = 0
4a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4a10: 20 33 72 64 20 69 6e 70 75 74 20 6f 70 65 72 61   3rd input opera
4a20: 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4f 75  nd */.  Mem *pOu
4a30: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
4a40: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 70 65     /* Output ope
4a50: 72 61 6e 64 20 2a 2f 0a 23 69 66 64 65 66 20 56  rand */.#ifdef V
4a60: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 75 36  DBE_PROFILE.  u6
4a70: 34 20 73 74 61 72 74 3b 20 20 20 20 20 20 20 20  4 start;        
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 50 55 20           /* CPU 
4a90: 63 6c 6f 63 6b 20 63 6f 75 6e 74 20 61 74 20 73  clock count at s
4aa0: 74 61 72 74 20 6f 66 20 6f 70 63 6f 64 65 20 2a  tart of opcode *
4ab0: 2f 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20  /.#endif.  /*** 
4ac0: 49 4e 53 45 52 54 20 53 54 41 43 4b 20 55 4e 49  INSERT STACK UNI
4ad0: 4f 4e 20 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20  ON HERE ***/..  
4ae0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4af0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
4b00: 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f   );  /* sqlite3_
4b10: 73 74 65 70 28 29 20 76 65 72 69 66 69 65 73 20  step() verifies 
4b20: 74 68 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  this */.  sqlite
4b30: 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 20  3VdbeEnter(p);. 
4b40: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
4b50: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
4b60: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
4b70: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
4b80: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
4b90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4ba0: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
4bb0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4bc0: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
4bd0: 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d  */.    goto no_m
4be0: 65 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  em;.  }.  assert
4bf0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4c00: 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
4c10: 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  f)==SQLITE_BUSY 
4c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4c30: 62 49 73 52 65 61 64 65 72 20 7c 7c 20 70 2d 3e  bIsReader || p->
4c40: 72 65 61 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a 20  readOnly!=0 );. 
4c50: 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
4c60: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
4c70: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20 29 3b  p->explain==0 );
4c80: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
4c90: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
4ca0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
4cb0: 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  0;.  if( db->u1.
4cc0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
4cd0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
4ce0: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 73  o_interrupt;.  s
4cf0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
4d00: 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e 64 65 66  eSql(p);.#ifndef
4d10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
4d20: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20  GRESS_CALLBACK. 
4d30: 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65   if( db->xProgre
4d40: 73 73 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  ss ){.    u32 iP
4d50: 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f 75 6e 74  rior = p->aCount
4d60: 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  er[SQLITE_STMTST
4d70: 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d 3b 0a 20  ATUS_VM_STEP];. 
4d80: 20 20 20 61 73 73 65 72 74 28 20 30 20 3c 20 64     assert( 0 < d
4d90: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
4da0: 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73  );.    nProgress
4db0: 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e 50 72 6f  Limit = db->nPro
4dc0: 67 72 65 73 73 4f 70 73 20 2d 20 28 69 50 72 69  gressOps - (iPri
4dd0: 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f 67 72 65  or % db->nProgre
4de0: 73 73 4f 70 73 29 3b 0a 20 20 7d 0a 23 65 6e 64  ssOps);.  }.#end
4df0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4e00: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4e10: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4e20: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4e30: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
4e40: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
4e50: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
4e60: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
4e70: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
4e80: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
4e90: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
4ea0: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
4eb0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
4ec0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
4ed0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
4ee0: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
4ef0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
4f00: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
4f10: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
4f20: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
4f30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
4f40: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f50: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
4f60: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
4f70: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
4f80: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4f90: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
4fa0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
4fb0: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
4fc0: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
4fd0: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
4fe0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
4ff0: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
5000: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
5010: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
5020: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
5030: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
5040: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5050: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5070: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5080: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5090: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
50a0: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
50b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
50c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
50d0: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
50e0: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
50f0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
5100: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
5110: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
5120: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
5130: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
5140: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5150: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5160: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5170: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5180: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5190: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
51a0: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
51b0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
51c0: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
51d0: 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 23 65 6e  te3Hwtime();.#en
51e0: 64 69 66 0a 20 20 20 20 6e 56 6d 53 74 65 70 2b  dif.    nVmStep+
51f0: 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
5200: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
5210: 4e 53 54 41 54 55 53 0a 20 20 20 20 69 66 28 20  NSTATUS.    if( 
5220: 70 2d 3e 61 6e 45 78 65 63 20 29 20 70 2d 3e 61  p->anExec ) p->a
5230: 6e 45 78 65 63 5b 28 69 6e 74 29 28 70 4f 70 2d  nExec[(int)(pOp-
5240: 61 4f 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69 66 0a  aOp)]++;.#endif.
5250: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  .    /* Only all
5260: 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20 53 51  ow tracing if SQ
5270: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
5280: 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 23 69  fined..    */.#i
5290: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
52a0: 47 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 66 6c  G.    if( db->fl
52b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
52c0: 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eTrace ){.      
52d0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
52e0: 4f 70 28 73 74 64 6f 75 74 2c 20 28 69 6e 74 29  Op(stdout, (int)
52f0: 28 70 4f 70 20 2d 20 61 4f 70 29 2c 20 70 4f 70  (pOp - aOp), pOp
5300: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
5310: 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a 20 43        ..    /* C
5320: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
5330: 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75 6c 61  e need to simula
5340: 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70 74 2e  te an interrupt.
5350: 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70    This only happ
5360: 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20 77 65  ens.    ** if we
5370: 20 68 61 76 65 20 61 20 73 70 65 63 69 61 6c 20   have a special 
5380: 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20 20 20  test build..    
5390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
53a0: 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20 73 71  _TEST.    if( sq
53b0: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
53c0: 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  count>0 ){.     
53d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
53e0: 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20 20 20  pt_count--;.    
53f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
5400: 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d 3d 30  terrupt_count==0
5410: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5420: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
5430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5440: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
5450: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
5460: 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64  on other operand
5470: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
5480: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b 0a 20  TE_DEBUG.    {. 
5490: 20 20 20 20 20 75 38 20 6f 70 50 72 6f 70 65 72       u8 opProper
54a0: 74 79 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  ty = sqlite3Opco
54b0: 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e  deProperty[pOp->
54c0: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 20 20 69  opcode];.      i
54d0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
54e0: 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30 20 29   OPFLG_IN1)!=0 )
54f0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5500: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b 0a 20  ( pOp->p1>0 );. 
5510: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5520: 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p1<=(p->nMem
5530: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
5540: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5550: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5560: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20 29  aMem[pOp->p1]) )
5570: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5580: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
5590: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
55a0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 20  &aMem[pOp->p1]) 
55b0: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
55c0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
55d0: 31 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31  1, &aMem[pOp->p1
55e0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
55f0: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5600: 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29 21 3d  y & OPFLG_IN2)!=
5610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
5620: 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
5630: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5640: 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e 6e  ( pOp->p2<=(p->n
5650: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
5660: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  or) );.        a
5670: 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
5680: 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  d(&aMem[pOp->p2]
5690: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ) );.        ass
56a0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
56b0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
56c0: 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  ts(&aMem[pOp->p2
56d0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45  ]) );.        RE
56e0: 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
56f0: 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  ->p2, &aMem[pOp-
5700: 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >p2]);.      }. 
5710: 20 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70       if( (opProp
5720: 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 33  erty & OPFLG_IN3
5730: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
5740: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
5750: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
5760: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  ert( pOp->p3<=(p
5770: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
5780: 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20  ursor) );.      
5790: 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
57a0: 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alid(&aMem[pOp->
57b0: 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  p3]) );.        
57c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56  assert( sqlite3V
57d0: 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72  dbeCheckMemInvar
57e0: 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d  iants(&aMem[pOp-
57f0: 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  >p3]) );.       
5800: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
5810: 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d 5b 70  pOp->p3, &aMem[p
5820: 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20 20  Op->p3]);.      
5830: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50  }.      if( (opP
5840: 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f  roperty & OPFLG_
5850: 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20 20 20  OUT2)!=0 ){.    
5860: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5870: 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p2>0 );.       
5880: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
5890: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
58a0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
58b0: 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
58c0: 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
58d0: 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20  pOp->p2]);.     
58e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70   }.      if( (op
58f0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
5900: 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a 20 20 20  _OUT3)!=0 ){.   
5910: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
5920: 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20 20  ->p3>0 );.      
5930: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5940: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
5950: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
5960: 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54         memAboutT
5970: 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
5980: 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
5990: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
59a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59b0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
59c0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
59d0: 4c 45 29 0a 20 20 20 20 70 4f 72 69 67 4f 70 20  LE).    pOrigOp 
59e0: 3d 20 70 4f 70 3b 0a 23 65 6e 64 69 66 0a 20 20  = pOp;.#endif.  
59f0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70  .    switch( pOp
5a00: 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f 2a 2a  ->opcode ){../**
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 57  ***********.** W
5a60: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73 20 61  hat follows is a
5a70: 20 6d 61 73 73 69 76 65 20 73 77 69 74 63 68 20   massive switch 
5a80: 73 74 61 74 65 6d 65 6e 74 20 77 68 65 72 65 20  statement where 
5a90: 65 61 63 68 20 63 61 73 65 20 69 6d 70 6c 65 6d  each case implem
5aa0: 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61 72 61  ents a.** separa
5ab0: 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  te instruction i
5ac0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
5ad0: 63 68 69 6e 65 2e 20 20 49 66 20 77 65 20 66 6f  chine.  If we fo
5ae0: 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 6c 0a 2a  llow the usual.*
5af0: 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20 63 6f  * indentation co
5b00: 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63 68 20  nventions, each 
5b10: 63 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 69  case should be i
5b20: 6e 64 65 6e 74 65 64 20 62 79 20 36 20 73 70 61  ndented by 6 spa
5b30: 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74 68 61  ces.  But.** tha
5b40: 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 20 77 61  t is a lot of wa
5b50: 73 74 65 64 20 73 70 61 63 65 20 6f 6e 20 74 68  sted space on th
5b60: 65 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e 20 20  e left margin.  
5b70: 53 6f 20 74 68 65 20 63 6f 64 65 20 77 69 74 68  So the code with
5b80: 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74 63 68  in.** the switch
5b90: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c 6c 20   statement will 
5ba0: 62 72 65 61 6b 20 77 69 74 68 20 63 6f 6e 76 65  break with conve
5bb0: 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 66 6c 75  ntion and be flu
5bc0: 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68 65 72  sh-left. Another
5bd0: 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e 74 20  .** big comment 
5be0: 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 69 73  (similar to this
5bf0: 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72 6b 20   one) will mark 
5c00: 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  the point in the
5c10: 20 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a 20 77   code where.** w
5c20: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63  e transition bac
5c30: 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e 64 65  k to normal inde
5c40: 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ntation..**.** T
5c50: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f 66  he formatting of
5c60: 20 65 61 63 68 20 63 61 73 65 20 69 73 20 69 6d   each case is im
5c70: 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20 6d 61  portant.  The ma
5c80: 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 4c 69 74  kefile for SQLit
5c90: 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 74  e.** generates t
5ca0: 77 6f 20 43 20 66 69 6c 65 73 20 22 6f 70 63 6f  wo C files "opco
5cb0: 64 65 73 2e 68 22 20 61 6e 64 20 22 6f 70 63 6f  des.h" and "opco
5cc0: 64 65 73 2e 63 22 20 62 79 20 73 63 61 6e 6e 69  des.c" by scanni
5cd0: 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 20  ng this.** file 
5ce0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69 6e 65  looking for line
5cf0: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
5d00: 68 20 22 63 61 73 65 20 4f 50 5f 22 2e 20 20 54  h "case OP_".  T
5d10: 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 66 69 6c  he opcodes.h fil
5d20: 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 66 69  es.** will be fi
5d30: 6c 6c 65 64 20 77 69 74 68 20 23 64 65 66 69 6e  lled with #defin
5d40: 65 73 20 74 68 61 74 20 67 69 76 65 20 75 6e 69  es that give uni
5d50: 71 75 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  que integer valu
5d60: 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20 6f 70  es to each.** op
5d70: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 6f 70 63  code and the opc
5d80: 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 73 20 66  odes.c file is f
5d90: 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 61 72  illed with an ar
5da0: 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 20 77  ray of strings w
5db0: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 74 72  here.** each str
5dc0: 69 6e 67 20 69 73 20 74 68 65 20 73 79 6d 62 6f  ing is the symbo
5dd0: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  lic name for the
5de0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6f   corresponding o
5df0: 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65 0a 2a  pcode.  If the.*
5e00: 2a 20 63 61 73 65 20 73 74 61 74 65 6d 65 6e 74  * case statement
5e10: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
5e20: 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74 68 65  a comment of the
5e30: 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65 20 61   form "/# same a
5e40: 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74 68 61  s ... #/".** tha
5e50: 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75 73 65  t comment is use
5e60: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
5e70: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  he particular va
5e80: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
5e90: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 6b  e..**.** Other k
5ea0: 65 79 77 6f 72 64 73 20 69 6e 20 74 68 65 20 63  eywords in the c
5eb0: 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f 6c 6c  omment that foll
5ec0: 6f 77 73 20 65 61 63 68 20 63 61 73 65 20 61 72  ows each case ar
5ed0: 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63 6f 6e  e used to.** con
5ee0: 73 74 72 75 63 74 20 74 68 65 20 4f 50 46 4c 47  struct the OPFLG
5ef0: 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 76 61 6c  _INITIALIZER val
5f00: 75 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  ue that initiali
5f10: 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f 70 65 72  zes opcodeProper
5f20: 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f 72 64  ty[]..** Keyword
5f30: 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31 2c 20  s include: in1, 
5f40: 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32 2c 20  in2, in3, out2, 
5f50: 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20 74 68  out3.  See.** th
5f60: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
5f70: 73 63 72 69 70 74 20 66 6f 72 20 61 64 64 69 74  script for addit
5f80: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
5f90: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d 65 6e  n..**.** Documen
5fa0: 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56 44 42  tation about VDB
5fb0: 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67 65 6e  E opcodes is gen
5fc0: 65 72 61 74 65 64 20 62 79 20 73 63 61 6e 6e 69  erated by scanni
5fd0: 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20  ng this file.** 
5fe0: 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74 68 61  for lines of tha
5ff0: 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63 6f 64  t contain "Opcod
6000: 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e 65 20  e:".  That line 
6010: 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  and all subseque
6020: 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20 6c 69  nt.** comment li
6030: 6e 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nes are used in 
6040: 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  the generation o
6050: 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68 74 6d  f the opcode.htm
6060: 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a  l documentation.
6070: 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  ** file..**.** S
6080: 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20 20 20  UMMARY:.**.**   
6090: 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69 73 20    Formatting is 
60a0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 63 72  important to scr
60b0: 69 70 74 73 20 74 68 61 74 20 73 63 61 6e 20 74  ipts that scan t
60c0: 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  his file..**    
60d0: 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20   Do not deviate 
60e0: 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 74  from the formatt
60f0: 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72 65 6e  ing style curren
6100: 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  tly in use..**.*
6110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
6160: 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74 6f 20  * Opcode:  Goto 
6170: 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  * P2 * * *.**.**
6180: 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61   An unconditiona
6190: 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  l jump to addres
61a0: 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e 65 78  s P2..** The nex
61b0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 78  t instruction ex
61c0: 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65 20 0a  ecuted will be .
61d0: 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20 69 6e  ** the one at in
61e0: 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68 65 20  dex P2 from the 
61f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
6200: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
6210: 2a 2a 20 54 68 65 20 50 31 20 70 61 72 61 6d 65  ** The P1 parame
6220: 74 65 72 20 69 73 20 6e 6f 74 20 61 63 74 75 61  ter is not actua
6230: 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68 69 73  lly used by this
6240: 20 6f 70 63 6f 64 65 2e 20 20 48 6f 77 65 76 65   opcode.  Howeve
6250: 72 2c 20 69 74 0a 2a 2a 20 69 73 20 73 6f 6d 65  r, it.** is some
6260: 74 69 6d 65 73 20 73 65 74 20 74 6f 20 31 20 69  times set to 1 i
6270: 6e 73 74 65 61 64 20 6f 66 20 30 20 61 73 20 61  nstead of 0 as a
6280: 20 68 69 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d   hint to the com
6290: 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 0a  mand-line shell.
62a0: 2a 2a 20 74 68 61 74 20 74 68 69 73 20 47 6f 74  ** that this Got
62b0: 6f 20 69 73 20 74 68 65 20 62 6f 74 74 6f 6d 20  o is the bottom 
62c0: 6f 66 20 61 20 6c 6f 6f 70 20 61 6e 64 20 74 68  of a loop and th
62d0: 61 74 20 74 68 65 20 6c 69 6e 65 73 20 66 72 6f  at the lines fro
62e0: 6d 20 50 32 20 64 6f 77 6e 0a 2a 2a 20 74 6f 20  m P2 down.** to 
62f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e 65  the current line
6300: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e   should be inden
6310: 74 65 64 20 66 6f 72 20 45 58 50 4c 41 49 4e 20  ted for EXPLAIN 
6320: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20  output..*/.case 
6330: 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20 20 20  OP_Goto: {      
6340: 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
6350: 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64  /.jump_to_p2_and
6360: 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72  _check_for_inter
6370: 72 75 70 74 3a 0a 20 20 70 4f 70 20 3d 20 26 61  rupt:.  pOp = &a
6380: 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b  Op[pOp->p2 - 1];
6390: 0a 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 73 20 74  ..  /* Opcodes t
63a0: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
63b0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20  the bottom of a 
63c0: 6c 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 2c 20 4f  loop (OP_Next, O
63d0: 50 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 4f 50 5f  P_Prev,.  ** OP_
63e0: 56 4e 65 78 74 2c 20 4f 50 5f 52 6f 77 53 65 74  VNext, OP_RowSet
63f0: 4e 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f 72 74  Next, or OP_Sort
6400: 65 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75 6d 70  erNext) all jump
6410: 20 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a 2a 20   here upon.  ** 
6420: 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43 68 65  completion.  Che
6430: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 73 71 6c  ck to see if sql
6440: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 29  ite3_interrupt()
6450: 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
6460: 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  .  ** or if the 
6470: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
6480: 6b 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  k needs to be in
6490: 76 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a  voked. .  **.  *
64a0: 2a 20 54 68 69 73 20 63 6f 64 65 20 75 73 65 73  * This code uses
64b0: 20 75 6e 73 74 72 75 63 74 75 72 65 64 20 22 67   unstructured "g
64c0: 6f 74 6f 22 20 73 74 61 74 65 6d 65 6e 74 73 20  oto" statements 
64d0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f  and does not loo
64e0: 6b 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20 42 75  k clean..  ** Bu
64f0: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 64 75  t that is not du
6500: 65 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f 64 69  e to sloppy codi
6510: 6e 67 20 68 61 62 69 74 73 2e 20 54 68 65 20 63  ng habits. The c
6520: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  ode is written t
6530: 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 66 6f 72  his.  ** way for
6540: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 74 6f   performance, to
6550: 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
6560: 20 72 75 6e 20 74 68 65 20 69 6e 74 65 72 72 75   run the interru
6570: 70 74 20 61 6e 64 20 70 72 6f 67 72 65 73 73 0a  pt and progress.
6580: 20 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e 20 65    ** checks on e
6590: 76 65 72 79 20 6f 70 63 6f 64 65 2e 20 20 54 68  very opcode.  Th
65a0: 69 73 20 68 65 6c 70 73 20 73 71 6c 69 74 65 33  is helps sqlite3
65b0: 5f 73 74 65 70 28 29 20 74 6f 20 72 75 6e 20 61  _step() to run a
65c0: 62 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a 20 66  bout 1.5%.  ** f
65d0: 61 73 74 65 72 20 61 63 63 6f 72 64 69 6e 67 20  aster according 
65e0: 74 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d 2d 74  to "valgrind --t
65f0: 6f 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64 22 20  ool=cachegrind" 
6600: 2a 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  */.check_for_int
6610: 65 72 72 75 70 74 3a 0a 20 20 69 66 28 20 64 62  errupt:.  if( db
6620: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
6630: 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  ed ) goto abort_
6640: 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74  due_to_interrupt
6650: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6660: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
6670: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 43 61 6c  ALLBACK.  /* Cal
6680: 6c 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  l the progress c
6690: 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 20 69 73  allback if it is
66a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
66b0: 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 75 6d  the required num
66c0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 56 44 42 45  ber.  ** of VDBE
66d0: 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e 20 65   ops have been e
66e0: 78 65 63 75 74 65 64 20 28 65 69 74 68 65 72 20  xecuted (either 
66f0: 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76 6f 63  since this invoc
6700: 61 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 73 71  ation of.  ** sq
6710: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
6720: 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20 74 69  or since last ti
6730: 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  me the progress 
6740: 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63 61 6c  callback was cal
6750: 6c 65 64 29 2e 0a 20 20 2a 2a 20 49 66 20 74 68  led)..  ** If th
6760: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6770: 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
6780: 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65 20 76  zero, exit the v
6790: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 77  irtual machine w
67a0: 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 74 75 72  ith.  ** a retur
67b0: 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 41 42  n code SQLITE_AB
67c0: 4f 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ORT..  */.  if( 
67d0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d 30  db->xProgress!=0
67e0: 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e 50 72   && nVmStep>=nPr
67f0: 6f 67 72 65 73 73 4c 69 6d 69 74 20 29 7b 0a 20  ogressLimit ){. 
6800: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
6810: 50 72 6f 67 72 65 73 73 4f 70 73 21 3d 30 20 29  ProgressOps!=0 )
6820: 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73 73 4c  ;.    nProgressL
6830: 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 70 20 2b  imit = nVmStep +
6840: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
6850: 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 64 62 2d  s - (nVmStep%db-
6860: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a  >nProgressOps);.
6870: 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f      if( db->xPro
6880: 67 72 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72  gress(db->pProgr
6890: 65 73 73 41 72 67 29 20 29 7b 0a 20 20 20 20 20  essArg) ){.     
68a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
68b0: 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f  ERRUPT;.      go
68c0: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
68d0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
68e0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62 72 65  .#endif.  .  bre
68f0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
6900: 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32 20 2a  :  Gosub P1 P2 *
6910: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
6920: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 64 64   the current add
6930: 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69 73 74  ress onto regist
6940: 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74 68 65  er P1.** and the
6950: 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73  n jump to addres
6960: 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  s P2..*/.case OP
6970: 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20 20 20  _Gosub: {       
6980: 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a       /* jump */.
6990: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
69a0: 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d  1>0 && pOp->p1<=
69b0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
69c0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 49  nCursor) );.  pI
69d0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
69e0: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56  p1];.  assert( V
69f0: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49  dbeMemDynamic(pI
6a00: 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 41  n1)==0 );.  memA
6a10: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
6a20: 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d 3e 66  pIn1);.  pIn1->f
6a30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
6a40: 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69    pIn1->u.i = (i
6a50: 6e 74 29 28 70 4f 70 2d 61 4f 70 29 3b 0a 20 20  nt)(pOp-aOp);.  
6a60: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
6a70: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 0a  Op->p1, pIn1);..
6a80: 20 20 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70 20 6f    /* Most jump o
6a90: 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 61 20 67  perations do a g
6aa0: 6f 74 6f 20 74 6f 20 74 68 69 73 20 73 70 6f 74  oto to this spot
6ab0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 70 64   in order to upd
6ac0: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 4f 70  ate.  ** the pOp
6ad0: 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a 75 6d   pointer. */.jum
6ae0: 70 5f 74 6f 5f 70 32 3a 0a 20 20 70 4f 70 20 3d  p_to_p2:.  pOp =
6af0: 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20   &aOp[pOp->p2 - 
6b00: 31 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  1];.  break;.}..
6b10: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65 74 75  /* Opcode:  Retu
6b20: 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  rn P1 * * * *.**
6b30: 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20  .** Jump to the 
6b40: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
6b50: 20 61 66 74 65 72 20 74 68 65 20 61 64 64 72 65   after the addre
6b60: 73 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ss in register P
6b70: 31 2e 20 20 41 66 74 65 72 0a 2a 2a 20 74 68 65  1.  After.** the
6b80: 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72 20   jump, register 
6b90: 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65 66  P1 becomes undef
6ba0: 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  ined..*/.case OP
6bb0: 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20 20 20  _Return: {      
6bc0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
6bd0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
6be0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
6bf0: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d 3d 4d  ( pIn1->flags==M
6c00: 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 4f 70 20  EM_Int );.  pOp 
6c10: 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69  = &aOp[pIn1->u.i
6c20: 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ];.  pIn1->flags
6c30: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
6c40: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
6c50: 20 4f 70 63 6f 64 65 3a 20 49 6e 69 74 43 6f 72   Opcode: InitCor
6c60: 6f 75 74 69 6e 65 20 50 31 20 50 32 20 50 33 20  outine P1 P2 P3 
6c70: 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75 70  * *.**.** Set up
6c80: 20 72 65 67 69 73 74 65 72 20 50 31 20 73 6f 20   register P1 so 
6c90: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 59 69 65  that it will Yie
6ca0: 6c 64 20 74 6f 20 74 68 65 20 63 6f 72 6f 75 74  ld to the corout
6cb0: 69 6e 65 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 61  ine.** located a
6cc0: 74 20 61 64 64 72 65 73 73 20 50 33 2e 0a 2a 2a  t address P3..**
6cd0: 0a 2a 2a 20 49 66 20 50 32 21 3d 30 20 74 68 65  .** If P2!=0 the
6ce0: 6e 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20  n the coroutine 
6cf0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
6d00: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
6d10: 77 73 0a 2a 2a 20 74 68 69 73 20 6f 70 63 6f 64  ws.** this opcod
6d20: 65 2e 20 20 53 6f 20 6a 75 6d 70 20 6f 76 65 72  e.  So jump over
6d30: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 20 69   the coroutine i
6d40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 6f  mplementation to
6d50: 0a 2a 2a 20 61 64 64 72 65 73 73 20 50 32 2e 0a  .** address P2..
6d60: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
6d70: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 0a 2a 2f 0a  EndCoroutine.*/.
6d80: 63 61 73 65 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  case OP_InitCoro
6d90: 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 2f 2a 20  utine: {     /* 
6da0: 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72 74  jump */.  assert
6db0: 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 20  ( pOp->p1>0 &&  
6dc0: 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65  pOp->p1<=(p->nMe
6dd0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
6de0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6df0: 4f 70 2d 3e 70 32 3e 3d 30 20 26 26 20 70 4f 70  Op->p2>=0 && pOp
6e00: 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  ->p2<p->nOp );. 
6e10: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
6e20: 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 70  >=0 && pOp->p3<p
6e30: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 75 74 20  ->nOp );.  pOut 
6e40: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
6e50: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56 64 62  ;.  assert( !Vdb
6e60: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
6e70: 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  ) );.  pOut->u.i
6e80: 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31 3b 0a   = pOp->p3 - 1;.
6e90: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
6ea0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 69 66 28 20 70  MEM_Int;.  if( p
6eb0: 4f 70 2d 3e 70 32 20 29 20 67 6f 74 6f 20 6a 75  Op->p2 ) goto ju
6ec0: 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
6ed0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
6ee0: 20 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 20 50    EndCoroutine P
6ef0: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
6f00: 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  The instruction 
6f10: 61 74 20 74 68 65 20 61 64 64 72 65 73 73 20 69  at the address i
6f20: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
6f30: 20 61 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a 75 6d   a Yield..** Jum
6f40: 70 20 74 6f 20 74 68 65 20 50 32 20 70 61 72 61  p to the P2 para
6f50: 6d 65 74 65 72 20 6f 66 20 74 68 61 74 20 59 69  meter of that Yi
6f60: 65 6c 64 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  eld..** After th
6f70: 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65 72  e jump, register
6f80: 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64 65   P1 becomes unde
6f90: 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  fined..**.** See
6fa0: 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75   also: InitCorou
6fb0: 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  tine.*/.case OP_
6fc0: 45 6e 64 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 20  EndCoroutine: { 
6fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
6fe0: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 20 2a 70 43   */.  VdbeOp *pC
6ff0: 61 6c 6c 65 72 3b 0a 20 20 70 49 6e 31 20 3d 20  aller;.  pIn1 = 
7000: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
7010: 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
7020: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29  flags==MEM_Int )
7030: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
7040: 2d 3e 75 2e 69 3e 3d 30 20 26 26 20 70 49 6e 31  ->u.i>=0 && pIn1
7050: 2d 3e 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  ->u.i<p->nOp );.
7060: 20 20 70 43 61 6c 6c 65 72 20 3d 20 26 61 4f 70    pCaller = &aOp
7070: 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20 61  [pIn1->u.i];.  a
7080: 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72 2d 3e  ssert( pCaller->
7090: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 59 69 65 6c 64  opcode==OP_Yield
70a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
70b0: 61 6c 6c 65 72 2d 3e 70 32 3e 3d 30 20 26 26 20  aller->p2>=0 && 
70c0: 70 43 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d 3e 6e  pCaller->p2<p->n
70d0: 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61  Op );.  pOp = &a
70e0: 4f 70 5b 70 43 61 6c 6c 65 72 2d 3e 70 32 20 2d  Op[pCaller->p2 -
70f0: 20 31 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61   1];.  pIn1->fla
7100: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
7110: 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ed;.  break;.}..
7120: 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69 65 6c  /* Opcode:  Yiel
7130: 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
7140: 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 70 72 6f  .** Swap the pro
7150: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77 69 74  gram counter wit
7160: 68 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  h the value in r
7170: 65 67 69 73 74 65 72 20 50 31 2e 20 20 54 68 69  egister P1.  Thi
7180: 73 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66  s.** has the eff
7190: 65 63 74 20 6f 66 20 79 69 65 6c 64 69 6e 67 20  ect of yielding 
71a0: 74 6f 20 61 20 63 6f 72 6f 75 74 69 6e 65 2e 0a  to a coroutine..
71b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 72  **.** If the cor
71c0: 6f 75 74 69 6e 65 20 74 68 61 74 20 69 73 20 6c  outine that is l
71d0: 61 75 6e 63 68 65 64 20 62 79 20 74 68 69 73 20  aunched by this 
71e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 73  instruction ends
71f0: 20 77 69 74 68 0a 2a 2a 20 59 69 65 6c 64 20 6f   with.** Yield o
7200: 72 20 52 65 74 75 72 6e 20 74 68 65 6e 20 63 6f  r Return then co
7210: 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20 6e 65  ntinue to the ne
7220: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  xt instruction. 
7230: 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 63   But if.** the c
7240: 6f 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63 68 65  oroutine launche
7250: 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
7260: 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68 0a  ction ends with.
7270: 2a 2a 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  ** EndCoroutine,
7280: 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
7290: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6e   rather than con
72a0: 74 69 6e 75 69 6e 67 20 77 69 74 68 20 74 68 65  tinuing with the
72b0: 0a 2a 2a 20 6e 65 78 74 20 69 6e 73 74 72 75 63  .** next instruc
72c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
72d0: 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f 75 74  also: InitCorout
72e0: 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 59  ine.*/.case OP_Y
72f0: 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20 20 20  ield: {         
7300: 20 20 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d 70 20     /* in1, jump 
7310: 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73 74 3b  */.  int pcDest;
7320: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
7330: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
7340: 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d  rt( VdbeMemDynam
7350: 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20  ic(pIn1)==0 );. 
7360: 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d   pIn1->flags = M
7370: 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65 73 74  EM_Int;.  pcDest
7380: 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e 75 2e   = (int)pIn1->u.
7390: 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d  i;.  pIn1->u.i =
73a0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
73b0: 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
73c0: 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e  ACE(pOp->p1, pIn
73d0: 31 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  1);.  pOp = &aOp
73e0: 5b 70 63 44 65 73 74 5d 3b 0a 20 20 62 72 65 61  [pcDest];.  brea
73f0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
7400: 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20 50 31    HaltIfNull  P1
7410: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
7420: 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50  Synopsis: if r[P
7430: 33 5d 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a 2a 0a  3]=null halt.**.
7440: 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76 61 6c  ** Check the val
7450: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
7460: 33 2e 20 20 49 66 20 69 74 20 69 73 20 4e 55 4c  3.  If it is NUL
7470: 4c 20 74 68 65 6e 20 48 61 6c 74 20 75 73 69 6e  L then Halt usin
7480: 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50  g.** parameter P
7490: 31 2c 20 50 32 2c 20 61 6e 64 20 50 34 20 61 73  1, P2, and P4 as
74a0: 20 69 66 20 74 68 69 73 20 77 65 72 65 20 61 20   if this were a 
74b0: 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Halt instruction
74c0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 76 61 6c  .  If the.** val
74d0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
74e0: 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  3 is not NULL, t
74f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7500: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
7510: 54 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72  The P5 parameter
7520: 20 73 68 6f 75 6c 64 20 62 65 20 31 2e 0a 2a 2f   should be 1..*/
7530: 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49 66 4e  .case OP_HaltIfN
7540: 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a 20 69  ull: {      /* i
7550: 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26  n3 */.  pIn3 = &
7560: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
7570: 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
7580: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
7590: 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46   ) break;.  /* F
75a0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
75b0: 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a 0a 2f   OP_Halt */.}../
75c0: 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c 74 20  * Opcode:  Halt 
75d0: 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a  P1 P2 * P4 P5.**
75e0: 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64 69 61  .** Exit immedia
75f0: 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65 6e 20  tely.  All open 
7600: 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61 72 65  cursors, etc are
7610: 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74 6f 6d   closed.** autom
7620: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  atically..**.** 
7630: 50 31 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  P1 is the result
7640: 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
7650: 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  y sqlite3_exec()
7660: 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  , sqlite3_reset(
7670: 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33  ),.** or sqlite3
7680: 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20 46 6f  _finalize().  Fo
7690: 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c 74 2c  r a normal halt,
76a0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   this should be 
76b0: 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e 0a 2a  SQLITE_OK (0)..*
76c0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20 69 74  * For errors, it
76d0: 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f 74 68   can be some oth
76e0: 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20 50 31  er value.  If P1
76f0: 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69 6c 6c  !=0 then P2 will
7700: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68   determine.** wh
7710: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20  ether or not to 
7720: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63 75 72  rollback the cur
7730: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
7740: 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c 62 61  .  Do not rollba
7750: 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f 45 5f  ck.** if P2==OE_
7760: 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72 6f 6c  Fail. Do the rol
7770: 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f 45 5f  lback if P2==OE_
7780: 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20 50 32  Rollback.  If P2
7790: 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a 20 74  ==OE_Abort,.** t
77a0: 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61 6c 6c  hen back out all
77b0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 68 61   changes that ha
77c0: 76 65 20 6f 63 63 75 72 72 65 64 20 64 75 72 69  ve occurred duri
77d0: 6e 67 20 74 68 69 73 20 65 78 65 63 75 74 69 6f  ng this executio
77e0: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
77f0: 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72 6f 6c  , but do not rol
7800: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
7810: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
7820: 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20   P4 is not null 
7830: 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20 65 72  then it is an er
7840: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
7850: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69 73 20  ng..**.** P5 is 
7860: 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  a value between 
7870: 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75 73 69  0 and 4, inclusi
7880: 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66 69 65  ve, that modifie
7890: 73 20 74 68 65 20 50 34 20 73 74 72 69 6e 67 2e  s the P4 string.
78a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 28 6e  .**.**    0:  (n
78b0: 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20 20 20  o change).**    
78c0: 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  1:  NOT NULL con
78d0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50  traint failed: P
78e0: 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e 49 51  4.**    2:  UNIQ
78f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
7900: 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20 20 33  iled: P4.**    3
7910: 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  :  CHECK constra
7920: 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a  int failed: P4.*
7930: 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49 47 4e  *    4:  FOREIGN
7940: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
7950: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a 2a 2a  failed: P4.**.**
7960: 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65   If P5 is not ze
7970: 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e 55 4c  ro and P4 is NUL
7980: 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74 68 69  L, then everythi
7990: 6e 67 20 61 66 74 65 72 20 74 68 65 20 22 3a 22  ng after the ":"
79a0: 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a   is.** omitted..
79b0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
79c0: 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c 74 20  n implied "Halt 
79d0: 30 20 30 20 30 22 20 69 6e 73 74 72 75 63 74 69  0 0 0" instructi
79e0: 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74 20 74  on inserted at t
79f0: 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66 0a 2a  he very end of.*
7a00: 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61 6d 2e  * every program.
7a10: 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61 73 74    So a jump past
7a20: 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74 72 75   the last instru
7a30: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 72 6f  ction of the pro
7a40: 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 73  gram.** is the s
7a50: 61 6d 65 20 61 73 20 65 78 65 63 75 74 69 6e 67  ame as executing
7a60: 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f   Halt..*/.case O
7a70: 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64 62 65  P_Halt: {.  Vdbe
7a80: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
7a90: 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70 63 78   int pcx;..  pcx
7aa0: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
7ab0: 4f 70 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  Op);.  if( pOp->
7ac0: 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  p1==SQLITE_OK &&
7ad0: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
7ae0: 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20 73 75    /* Halt the su
7af0: 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74 75 72  b-program. Retur
7b00: 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  n control to the
7b10: 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e 20 2a   parent frame. *
7b20: 2f 0a 20 20 20 20 70 46 72 61 6d 65 20 3d 20 70  /.    pFrame = p
7b30: 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  ->pFrame;.    p-
7b40: 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61 6d 65  >pFrame = pFrame
7b50: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70  ->pParent;.    p
7b60: 2d 3e 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20 20 20  ->nFrame--;.    
7b70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
7b80: 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
7b90: 61 6e 67 65 29 3b 0a 20 20 20 20 70 63 78 20 3d  ange);.    pcx =
7ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
7bb0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
7bc0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70  ;.    if( pOp->p
7bd0: 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  2==OE_Ignore ){.
7be0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
7bf0: 74 69 6f 6e 20 70 63 78 20 69 73 20 74 68 65 20  tion pcx is the 
7c00: 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68 61 74 20  OP_Program that 
7c10: 69 6e 76 6f 6b 65 64 20 74 68 65 20 73 75 62 2d  invoked the sub-
7c20: 70 72 6f 67 72 61 6d 20 0a 20 20 20 20 20 20 2a  program .      *
7c30: 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
7c40: 67 20 68 61 6c 74 65 64 2e 20 49 66 20 74 68 65  g halted. If the
7c50: 20 70 32 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   p2 instruction 
7c60: 6f 66 20 74 68 69 73 20 4f 50 5f 48 61 6c 74 0a  of this OP_Halt.
7c70: 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63        ** instruc
7c80: 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 4f  tion is set to O
7c90: 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20 74  E_Ignore, then t
7ca0: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  he sub-program i
7cb0: 73 20 74 68 72 6f 77 69 6e 67 0a 20 20 20 20 20  s throwing.     
7cc0: 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65 78   ** an IGNORE ex
7cd0: 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  ception. In this
7ce0: 20 63 61 73 65 20 6a 75 6d 70 20 74 6f 20 74 68   case jump to th
7cf0: 65 20 61 64 64 72 65 73 73 20 73 70 65 63 69 66  e address specif
7d00: 69 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ied.      ** as 
7d10: 74 68 65 20 70 32 20 6f 66 20 74 68 65 20 63 61  the p2 of the ca
7d20: 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61 6d  lling OP_Program
7d30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 78 20  .  */.      pcx 
7d40: 3d 20 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70 32  = p->aOp[pcx].p2
7d50: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 4f  -1;.    }.    aO
7d60: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = p->aOp;.    
7d70: 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  aMem = p->aMem;.
7d80: 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70      pOp = &aOp[p
7d90: 63 78 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  cx];.    break;.
7da0: 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70 4f    }.  p->rc = pO
7db0: 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72 6f  p->p1;.  p->erro
7dc0: 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70 4f  rAction = (u8)pO
7dd0: 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20 3d  p->p2;.  p->pc =
7de0: 20 70 63 78 3b 0a 20 20 61 73 73 65 72 74 28 20   pcx;.  assert( 
7df0: 70 4f 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20  pOp->p5<=4 );.  
7e00: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
7e10: 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a   if( pOp->p5 ){.
7e20: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
7e30: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
7e40: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f  azType[] = { "NO
7e50: 54 20 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45  T NULL", "UNIQUE
7e60: 22 2c 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20  ", "CHECK",.    
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e90: 20 20 20 20 20 20 20 20 20 22 46 4f 52 45 49 47           "FOREIG
7ea0: 4e 20 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20  N KEY" };.      
7eb0: 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
7ec0: 35 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  5==1 );.      te
7ed0: 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d  stcase( pOp->p5=
7ee0: 3d 32 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =2 );.      test
7ef0: 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33  case( pOp->p5==3
7f00: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7f10: 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29  se( pOp->p5==4 )
7f20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7f30: 64 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20  dbeError(p, "%s 
7f40: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7f50: 64 22 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e  d", azType[pOp->
7f60: 70 35 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66  p5-1]);.      if
7f70: 28 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20  ( pOp->p4.z ){. 
7f80: 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
7f90: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
7fa0: 74 66 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c  tf(db, "%z: %s",
7fb0: 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70   p->zErrMsg, pOp
7fc0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d  ->p4.z);.      }
7fd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
7ff0: 6f 72 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  or(p, "%s", pOp-
8000: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  >p4.z);.    }.  
8010: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f    sqlite3_log(pO
8020: 70 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74  p->p1, "abort at
8030: 20 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22   %d in [%s]: %s"
8040: 2c 20 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20  , pcx, p->zSql, 
8050: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  p->zErrMsg);.  }
8060: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
8070: 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73  dbeHalt(p);.  as
8080: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8090: 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
80a0: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
80b0: 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
80c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
80d0: 55 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  USY ){.    p->rc
80e0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
80f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8100: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8110: 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
8120: 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
8130: 52 41 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73  RAINT );.    ass
8140: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8150: 4f 4b 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  OK || db->nDefer
8160: 72 65 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d  redCons>0 || db-
8170: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8180: 73 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  s>0 );.    rc = 
8190: 70 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45  p->rc ? SQLITE_E
81a0: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f  RROR : SQLITE_DO
81b0: 4e 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76  NE;.  }.  goto v
81c0: 64 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  dbe_return;.}../
81d0: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65  * Opcode: Intege
81e0: 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  r P1 P2 * * *.**
81f0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8200: 3d 50 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32  =P1.**.** The 32
8210: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
8220: 75 65 20 50 31 20 69 73 20 77 72 69 74 74 65 6e  ue P1 is written
8230: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
8240: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
8250: 74 65 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20  teger: {        
8260: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
8270: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
8280: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
8290: 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Out->u.i = pOp->
82a0: 70 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p1;.  break;.}..
82b0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34  /* Opcode: Int64
82c0: 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20   * P2 * P4 *.** 
82d0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
82e0: 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  P4.**.** P4 is a
82f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34   pointer to a 64
8300: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
8310: 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61  ue..** Write tha
8320: 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
8330: 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73  ister P2..*/.cas
8340: 65 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20  e OP_Int64: {   
8350: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
8360: 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  */.  pOut = out2
8370: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
8380: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
8390: 70 2d 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b  p->p4.pI64!=0 );
83a0: 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a  .  pOut->u.i = *
83b0: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20  pOp->p4.pI64;.  
83c0: 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
83d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
83e0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20  OATING_POINT./* 
83f0: 4f 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50  Opcode: Real * P
8400: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
8410: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a  psis: r[P2]=P4.*
8420: 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  *.** P4 is a poi
8430: 6e 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74  nter to a 64-bit
8440: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
8450: 76 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20  value..** Write 
8460: 74 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20  that value into 
8470: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
8480: 63 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20  case OP_Real: { 
8490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
84a0: 6d 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20  me as TK_FLOAT, 
84b0: 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d  out2 */.  pOut =
84c0: 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
84d0: 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
84e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61  >flags = MEM_Rea
84f0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  l;.  assert( !sq
8500: 6c 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d  lite3IsNaN(*pOp-
8510: 3e 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20  >p4.pReal) );.  
8520: 70 4f 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70  pOut->u.r = *pOp
8530: 2d 3e 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72  ->p4.pReal;.  br
8540: 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  eak;.}.#endif../
8550: 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67  * Opcode: String
8560: 38 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a  8 * P2 * P4 *.**
8570: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
8580: 3d 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70  ='P4'.**.** P4 p
8590: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74  oints to a nul t
85a0: 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
85b0: 73 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63  string. This opc
85c0: 6f 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ode is transform
85d0: 65 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74  ed .** into a St
85e0: 72 69 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f  ring opcode befo
85f0: 72 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65  re it is execute
8600: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
8610: 74 69 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a  time.  During.**
8620: 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   this transforma
8630: 74 69 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68  tion, the length
8640: 20 6f 66 20 73 74 72 69 6e 67 20 50 34 20 69 73   of string P4 is
8650: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74   computed and st
8660: 6f 72 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50  ored.** as the P
8670: 31 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  1 parameter..*/.
8680: 63 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a  case OP_String8:
8690: 20 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61   {         /* sa
86a0: 6d 65 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c  me as TK_STRING,
86b0: 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72   out2 */.  asser
86c0: 74 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  t( pOp->p4.z!=0 
86d0: 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
86e0: 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
86f0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  p);.  pOp->opcod
8700: 65 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20  e = OP_String;. 
8710: 20 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74   pOp->p1 = sqlit
8720: 65 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e  e3Strlen30(pOp->
8730: 70 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20  p4.z);..#ifndef 
8740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
8750: 36 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67  6.  if( encoding
8760: 21 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b  !=SQLITE_UTF8 ){
8770: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8780: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
8790: 4f 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20  Out, pOp->p4.z, 
87a0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
87b0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
87c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
87d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
87e0: 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  ==SQLITE_TOOBIG 
87f0: 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
8800: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62  E_OK!=sqlite3Vdb
8810: 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28  eChangeEncoding(
8820: 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20  pOut, encoding) 
8830: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
8840: 20 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d     assert( pOut-
8850: 3e 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70  >szMalloc>0 && p
8860: 4f 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f  Out->zMalloc==pO
8870: 75 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73  ut->z );.    ass
8880: 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61  ert( VdbeMemDyna
8890: 6d 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a  mic(pOut)==0 );.
88a0: 20 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c      pOut->szMall
88b0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  oc = 0;.    pOut
88c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53  ->flags |= MEM_S
88d0: 74 61 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70  tatic;.    if( p
88e0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44  Op->p4type==P4_D
88f0: 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20  YNAMIC ){.      
8900: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8910: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
8920: 20 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74    }.    pOp->p4t
8930: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
8940: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
8950: 3d 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70  = pOut->z;.    p
8960: 4f 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e  Op->p1 = pOut->n
8970: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
8980: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f  ( rc==SQLITE_TOO
8990: 42 49 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  BIG );.#endif.  
89a0: 69 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e  if( pOp->p1>db->
89b0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
89c0: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20  MIT_LENGTH] ){. 
89d0: 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
89e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
89f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
8a00: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
8a10: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
8a20: 73 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f  se, OP_String */
8a30: 0a 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a  .}.  ./* Opcode:
8a40: 20 53 74 72 69 6e 67 20 50 31 20 50 32 20 50 33   String P1 P2 P3
8a50: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
8a60: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28  is: r[P2]='P4' (
8a70: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68  len=P1).**.** Th
8a80: 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50  e string value P
8a90: 34 20 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28  4 of length P1 (
8aa0: 62 79 74 65 73 29 20 69 73 20 73 74 6f 72 65 64  bytes) is stored
8ab0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
8ac0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20  .**.** If P3 is 
8ad0: 6e 6f 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65  not zero and the
8ae0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69   content of regi
8af0: 73 74 65 72 20 50 33 20 69 73 20 65 71 75 61 6c  ster P3 is equal
8b00: 20 74 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20   to P5, then.** 
8b10: 74 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20  the datatype of 
8b20: 74 68 65 20 72 65 67 69 73 74 65 72 20 50 32 20  the register P2 
8b30: 69 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  is converted to 
8b40: 42 4c 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65  BLOB.  The conte
8b50: 6e 74 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  nt is.** the sam
8b60: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79  e sequence of by
8b70: 74 65 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  tes, it is merel
8b80: 79 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  y interpreted as
8b90: 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a   a BLOB instead.
8ba0: 2a 2a 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20  ** of a string, 
8bb0: 61 73 20 69 66 20 69 74 20 68 61 64 20 62 65 65  as if it had bee
8bc0: 6e 20 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65  n CAST.  In othe
8bd0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69  r words:.**.** i
8be0: 66 28 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67  f( P3!=0 and reg
8bf0: 5b 50 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50  [P3]==P5 ) reg[P
8c00: 32 5d 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50  2] := CAST(reg[P
8c10: 32 5d 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63  2] as BLOB).*/.c
8c20: 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b  ase OP_String: {
8c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
8c40: 32 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  2 */.  assert( p
8c50: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20  Op->p4.z!=0 );. 
8c60: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
8c70: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
8c80: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
8c90: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74  MEM_Str|MEM_Stat
8ca0: 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70  ic|MEM_Term;.  p
8cb0: 4f 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34  Out->z = pOp->p4
8cc0: 2e 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  .z;.  pOut->n = 
8cd0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d  pOp->p1;.  pOut-
8ce0: 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b  >enc = encoding;
8cf0: 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c  .  UPDATE_MAX_BL
8d00: 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69  OBSIZE(pOut);.#i
8d10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b  fndef SQLITE_LIK
8d20: 45 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42  E_DOESNT_MATCH_B
8d30: 4c 4f 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e  LOBS.  if( pOp->
8d40: 70 33 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  p3>0 ){.    asse
8d50: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
8d60: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
8d70: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e  rsor) );.    pIn
8d80: 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
8d90: 33 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  3];.    assert( 
8da0: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
8db0: 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  M_Int );.    if(
8dc0: 20 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d   pIn3->u.i==pOp-
8dd0: 3e 70 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67  >p5 ) pOut->flag
8de0: 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  s = MEM_Blob|MEM
8df0: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d  _Static|MEM_Term
8e00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
8e10: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8e20: 64 65 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50  de: Null P1 P2 P
8e30: 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
8e40: 73 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c  s: r[P2..P3]=NUL
8e50: 4c 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  L.**.** Write a 
8e60: 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74  NULL into regist
8e70: 65 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67  ers P2.  If P3 g
8e80: 72 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20  reater than P2, 
8e90: 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a  then also write.
8ea0: 2a 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67  ** NULL into reg
8eb0: 69 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65  ister P3 and eve
8ec0: 72 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 62  ry register in b
8ed0: 65 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33  etween P2 and P3
8ee0: 2e 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c  .  If P3.** is l
8ef0: 65 73 73 20 74 68 61 6e 20 50 32 20 28 74 79 70  ess than P2 (typ
8f00: 69 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72  ically P3 is zer
8f10: 6f 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67  o) then only reg
8f20: 69 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73  ister P2 is.** s
8f30: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
8f40: 2a 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75  * If the P1 valu
8f50: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
8f60: 68 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65  hen also set the
8f70: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61   MEM_Cleared fla
8f80: 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c  g so that.** NUL
8f90: 4c 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f  L values will no
8fa0: 74 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  t compare equal 
8fb0: 65 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e  even if SQLITE_N
8fc0: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a  ULLEQ is set on.
8fd0: 2a 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45  ** OP_Ne or OP_E
8fe0: 71 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75  q..*/.case OP_Nu
8ff0: 6c 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ll: {           
9000: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
9010: 20 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c   cnt;.  u16 null
9020: 46 6c 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f  Flag;.  pOut = o
9030: 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
9040: 20 70 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70   pOp);.  cnt = p
9050: 4f 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a  Op->p3-pOp->p2;.
9060: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
9070: 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
9080: 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
9090: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
90a0: 75 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70  ullFlag = pOp->p
90b0: 31 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45  1 ? (MEM_Null|ME
90c0: 4d 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d  M_Cleared) : MEM
90d0: 5f 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e  _Null;.  pOut->n
90e0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63   = 0;.  while( c
90f0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74  nt>0 ){.    pOut
9100: 2b 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74  ++;.    memAbout
9110: 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
9120: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
9130: 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75  beMemSetNull(pOu
9140: 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c  t);.    pOut->fl
9150: 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a  ags = nullFlag;.
9160: 20 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b      pOut->n = 0;
9170: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a  .    cnt--;.  }.
9180: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9190: 70 63 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20  pcode: SoftNull 
91a0: 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  P1 * * * *.** Sy
91b0: 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55  nopsis: r[P1]=NU
91c0: 4c 4c 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67  LL.**.** Set reg
91d0: 69 73 74 65 72 20 50 31 20 74 6f 20 68 61 76 65  ister P1 to have
91e0: 20 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20   the value NULL 
91f0: 61 73 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f  as seen by the O
9200: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20  P_MakeRecord.** 
9210: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74  instruction, but
9220: 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79   do not free any
9230: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9240: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9250: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65  d with.** the re
9260: 67 69 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20  gister, so that 
9270: 69 66 20 74 68 65 20 76 61 6c 75 65 20 77 61 73  if the value was
9280: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f   a string or blo
9290: 62 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72  b that was.** pr
92a0: 65 76 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20  eviously copied 
92b0: 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20  using OP_SCopy, 
92c0: 74 68 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20  the copies will 
92d0: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76  continue to be v
92e0: 61 6c 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  alid..*/.case OP
92f0: 5f 53 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61  _SoftNull: {.  a
9300: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30  ssert( pOp->p1>0
9310: 20 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d   && pOp->p1<=(p-
9320: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
9330: 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20  rsor) );.  pOut 
9340: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
9350: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
9360: 3d 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 7c 4d  = (pOut->flags|M
9370: 45 4d 5f 4e 75 6c 6c 29 26 7e 4d 45 4d 5f 55 6e  EM_Null)&~MEM_Un
9380: 64 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b  defined;.  break
9390: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
93a0: 42 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20  Blob P1 P2 * P4 
93b0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
93c0: 5b 50 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29  [P2]=P4 (len=P1)
93d0: 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73  .**.** P4 points
93e0: 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61   to a blob of da
93f0: 74 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67  ta P1 bytes long
9400: 2e 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a  .  Store this.**
9410: 20 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65   blob in registe
9420: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
9430: 5f 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20  _Blob: {        
9440: 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
9450: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
9460: 2d 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  ->p1 <= SQLITE_M
9470: 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70  AX_LENGTH );.  p
9480: 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
9490: 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
94a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
94b0: 74 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e  tStr(pOut, pOp->
94c0: 70 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  p4.z, pOp->p1, 0
94d0: 2c 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e  , 0);.  pOut->en
94e0: 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20  c = encoding;.  
94f0: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
9500: 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65  IZE(pOut);.  bre
9510: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
9520: 3a 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32  : Variable P1 P2
9530: 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
9540: 73 69 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d  sis: r[P2]=param
9550: 65 74 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a  eter(P1,P4).**.*
9560: 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76  * Transfer the v
9570: 61 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70  alues of bound p
9580: 61 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f  arameter P1 into
9590: 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a   register P2.**.
95a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  ** If the parame
95b0: 74 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68  ter is named, th
95c0: 65 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65  en its name appe
95d0: 61 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68  ars in P4..** Th
95e0: 65 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73  e P4 value is us
95f0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69  ed by sqlite3_bi
9600: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
9610: 65 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  e()..*/.case OP_
9620: 56 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20  Variable: {     
9630: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
9640: 2f 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20  /.  Mem *pVar;  
9650: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65       /* Value be
9660: 69 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64 20  ing transferred 
9670: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
9680: 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p1>0 && pOp->
9690: 70 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20  p1<=p->nVar );. 
96a0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
96b0: 2e 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34  .z==0 || pOp->p4
96c0: 2e 7a 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74  .z==sqlite3VList
96d0: 4e 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c  NumToName(p->pVL
96e0: 69 73 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  ist,pOp->p1) );.
96f0: 20 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61    pVar = &p->aVa
9700: 72 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a  r[pOp->p1 - 1];.
9710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9720: 65 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29  eMemTooBig(pVar)
9730: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f   ){.    goto too
9740: 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74  _big;.  }.  pOut
9750: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
9760: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
9770: 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70  MemShallowCopy(p
9780: 4f 75 74 2c 20 70 56 61 72 2c 20 4d 45 4d 5f 53  Out, pVar, MEM_S
9790: 74 61 74 69 63 29 3b 0a 20 20 55 50 44 41 54 45  tatic);.  UPDATE
97a0: 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f  _MAX_BLOBSIZE(pO
97b0: 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ut);.  break;.}.
97c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 6f 76 65  ./* Opcode: Move
97d0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
97e0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40   Synopsis: r[P2@
97f0: 50 33 5d 3d 72 5b 50 31 40 50 33 5d 0a 2a 2a 0a  P3]=r[P1@P3].**.
9800: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 50 33 20 76  ** Move the P3 v
9810: 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65  alues in registe
9820: 72 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 6f 76  r P1..P1+P3-1 ov
9830: 65 72 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  er into.** regis
9840: 74 65 72 73 20 50 32 2e 2e 50 32 2b 50 33 2d 31  ters P2..P2+P3-1
9850: 2e 20 20 52 65 67 69 73 74 65 72 73 20 50 31 2e  .  Registers P1.
9860: 2e 50 31 2b 50 33 2d 31 20 61 72 65 0a 2a 2a 20  .P1+P3-1 are.** 
9870: 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 20 4e  left holding a N
9880: 55 4c 4c 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ULL.  It is an e
9890: 72 72 6f 72 20 66 6f 72 20 72 65 67 69 73 74 65  rror for registe
98a0: 72 20 72 61 6e 67 65 73 0a 2a 2a 20 50 31 2e 2e  r ranges.** P1..
98b0: 50 31 2b 50 33 2d 31 20 61 6e 64 20 50 32 2e 2e  P1+P3-1 and P2..
98c0: 50 32 2b 50 33 2d 31 20 74 6f 20 6f 76 65 72 6c  P2+P3-1 to overl
98d0: 61 70 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  ap.  It is an er
98e0: 72 6f 72 0a 2a 2a 20 66 6f 72 20 50 33 20 74 6f  ror.** for P3 to
98f0: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 31 2e   be less than 1.
9900: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 6f 76 65  .*/.case OP_Move
9910: 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20  : {.  int n;    
9920: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9930: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 6c 65   of registers le
9940: 66 74 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  ft to copy */.  
9950: 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20  int p1;         
9960: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20   /* Register to 
9970: 63 6f 70 79 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  copy from */.  i
9980: 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20 20  nt p2;          
9990: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 63  /* Register to c
99a0: 6f 70 79 20 74 6f 20 2a 2f 0a 0a 20 20 6e 20 3d  opy to */..  n =
99b0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 31 20 3d   pOp->p3;.  p1 =
99c0: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
99d0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65   pOp->p2;.  asse
99e0: 72 74 28 20 6e 3e 30 20 26 26 20 70 31 3e 30 20  rt( n>0 && p1>0 
99f0: 26 26 20 70 32 3e 30 20 29 3b 0a 20 20 61 73 73  && p2>0 );.  ass
9a00: 65 72 74 28 20 70 31 2b 6e 3c 3d 70 32 20 7c 7c  ert( p1+n<=p2 ||
9a10: 20 70 32 2b 6e 3c 3d 70 31 20 29 3b 0a 0a 20 20   p2+n<=p1 );..  
9a20: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 31 5d  pIn1 = &aMem[p1]
9a30: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
9a40: 5b 70 32 5d 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  [p2];.  do{.    
9a50: 61 73 73 65 72 74 28 20 70 4f 75 74 3c 3d 26 61  assert( pOut<=&a
9a60: 4d 65 6d 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  Mem[(p->nMem+1 -
9a70: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b   p->nCursor)] );
9a80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
9a90: 31 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e 4d 65  1<=&aMem[(p->nMe
9aa0: 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72  m+1 - p->nCursor
9ab0: 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  )] );.    assert
9ac0: 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e  ( memIsValid(pIn
9ad0: 31 29 20 29 3b 0a 20 20 20 20 6d 65 6d 41 62 6f  1) );.    memAbo
9ae0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
9af0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
9b00: 56 64 62 65 4d 65 6d 4d 6f 76 65 28 70 4f 75 74  VdbeMemMove(pOut
9b10: 2c 20 70 49 6e 31 29 3b 0a 23 69 66 64 65 66 20  , pIn1);.#ifdef 
9b20: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9b30: 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f 70   if( pOut->pScop
9b40: 79 46 72 6f 6d 3e 3d 26 61 4d 65 6d 5b 70 31 5d  yFrom>=&aMem[p1]
9b50: 20 26 26 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79   && pOut->pScopy
9b60: 46 72 6f 6d 3c 70 4f 75 74 20 29 7b 0a 20 20 20  From<pOut ){.   
9b70: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
9b80: 72 6f 6d 20 2b 3d 20 70 4f 70 2d 3e 70 32 20 2d  rom += pOp->p2 -
9b90: 20 70 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   p1;.    }.#endi
9ba0: 66 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61  f.    Deephemera
9bb0: 6c 69 7a 65 28 70 4f 75 74 29 3b 0a 20 20 20 20  lize(pOut);.    
9bc0: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
9bd0: 32 2b 2b 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  2++, pOut);.    
9be0: 70 49 6e 31 2b 2b 3b 0a 20 20 20 20 70 4f 75 74  pIn1++;.    pOut
9bf0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 2d 2d  ++;.  }while( --
9c00: 6e 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  n );.  break;.}.
9c10: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 70 79  ./* Opcode: Copy
9c20: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
9c30: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 40   Synopsis: r[P2@
9c40: 50 33 2b 31 5d 3d 72 5b 50 31 40 50 33 2b 31 5d  P3+1]=r[P1@P3+1]
9c50: 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  .**.** Make a co
9c60: 70 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  py of registers 
9c70: 50 31 2e 2e 50 31 2b 50 33 20 69 6e 74 6f 20 72  P1..P1+P3 into r
9c80: 65 67 69 73 74 65 72 73 20 50 32 2e 2e 50 32 2b  egisters P2..P2+
9c90: 50 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  P3..**.** This i
9ca0: 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61 6b 65 73  nstruction makes
9cb0: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
9cc0: 74 68 65 20 76 61 6c 75 65 2e 20 20 41 20 64 75  the value.  A du
9cd0: 70 6c 69 63 61 74 65 0a 2a 2a 20 69 73 20 6d 61  plicate.** is ma
9ce0: 64 65 20 6f 66 20 61 6e 79 20 73 74 72 69 6e 67  de of any string
9cf0: 20 6f 72 20 62 6c 6f 62 20 63 6f 6e 73 74 61 6e   or blob constan
9d00: 74 2e 20 20 53 65 65 20 61 6c 73 6f 20 4f 50 5f  t.  See also OP_
9d10: 53 43 6f 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f  SCopy..*/.case O
9d20: 50 5f 43 6f 70 79 3a 20 7b 0a 20 20 69 6e 74 20  P_Copy: {.  int 
9d30: 6e 3b 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70  n;..  n = pOp->p
9d40: 33 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  3;.  pIn1 = &aMe
9d50: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f  m[pOp->p1];.  pO
9d60: 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ut = &aMem[pOp->
9d70: 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
9d80: 4f 75 74 21 3d 70 49 6e 31 20 29 3b 0a 20 20 77  Out!=pIn1 );.  w
9d90: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 73  hile( 1 ){.    s
9da0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
9db0: 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74 2c 20 70  llowCopy(pOut, p
9dc0: 49 6e 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  In1, MEM_Ephem);
9dd0: 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
9de0: 69 7a 65 28 70 4f 75 74 29 3b 0a 23 69 66 64 65  ize(pOut);.#ifde
9df0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9e00: 20 20 20 70 4f 75 74 2d 3e 70 53 63 6f 70 79 46     pOut->pScopyF
9e10: 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  rom = 0;.#endif.
9e20: 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
9e30: 43 45 28 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  CE(pOp->p2+pOp->
9e40: 70 33 2d 6e 2c 20 70 4f 75 74 29 3b 0a 20 20 20  p3-n, pOut);.   
9e50: 20 69 66 28 20 28 6e 2d 2d 29 3d 3d 30 20 29 20   if( (n--)==0 ) 
9e60: 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 75 74 2b  break;.    pOut+
9e70: 2b 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  +;.    pIn1++;. 
9e80: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
9e90: 2a 20 4f 70 63 6f 64 65 3a 20 53 43 6f 70 79 20  * Opcode: SCopy 
9ea0: 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
9eb0: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72  ynopsis: r[P2]=r
9ec0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65 20  [P1].**.** Make 
9ed0: 61 20 73 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f  a shallow copy o
9ee0: 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  f register P1 in
9ef0: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
9f00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
9f10: 75 63 74 69 6f 6e 20 6d 61 6b 65 73 20 61 20 73  uction makes a s
9f20: 68 61 6c 6c 6f 77 20 63 6f 70 79 20 6f 66 20 74  hallow copy of t
9f30: 68 65 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  he value.  If th
9f40: 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 61 20  e value.** is a 
9f50: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 2c 20  string or blob, 
9f60: 74 68 65 6e 20 74 68 65 20 63 6f 70 79 20 69 73  then the copy is
9f70: 20 6f 6e 6c 79 20 61 20 70 6f 69 6e 74 65 72 20   only a pointer 
9f80: 74 6f 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  to the.** origin
9f90: 61 6c 20 61 6e 64 20 68 65 6e 63 65 20 69 66 20  al and hence if 
9fa0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61  the original cha
9fb0: 6e 67 65 73 20 73 6f 20 77 69 6c 6c 20 74 68 65  nges so will the
9fc0: 20 63 6f 70 79 2e 0a 2a 2a 20 57 6f 72 73 65 2c   copy..** Worse,
9fd0: 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   if the original
9fe0: 20 69 73 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   is deallocated,
9ff0: 20 74 68 65 20 63 6f 70 79 20 62 65 63 6f 6d 65   the copy become
a000: 73 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 20 54 68  s invalid..** Th
a010: 75 73 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6d  us the program m
a020: 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
a030: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
a040: 77 69 6c 6c 20 6e 6f 74 20 63 68 61 6e 67 65 0a  will not change.
a050: 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 6c 69  ** during the li
a060: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f  fetime of the co
a070: 70 79 2e 20 20 55 73 65 20 4f 50 5f 43 6f 70 79  py.  Use OP_Copy
a080: 20 74 6f 20 6d 61 6b 65 20 61 20 63 6f 6d 70 6c   to make a compl
a090: 65 74 65 0a 2a 2a 20 63 6f 70 79 2e 0a 2a 2f 0a  ete.** copy..*/.
a0a0: 63 61 73 65 20 4f 50 5f 53 43 6f 70 79 3a 20 7b  case OP_SCopy: {
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f              /* o
a0c0: 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  ut2 */.  pIn1 = 
a0d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
a0e0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
a0f0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
a100: 74 28 20 70 4f 75 74 21 3d 70 49 6e 31 20 29 3b  t( pOut!=pIn1 );
a110: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
a120: 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75  mShallowCopy(pOu
a130: 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f 45 70 68  t, pIn1, MEM_Eph
a140: 65 6d 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  em);.#ifdef SQLI
a150: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
a160: 4f 75 74 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3d  Out->pScopyFrom=
a170: 3d 30 20 29 20 70 4f 75 74 2d 3e 70 53 63 6f 70  =0 ) pOut->pScop
a180: 79 46 72 6f 6d 20 3d 20 70 49 6e 31 3b 0a 23 65  yFrom = pIn1;.#e
a190: 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ndif.  break;.}.
a1a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 43  ./* Opcode: IntC
a1b0: 6f 70 79 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  opy P1 P2 * * *.
a1c0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
a1d0: 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54  2]=r[P1].**.** T
a1e0: 72 61 6e 73 66 65 72 20 74 68 65 20 69 6e 74 65  ransfer the inte
a1f0: 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20 69  ger value held i
a200: 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 6e  n register P1 in
a210: 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
a220: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
a230: 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
a240: 6f 6e 20 6f 66 20 53 43 6f 70 79 20 74 68 61 74  on of SCopy that
a250: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
a260: 69 6e 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65  integer.** value
a270: 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  s..*/.case OP_In
a280: 74 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20  tCopy: {        
a290: 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
a2a0: 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
a2b0: 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
a2c0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
a2d0: 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a   MEM_Int)!=0 );.
a2e0: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
a2f0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74  Op->p2];.  sqlit
a300: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
a310: 34 28 70 4f 75 74 2c 20 70 49 6e 31 2d 3e 75 2e  4(pOut, pIn1->u.
a320: 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  i);.  break;.}..
a330: 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 75 6c  /* Opcode: Resul
a340: 74 52 6f 77 20 50 31 20 50 32 20 2a 20 2a 20 2a  tRow P1 P2 * * *
a350: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6f 75  .** Synopsis: ou
a360: 74 70 75 74 3d 72 5b 50 31 40 50 32 5d 0a 2a 2a  tput=r[P1@P2].**
a370: 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65 72  .** The register
a380: 73 20 50 31 20 74 68 72 6f 75 67 68 20 50 31 2b  s P1 through P1+
a390: 50 32 2d 31 20 63 6f 6e 74 61 69 6e 20 61 20 73  P2-1 contain a s
a3a0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 0a 2a 2a 20  ingle row of.** 
a3b0: 72 65 73 75 6c 74 73 2e 20 54 68 69 73 20 6f 70  results. This op
a3c0: 63 6f 64 65 20 63 61 75 73 65 73 20 74 68 65 20  code causes the 
a3d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
a3e0: 61 6c 6c 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  all to terminate
a3f0: 0a 2a 2a 20 77 69 74 68 20 61 6e 20 53 51 4c 49  .** with an SQLI
a400: 54 45 5f 52 4f 57 20 72 65 74 75 72 6e 20 63 6f  TE_ROW return co
a410: 64 65 20 61 6e 64 20 69 74 20 73 65 74 73 20 75  de and it sets u
a420: 70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 74  p the sqlite3_st
a430: 6d 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  mt.** structure 
a440: 74 6f 20 70 72 6f 76 69 64 65 20 61 63 63 65 73  to provide acces
a450: 73 20 74 6f 20 74 68 65 20 72 28 50 31 29 2e 2e  s to the r(P1)..
a460: 72 28 50 31 2b 50 32 2d 31 29 20 76 61 6c 75 65  r(P1+P2-1) value
a470: 73 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  s as.** the resu
a480: 6c 74 20 72 6f 77 2e 0a 2a 2f 0a 63 61 73 65 20  lt row..*/.case 
a490: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 3a 20 7b 0a  OP_ResultRow: {.
a4a0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69    Mem *pMem;.  i
a4b0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
a4c0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 3d 3d 70  p->nResColumn==p
a4d0: 4f 70 2d 3e 70 32 20 29 3b 0a 20 20 61 73 73 65  Op->p2 );.  asse
a4e0: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b  rt( pOp->p1>0 );
a4f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a500: 70 31 2b 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  p1+pOp->p2<=(p->
a510: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
a520: 73 6f 72 29 2b 31 20 29 3b 0a 0a 23 69 66 6e 64  sor)+1 );..#ifnd
a530: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
a540: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
a550: 0a 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 70 72  .  /* Run the pr
a560: 6f 67 72 65 73 73 20 63 6f 75 6e 74 65 72 20 6a  ogress counter j
a570: 75 73 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  ust before retur
a580: 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ning..  */.  if(
a590: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21 3d   db->xProgress!=
a5a0: 30 0a 20 20 20 26 26 20 6e 56 6d 53 74 65 70 3e  0.   && nVmStep>
a5b0: 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 0a  =nProgressLimit.
a5c0: 20 20 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72     && db->xProgr
a5d0: 65 73 73 28 64 62 2d 3e 70 50 72 6f 67 72 65 73  ess(db->pProgres
a5e0: 73 41 72 67 29 21 3d 30 0a 20 20 29 7b 0a 20 20  sArg)!=0.  ){.  
a5f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e    rc = SQLITE_IN
a600: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74  TERRUPT;.    got
a610: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
a620: 72 72 6f 72 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rror;.  }.#endif
a630: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73  ..  /* If this s
a640: 74 61 74 65 6d 65 6e 74 20 68 61 73 20 76 69 6f  tatement has vio
a650: 6c 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 20  lated immediate 
a660: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
a670: 74 72 61 69 6e 74 73 2c 20 64 6f 0a 20 20 2a 2a  traints, do.  **
a680: 20 6e 6f 74 20 72 65 74 75 72 6e 20 74 68 65 20   not return the 
a690: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6d  number of rows m
a6a0: 6f 64 69 66 69 65 64 2e 20 41 6e 64 20 64 6f 20  odified. And do 
a6b0: 6e 6f 74 20 52 45 4c 45 41 53 45 20 74 68 65 20  not RELEASE the 
a6c0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
a6d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 6e  ransaction. It n
a6e0: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
a6f0: 64 20 62 61 63 6b 2e 20 20 2a 2f 0a 20 20 69 66  d back.  */.  if
a700: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
a710: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
a720: 65 63 6b 46 6b 28 70 2c 20 30 29 29 20 29 7b 0a  eckFk(p, 0)) ){.
a730: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
a740: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
a750: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 20 20 61 73  ntRows );.    as
a760: 73 65 72 74 28 20 70 2d 3e 75 73 65 73 53 74 6d  sert( p->usesStm
a770: 74 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  tJournal );.    
a780: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
a790: 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20  o_error;.  }..  
a7a0: 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
a7b0: 5f 43 6f 75 6e 74 52 6f 77 73 20 66 6c 61 67 20  _CountRows flag 
a7c0: 69 73 20 73 65 74 20 69 6e 20 73 71 6c 69 74 65  is set in sqlite
a7d0: 33 2e 66 6c 61 67 73 20 6d 61 73 6b 2c 20 74 68  3.flags mask, th
a7e0: 65 6e 20 0a 20 20 2a 2a 20 44 4d 4c 20 73 74 61  en .  ** DML sta
a7f0: 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6b 65 20 74  tements invoke t
a800: 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 72 65  his opcode to re
a810: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
a820: 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 6d 6f  of rows .  ** mo
a830: 64 69 66 69 65 64 20 74 6f 20 74 68 65 20 75 73  dified to the us
a840: 65 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  er. This is the 
a850: 6f 6e 6c 79 20 77 61 79 20 74 68 61 74 20 61 20  only way that a 
a860: 56 4d 20 74 68 61 74 0a 20 20 2a 2a 20 6f 70 65  VM that.  ** ope
a870: 6e 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  ns a statement t
a880: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 69  ransaction may i
a890: 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64  nvoke this opcod
a8a0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  e..  **.  ** In 
a8b0: 63 61 73 65 20 74 68 69 73 20 69 73 20 73 75 63  case this is suc
a8c0: 68 20 61 20 73 74 61 74 65 6d 65 6e 74 2c 20 63  h a statement, c
a8d0: 6c 6f 73 65 20 61 6e 79 20 73 74 61 74 65 6d 65  lose any stateme
a8e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
a8f0: 20 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 74 68   ** opened by th
a900: 69 73 20 56 4d 20 62 65 66 6f 72 65 20 72 65 74  is VM before ret
a910: 75 72 6e 69 6e 67 20 63 6f 6e 74 72 6f 6c 20 74  urning control t
a920: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
a930: 20 69 73 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75   is to.  ** ensu
a940: 72 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  re that statemen
a950: 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  t-transactions a
a960: 72 65 20 61 6c 77 61 79 73 20 6e 65 73 74 65 64  re always nested
a970: 2c 20 6e 6f 74 20 6f 76 65 72 6c 61 70 70 69 6e  , not overlappin
a980: 67 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  g..  ** If the o
a990: 70 65 6e 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  pen statement-tr
a9a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
a9b0: 20 63 6c 6f 73 65 64 20 68 65 72 65 2c 20 74 68   closed here, th
a9c0: 65 6e 20 74 68 65 20 75 73 65 72 0a 20 20 2a 2a  en the user.  **
a9d0: 20 6d 61 79 20 73 74 65 70 20 61 6e 6f 74 68 65   may step anothe
a9e0: 72 20 56 4d 20 74 68 61 74 20 6f 70 65 6e 73 20  r VM that opens 
a9f0: 69 74 73 20 6f 77 6e 20 73 74 61 74 65 6d 65 6e  its own statemen
aa00: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  t transaction. T
aa10: 68 69 73 0a 20 20 2a 2a 20 6d 61 79 20 6c 65 61  his.  ** may lea
aa20: 64 20 74 6f 20 6f 76 65 72 6c 61 70 70 69 6e 67  d to overlapping
aa30: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
aa40: 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20  actions..  **.  
aa50: 2a 2a 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  ** The statement
aa60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
aa70: 6e 65 76 65 72 20 61 20 74 6f 70 2d 6c 65 76 65  never a top-leve
aa80: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  l transaction.  
aa90: 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 52  Hence.  ** the R
aaa0: 45 4c 45 41 53 45 20 63 61 6c 6c 20 62 65 6c 6f  ELEASE call belo
aab0: 77 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  w can never fail
aac0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
aad0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
aae0: 30 20 7c 7c 20 64 62 2d 3e 66 6c 61 67 73 26 53  0 || db->flags&S
aaf0: 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20  QLITE_CountRows 
ab00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ab10: 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
ab20: 65 6e 74 28 70 2c 20 53 41 56 45 50 4f 49 4e 54  ent(p, SAVEPOINT
ab30: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 61 73 73  _RELEASE);.  ass
ab40: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
ab50: 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 61  OK );..  /* Inva
ab60: 6c 69 64 61 74 65 20 61 6c 6c 20 65 70 68 65 6d  lidate all ephem
ab70: 65 72 61 6c 20 63 75 72 73 6f 72 20 72 6f 77 20  eral cursor row 
ab80: 63 61 63 68 65 73 20 2a 2f 0a 20 20 70 2d 3e 63  caches */.  p->c
ab90: 61 63 68 65 43 74 72 20 3d 20 28 70 2d 3e 63 61  acheCtr = (p->ca
aba0: 63 68 65 43 74 72 20 2b 20 32 29 7c 31 3b 0a 0a  cheCtr + 2)|1;..
abb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
abc0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
abd0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 61 72  e current row ar
abe0: 65 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  e \000 terminate
abf0: 64 0a 20 20 2a 2a 20 61 6e 64 20 68 61 76 65 20  d.  ** and have 
ac00: 61 6e 20 61 73 73 69 67 6e 65 64 20 74 79 70 65  an assigned type
ac10: 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
ac20: 72 65 20 64 65 2d 65 70 68 65 6d 65 72 61 6c 69  re de-ephemerali
ac30: 7a 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 73 69  zed as.  ** a si
ac40: 64 65 20 65 66 66 65 63 74 2e 0a 20 20 2a 2f 0a  de effect..  */.
ac50: 20 20 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73    pMem = p->pRes
ac60: 75 6c 74 53 65 74 20 3d 20 26 61 4d 65 6d 5b 70  ultSet = &aMem[p
ac70: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 66 6f 72 28 69  Op->p1];.  for(i
ac80: 3d 30 3b 20 69 3c 70 4f 70 2d 3e 70 32 3b 20 69  =0; i<pOp->p2; i
ac90: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
aca0: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 70 4d 65   memIsValid(&pMe
acb0: 6d 5b 69 5d 29 20 29 3b 0a 20 20 20 20 44 65 65  m[i]) );.    Dee
acc0: 70 68 65 6d 65 72 61 6c 69 7a 65 28 26 70 4d 65  phemeralize(&pMe
acd0: 6d 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  m[i]);.    asser
ace0: 74 28 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67  t( (pMem[i].flag
acf0: 73 20 26 20 4d 45 4d 5f 45 70 68 65 6d 29 3d 3d  s & MEM_Ephem)==
ad00: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
ad10: 20 28 70 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 20   (pMem[i].flags 
ad20: 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  & (MEM_Str|MEM_B
ad30: 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  lob))==0 );.    
ad40: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4e 75  sqlite3VdbeMemNu
ad50: 6c 54 65 72 6d 69 6e 61 74 65 28 26 70 4d 65 6d  lTerminate(&pMem
ad60: 5b 69 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54  [i]);.    REGIST
ad70: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 31  ER_TRACE(pOp->p1
ad80: 2b 69 2c 20 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  +i, &pMem[i]);. 
ad90: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
ada0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
adb0: 20 6e 6f 5f 6d 65 6d 3b 0a 0a 20 20 69 66 28 20   no_mem;..  if( 
adc0: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
add0: 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 20 29 7b  ITE_TRACE_ROW ){
ade0: 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65 28  .    db->xTrace(
adf0: 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57  SQLITE_TRACE_ROW
ae00: 2c 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c  , db->pTraceArg,
ae10: 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   p, 0);.  }..  /
ae20: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
ae30: 52 4f 57 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 63  ROW.  */.  p->pc
ae40: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
ae50: 4f 70 29 20 2b 20 31 3b 0a 20 20 72 63 20 3d 20  Op) + 1;.  rc = 
ae60: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 67 6f  SQLITE_ROW;.  go
ae70: 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
ae80: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f  }../* Opcode: Co
ae90: 6e 63 61 74 20 50 31 20 50 32 20 50 33 20 2a 20  ncat P1 P2 P3 * 
aea0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
aeb0: 5b 50 33 5d 3d 72 5b 50 32 5d 2b 72 5b 50 31 5d  [P3]=r[P2]+r[P1]
aec0: 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  .**.** Add the t
aed0: 65 78 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ext in register 
aee0: 50 31 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  P1 onto the end 
aef0: 6f 66 20 74 68 65 20 74 65 78 74 20 69 6e 0a 2a  of the text in.*
af00: 2a 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e  * register P2 an
af10: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
af20: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
af30: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
af40: 74 68 65 20 50 31 20 6f 72 20 50 32 20 74 65 78  the P1 or P2 tex
af50: 74 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20  t are NULL then 
af60: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 50 33  store NULL in P3
af70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 33 20 3d 20 50  ..**.**   P3 = P
af80: 32 20 7c 7c 20 50 31 0a 2a 2a 0a 2a 2a 20 49 74  2 || P1.**.** It
af90: 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   is illegal for 
afa0: 50 31 20 61 6e 64 20 50 33 20 74 6f 20 62 65 20  P1 and P3 to be 
afb0: 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74 65  the same registe
afc0: 72 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 0a 2a 2a  r. Sometimes,.**
afd0: 20 69 66 20 50 33 20 69 73 20 74 68 65 20 73 61   if P3 is the sa
afe0: 6d 65 20 72 65 67 69 73 74 65 72 20 61 73 20 50  me register as P
aff0: 32 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  2, the implement
b000: 61 74 69 6f 6e 20 69 73 20 61 62 6c 65 0a 2a 2a  ation is able.**
b010: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 63   to avoid a memc
b020: 70 79 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  py()..*/.case OP
b030: 5f 43 6f 6e 63 61 74 3a 20 7b 20 20 20 20 20 20  _Concat: {      
b040: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
b050: 54 4b 5f 43 4f 4e 43 41 54 2c 20 69 6e 31 2c 20  TK_CONCAT, in1, 
b060: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in2, out3 */.  i
b070: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 70 49 6e  64 nByte;..  pIn
b080: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
b090: 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1];.  pIn2 = &aM
b0a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70  em[pOp->p2];.  p
b0b0: 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
b0c0: 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p3];.  assert( 
b0d0: 70 49 6e 31 21 3d 70 4f 75 74 20 29 3b 0a 20 20  pIn1!=pOut );.  
b0e0: 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  if( (pIn1->flags
b0f0: 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29 20   | pIn2->flags) 
b100: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
b110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
b120: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
b130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b140: 69 66 28 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  if( ExpandBlob(p
b150: 49 6e 31 29 20 7c 7c 20 45 78 70 61 6e 64 42 6c  In1) || ExpandBl
b160: 6f 62 28 70 49 6e 32 29 20 29 20 67 6f 74 6f 20  ob(pIn2) ) goto 
b170: 6e 6f 5f 6d 65 6d 3b 0a 20 20 53 74 72 69 6e 67  no_mem;.  String
b180: 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ify(pIn1, encodi
b190: 6e 67 29 3b 0a 20 20 53 74 72 69 6e 67 69 66 79  ng);.  Stringify
b1a0: 28 70 49 6e 32 2c 20 65 6e 63 6f 64 69 6e 67 29  (pIn2, encoding)
b1b0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 70 49 6e 31  ;.  nByte = pIn1
b1c0: 2d 3e 6e 20 2b 20 70 49 6e 32 2d 3e 6e 3b 0a 20  ->n + pIn2->n;. 
b1d0: 20 69 66 28 20 6e 42 79 74 65 3e 64 62 2d 3e 61   if( nByte>db->a
b1e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
b1f0: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
b200: 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
b210: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
b220: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4f 75  3VdbeMemGrow(pOu
b230: 74 2c 20 28 69 6e 74 29 6e 42 79 74 65 2b 32 2c  t, (int)nByte+2,
b240: 20 70 4f 75 74 3d 3d 70 49 6e 32 29 20 29 7b 0a   pOut==pIn2) ){.
b250: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
b260: 0a 20 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70  .  }.  MemSetTyp
b270: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
b280: 53 74 72 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  Str);.  if( pOut
b290: 21 3d 70 49 6e 32 20 29 7b 0a 20 20 20 20 6d 65  !=pIn2 ){.    me
b2a0: 6d 63 70 79 28 70 4f 75 74 2d 3e 7a 2c 20 70 49  mcpy(pOut->z, pI
b2b0: 6e 32 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 6e 29 3b  n2->z, pIn2->n);
b2c0: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
b2d0: 4f 75 74 2d 3e 7a 5b 70 49 6e 32 2d 3e 6e 5d 2c  Out->z[pIn2->n],
b2e0: 20 70 49 6e 31 2d 3e 7a 2c 20 70 49 6e 31 2d 3e   pIn1->z, pIn1->
b2f0: 6e 29 3b 0a 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42  n);.  pOut->z[nB
b300: 79 74 65 5d 3d 30 3b 0a 20 20 70 4f 75 74 2d 3e  yte]=0;.  pOut->
b310: 7a 5b 6e 42 79 74 65 2b 31 5d 20 3d 20 30 3b 0a  z[nByte+1] = 0;.
b320: 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 7c 3d    pOut->flags |=
b330: 20 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f 75   MEM_Term;.  pOu
b340: 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74  t->n = (int)nByt
b350: 65 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d  e;.  pOut->enc =
b360: 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44   encoding;.  UPD
b370: 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45  ATE_MAX_BLOBSIZE
b380: 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b  (pOut);.  break;
b390: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41  .}../* Opcode: A
b3a0: 64 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  dd P1 P2 P3 * *.
b3b0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
b3c0: 33 5d 3d 72 5b 50 31 5d 2b 72 5b 50 32 5d 0a 2a  3]=r[P1]+r[P2].*
b3d0: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 76 61 6c  *.** Add the val
b3e0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
b3f0: 31 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  1 to the value i
b400: 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  n register P2.**
b410: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b420: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b430: 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68  r P3..** If eith
b440: 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c  er input is NULL
b450: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  , the result is 
b460: 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  NULL..*/./* Opco
b470: 64 65 3a 20 4d 75 6c 74 69 70 6c 79 20 50 31 20  de: Multiply P1 
b480: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b490: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b4a0: 31 5d 2a 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 0a 2a  1]*r[P2].**.**.*
b4b0: 2a 20 4d 75 6c 74 69 70 6c 79 20 74 68 65 20 76  * Multiply the v
b4c0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b4d0: 20 50 31 20 62 79 20 74 68 65 20 76 61 6c 75 65   P1 by the value
b4e0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a   in register P2.
b4f0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
b500: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
b510: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
b520: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
b530: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
b540: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
b550: 63 6f 64 65 3a 20 53 75 62 74 72 61 63 74 20 50  code: Subtract P
b560: 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
b570: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
b580: 5b 50 32 5d 2d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  [P2]-r[P1].**.**
b590: 20 53 75 62 74 72 61 63 74 20 74 68 65 20 76 61   Subtract the va
b5a0: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b5b0: 50 31 20 66 72 6f 6d 20 74 68 65 20 76 61 6c 75  P1 from the valu
b5c0: 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  e in register P2
b5d0: 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
b5e0: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
b5f0: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
b600: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
b610: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b620: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
b630: 70 63 6f 64 65 3a 20 44 69 76 69 64 65 20 50 31  pcode: Divide P1
b640: 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
b650: 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b  nopsis: r[P3]=r[
b660: 50 32 5d 2f 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P2]/r[P1].**.** 
b670: 44 69 76 69 64 65 20 74 68 65 20 76 61 6c 75 65  Divide the value
b680: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
b690: 62 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  by the value in 
b6a0: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 20 61  register P2.** a
b6b0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
b6c0: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
b6d0: 50 33 20 28 50 33 3d 50 32 2f 50 31 29 2e 20 49  P3 (P3=P2/P1). I
b6e0: 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 0a  f the value in .
b6f0: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 69  ** register P1 i
b700: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
b710: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b720: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b730: 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   is .** NULL, th
b740: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b750: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
b760: 52 65 6d 61 69 6e 64 65 72 20 50 31 20 50 32 20  Remainder P1 P2 
b770: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b780: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 25  is: r[P3]=r[P2]%
b790: 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  r[P1].**.** Comp
b7a0: 75 74 65 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ute the remainde
b7b0: 72 20 61 66 74 65 72 20 69 6e 74 65 67 65 72 20  r after integer 
b7c0: 72 65 67 69 73 74 65 72 20 50 32 20 69 73 20 64  register P2 is d
b7d0: 69 76 69 64 65 64 20 62 79 20 0a 2a 2a 20 72 65  ivided by .** re
b7e0: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 73 74  gister P1 and st
b7f0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b800: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 0a  n register P3. .
b810: 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ** If the value 
b820: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
b830: 73 20 7a 65 72 6f 20 74 68 65 20 72 65 73 75 6c  s zero the resul
b840: 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 66  t is NULL..** If
b850: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
b860: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b870: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b880: 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20 20  case OP_Add:    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8a0: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 50 4c 55  * same as TK_PLU
b8b0: 53 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  S, in1, in2, out
b8c0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 75 62  3 */.case OP_Sub
b8d0: 74 72 61 63 74 3a 20 20 20 20 20 20 20 20 20 20  tract:          
b8e0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
b8f0: 4b 5f 4d 49 4e 55 53 2c 20 69 6e 31 2c 20 69 6e  K_MINUS, in1, in
b900: 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20  2, out3 */.case 
b910: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20  OP_Multiply:    
b920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
b930: 65 20 61 73 20 54 4b 5f 53 54 41 52 2c 20 69 6e  e as TK_STAR, in
b940: 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a  1, in2, out3 */.
b950: 63 61 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20  case OP_Divide: 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b970: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53 4c 41  * same as TK_SLA
b980: 53 48 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75  SH, in1, in2, ou
b990: 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  t3 */.case OP_Re
b9a0: 6d 61 69 6e 64 65 72 3a 20 7b 20 20 20 20 20 20  mainder: {      
b9b0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
b9c0: 54 4b 5f 52 45 4d 2c 20 69 6e 31 2c 20 69 6e 32  TK_REM, in1, in2
b9d0: 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 63 68 61 72  , out3 */.  char
b9e0: 20 62 49 6e 74 69 6e 74 3b 20 20 20 2f 2a 20 53   bIntint;   /* S
b9f0: 74 61 72 74 65 64 20 6f 75 74 20 61 73 20 74 77  tarted out as tw
ba00: 6f 20 69 6e 74 65 67 65 72 20 6f 70 65 72 61 6e  o integer operan
ba10: 64 73 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67  ds */.  u16 flag
ba20: 73 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69  s;      /* Combi
ba30: 6e 65 64 20 4d 45 4d 5f 2a 20 66 6c 61 67 73 20  ned MEM_* flags 
ba40: 66 72 6f 6d 20 62 6f 74 68 20 69 6e 70 75 74 73  from both inputs
ba50: 20 2a 2f 0a 20 20 75 31 36 20 74 79 70 65 31 3b   */.  u16 type1;
ba60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63        /* Numeric
ba70: 20 74 79 70 65 20 6f 66 20 6c 65 66 74 20 6f 70   type of left op
ba80: 65 72 61 6e 64 20 2a 2f 0a 20 20 75 31 36 20 74  erand */.  u16 t
ba90: 79 70 65 32 3b 20 20 20 20 20 20 2f 2a 20 4e 75  ype2;      /* Nu
baa0: 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20 72 69  meric type of ri
bab0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
bac0: 20 69 36 34 20 69 41 3b 20 20 20 20 20 20 20 20   i64 iA;        
bad0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
bae0: 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61 6e  e of left operan
baf0: 64 20 2a 2f 0a 20 20 69 36 34 20 69 42 3b 20 20  d */.  i64 iB;  
bb00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
bb10: 72 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74  r value of right
bb20: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 64 6f   operand */.  do
bb30: 75 62 6c 65 20 72 41 3b 20 20 20 20 20 20 2f 2a  uble rA;      /*
bb40: 20 52 65 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c   Real value of l
bb50: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
bb60: 20 64 6f 75 62 6c 65 20 72 42 3b 20 20 20 20 20   double rB;     
bb70: 20 2f 2a 20 52 65 61 6c 20 76 61 6c 75 65 20 6f   /* Real value o
bb80: 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  f right operand 
bb90: 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  */..  pIn1 = &aM
bba0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 74  em[pOp->p1];.  t
bbb0: 79 70 65 31 20 3d 20 6e 75 6d 65 72 69 63 54 79  ype1 = numericTy
bbc0: 70 65 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 32  pe(pIn1);.  pIn2
bbd0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
bbe0: 5d 3b 0a 20 20 74 79 70 65 32 20 3d 20 6e 75 6d  ];.  type2 = num
bbf0: 65 72 69 63 54 79 70 65 28 70 49 6e 32 29 3b 0a  ericType(pIn2);.
bc00: 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70    pOut = &aMem[p
bc10: 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73  Op->p3];.  flags
bc20: 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 7c   = pIn1->flags |
bc30: 20 70 49 6e 32 2d 3e 66 6c 61 67 73 3b 0a 20 20   pIn2->flags;.  
bc40: 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
bc50: 5f 4e 75 6c 6c 29 21 3d 30 20 29 20 67 6f 74 6f  _Null)!=0 ) goto
bc60: 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75   arithmetic_resu
bc70: 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 69 66  lt_is_null;.  if
bc80: 28 20 28 74 79 70 65 31 20 26 20 74 79 70 65 32  ( (type1 & type2
bc90: 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
bca0: 7b 0a 20 20 20 20 69 41 20 3d 20 70 49 6e 31 2d  {.    iA = pIn1-
bcb0: 3e 75 2e 69 3b 0a 20 20 20 20 69 42 20 3d 20 70  >u.i;.    iB = p
bcc0: 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 62 49  In2->u.i;.    bI
bcd0: 6e 74 69 6e 74 20 3d 20 31 3b 0a 20 20 20 20 73  ntint = 1;.    s
bce0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
bcf0: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  de ){.      case
bd00: 20 4f 50 5f 41 64 64 3a 20 20 20 20 20 20 20 69   OP_Add:       i
bd10: 66 28 20 73 71 6c 69 74 65 33 41 64 64 49 6e 74  f( sqlite3AddInt
bd20: 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f 74  64(&iB,iA) ) got
bd30: 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65 61  o fp_math;  brea
bd40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
bd50: 5f 53 75 62 74 72 61 63 74 3a 20 20 69 66 28 20  _Subtract:  if( 
bd60: 73 71 6c 69 74 65 33 53 75 62 49 6e 74 36 34 28  sqlite3SubInt64(
bd70: 26 69 42 2c 69 41 29 20 29 20 67 6f 74 6f 20 66  &iB,iA) ) goto f
bd80: 70 5f 6d 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a  p_math;  break;.
bd90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75        case OP_Mu
bda0: 6c 74 69 70 6c 79 3a 20 20 69 66 28 20 73 71 6c  ltiply:  if( sql
bdb0: 69 74 65 33 4d 75 6c 49 6e 74 36 34 28 26 69 42  ite3MulInt64(&iB
bdc0: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d  ,iA) ) goto fp_m
bdd0: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ath;  break;.   
bde0: 20 20 20 63 61 73 65 20 4f 50 5f 44 69 76 69 64     case OP_Divid
bdf0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
be00: 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72   iA==0 ) goto ar
be10: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
be20: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
be30: 20 69 66 28 20 69 41 3d 3d 2d 31 20 26 26 20 69   if( iA==-1 && i
be40: 42 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  B==SMALLEST_INT6
be50: 34 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  4 ) goto fp_math
be60: 3b 0a 20 20 20 20 20 20 20 20 69 42 20 2f 3d 20  ;.        iB /= 
be70: 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  iA;.        brea
be80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
be90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
bea0: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
beb0: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
bec0: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
bed0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
bee0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
bef0: 20 20 20 20 20 69 42 20 25 3d 20 69 41 3b 0a 20       iB %= iA;. 
bf00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bf10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
bf20: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 42 3b 0a  pOut->u.i = iB;.
bf30: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
bf40: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
bf50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bf60: 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a 66 70 5f  bIntint = 0;.fp_
bf70: 6d 61 74 68 3a 0a 20 20 20 20 72 41 20 3d 20 73  math:.    rA = s
bf80: 71 6c 69 74 65 33 56 64 62 65 52 65 61 6c 56 61  qlite3VdbeRealVa
bf90: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 20 20 72  lue(pIn1);.    r
bfa0: 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  B = sqlite3VdbeR
bfb0: 65 61 6c 56 61 6c 75 65 28 70 49 6e 32 29 3b 0a  ealValue(pIn2);.
bfc0: 20 20 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d      switch( pOp-
bfd0: 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  >opcode ){.     
bfe0: 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20 20 20   case OP_Add:   
bff0: 20 20 20 20 20 20 72 42 20 2b 3d 20 72 41 3b 20        rB += rA; 
c000: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c010: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
c020: 61 63 74 3a 20 20 20 20 72 42 20 2d 3d 20 72 41  act:    rB -= rA
c030: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c040: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4d 75 6c       case OP_Mul
c050: 74 69 70 6c 79 3a 20 20 20 20 72 42 20 2a 3d 20  tiply:    rB *= 
c060: 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  rA;       break;
c070: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 44  .      case OP_D
c080: 69 76 69 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  ivide: {.       
c090: 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e   /* (double)0 In
c0a0: 20 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f   case of SQLITE_
c0b0: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
c0c0: 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20  INT... */.      
c0d0: 20 20 69 66 28 20 72 41 3d 3d 28 64 6f 75 62 6c    if( rA==(doubl
c0e0: 65 29 30 20 29 20 67 6f 74 6f 20 61 72 69 74 68  e)0 ) goto arith
c0f0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c100: 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 72 42  null;.        rB
c110: 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20 20 20 20   /= rA;.        
c120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c130: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
c140: 20 20 20 20 20 20 20 20 69 41 20 3d 20 28 69 36          iA = (i6
c150: 34 29 72 41 3b 0a 20 20 20 20 20 20 20 20 69 42  4)rA;.        iB
c160: 20 3d 20 28 69 36 34 29 72 42 3b 0a 20 20 20 20   = (i64)rB;.    
c170: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
c180: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
c190: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
c1a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
c1b0: 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a 20 20 20  -1 ) iA = 1;.   
c1c0: 20 20 20 20 20 72 42 20 3d 20 28 64 6f 75 62 6c       rB = (doubl
c1d0: 65 29 28 69 42 20 25 20 69 41 29 3b 0a 20 20 20  e)(iB % iA);.   
c1e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c1f0: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
c200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
c210: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
c220: 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 42 3b 0a  pOut->u.i = rB;.
c230: 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c      MemSetTypeFl
c240: 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74  ag(pOut, MEM_Int
c250: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
c260: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 72 42   sqlite3IsNaN(rB
c270: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
c280: 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c  arithmetic_resul
c290: 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 7d  t_is_null;.    }
c2a0: 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 72 20 3d  .    pOut->u.r =
c2b0: 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54   rB;.    MemSetT
c2c0: 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
c2d0: 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20 69 66 28  M_Real);.    if(
c2e0: 20 28 28 74 79 70 65 31 7c 74 79 70 65 32 29 26   ((type1|type2)&
c2f0: 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 26 26 20  MEM_Real)==0 && 
c300: 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20 20 20 20  !bIntint ){.    
c310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
c320: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 4f 75  egerAffinity(pOu
c330: 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  t);.    }.#endif
c340: 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 0a 61  .  }.  break;..a
c350: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
c360: 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73 71 6c 69  _is_null:.  sqli
c370: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
c380: 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  l(pOut);.  break
c390: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
c3a0: 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20 2a 20 50  CollSeq P1 * * P
c3b0: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  4.**.** P4 is a 
c3c0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 43 6f 6c  pointer to a Col
c3d0: 6c 53 65 71 20 73 74 72 75 63 74 2e 20 49 66 20  lSeq struct. If 
c3e0: 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
c3f0: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
c400: 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67 61 74 65  .** or aggregate
c410: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 47 65   calls sqlite3Ge
c420: 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28 29 2c 20  tFuncCollSeq(), 
c430: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
c440: 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a 2a 2a 20  equence will.** 
c450: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
c460: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
c470: 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 2c   built-in min(),
c480: 20 6d 61 78 28 29 20 61 6e 64 20 6e 75 6c 6c 69   max() and nulli
c490: 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  f().** functions
c4a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31 20 69 73  ..**.** If P1 is
c4b0: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c4c0: 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72  it is a register
c4d0: 20 74 68 61 74 20 61 20 73 75 62 73 65 71 75 65   that a subseque
c4e0: 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a 2a 20 6d  nt min() or.** m
c4f0: 61 78 28 29 20 61 67 67 72 65 67 61 74 65 20 77  ax() aggregate w
c500: 69 6c 6c 20 73 65 74 20 74 6f 20 31 20 69 66 20  ill set to 1 if 
c510: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
c520: 69 73 20 6e 6f 74 20 74 68 65 20 6d 69 6e 69 6d  is not the minim
c530: 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69 6d 75 6d  um or.** maximum
c540: 2e 20 20 54 68 65 20 50 31 20 72 65 67 69 73 74  .  The P1 regist
c550: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
c560: 64 20 74 6f 20 30 20 62 79 20 74 68 69 73 20 69  d to 0 by this i
c570: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
c580: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
c590: 75 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c  used by the impl
c5a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
c5b0: 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f 6e 65 64  e aforementioned
c5c0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f   functions.** to
c5d0: 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f   retrieve the co
c5e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
c5f0: 20 73 65 74 20 62 79 20 74 68 69 73 20 6f 70 63   set by this opc
c600: 6f 64 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ode is not avail
c610: 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69 63 6c 79  able.** publicly
c620: 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74 2d 69 6e  .  Only built-in
c630: 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20   functions have 
c640: 61 63 63 65 73 73 20 74 6f 20 74 68 69 73 20 66  access to this f
c650: 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65 20  eature..*/.case 
c660: 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b 0a 20 20  OP_CollSeq: {.  
c670: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
c680: 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53 45 51 20  ype==P4_COLLSEQ 
c690: 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31  );.  if( pOp->p1
c6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c6b0: 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26  dbeMemSetInt64(&
c6c0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 30  aMem[pOp->p1], 0
c6d0: 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  );.  }.  break;.
c6e0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75  }../* Opcode: Fu
c6f0: 6e 63 74 69 6f 6e 30 20 50 31 20 50 32 20 50 33  nction0 P1 P2 P3
c700: 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
c710: 69 73 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72  is: r[P3]=func(r
c720: 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49  [P2@P5]).**.** I
c730: 6e 76 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e  nvoke a user fun
c740: 63 74 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70  ction (P4 is a p
c750: 6f 69 6e 74 65 72 20 74 6f 20 61 20 46 75 6e 63  ointer to a Func
c760: 44 65 66 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  Def object that.
c770: 2a 2a 20 64 65 66 69 6e 65 73 20 74 68 65 20 66  ** defines the f
c780: 75 6e 63 74 69 6f 6e 29 20 77 69 74 68 20 50 35  unction) with P5
c790: 20 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e   arguments taken
c7a0: 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
c7b0: 32 20 61 6e 64 0a 2a 2a 20 73 75 63 63 65 73 73  2 and.** success
c7c0: 6f 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ors.  The result
c7d0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
c7e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
c7f0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 52 65  gister P3..** Re
c800: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
c810: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
c820: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
c830: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
c840: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
c850: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
c860: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
c870: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
c880: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
c890: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
c8a0: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
c8b0: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
c8c0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
c8d0: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
c8e0: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
c8f0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
c900: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
c910: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
c920: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
c930: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
c940: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
c950: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
c960: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
c970: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
c980: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
c990: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
c9a0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
c9b0: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
c9c0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63  * See also: Func
c9d0: 74 69 6f 6e 2c 20 41 67 67 53 74 65 70 2c 20 41  tion, AggStep, A
c9e0: 67 67 46 69 6e 61 6c 0a 2a 2f 0a 2f 2a 20 4f 70  ggFinal.*/./* Op
c9f0: 63 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 20 50  code: Function P
ca00: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
ca10: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
ca20: 3d 66 75 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a  =func(r[P2@P5]).
ca30: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
ca40: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
ca50: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
ca60: 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74   an sqlite3_cont
ca70: 65 78 74 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  ext object that.
ca80: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ** contains a po
ca90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
caa0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 72 75 6e 29  ction to be run)
cab0: 20 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e   with P5 argumen
cac0: 74 73 20 74 61 6b 65 6e 0a 2a 2a 20 66 72 6f 6d  ts taken.** from
cad0: 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64   register P2 and
cae0: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68   successors.  Th
caf0: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
cb00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72  function is stor
cb10: 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ed.** in registe
cb20: 72 20 50 33 2e 20 20 52 65 67 69 73 74 65 72 20  r P3.  Register 
cb30: 50 33 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  P3 must not be o
cb40: 6e 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ne of the functi
cb50: 6f 6e 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a  on inputs..**.**
cb60: 20 50 31 20 69 73 20 61 20 33 32 2d 62 69 74 20   P1 is a 32-bit 
cb70: 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69  bitmask indicati
cb80: 6e 67 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ng whether or no
cb90: 74 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  t each argument 
cba0: 74 6f 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74  to the .** funct
cbb0: 69 6f 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e  ion was determin
cbc0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e  ed to be constan
cbd0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
cbe0: 65 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 0a  e. If the first.
cbf0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  ** argument was 
cc00: 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69  constant then bi
cc10: 74 20 30 20 6f 66 20 50 31 20 69 73 20 73 65 74  t 0 of P1 is set
cc20: 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
cc30: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
cc40: 68 65 74 68 65 72 20 6d 65 74 61 20 64 61 74 61  hether meta data
cc50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cc60: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
cc70: 20 61 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20   argument using 
cc80: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73  the.** sqlite3_s
cc90: 65 74 5f 61 75 78 64 61 74 61 28 29 20 41 50 49  et_auxdata() API
cca0: 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 72   may be safely r
ccb0: 65 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68  etained until th
ccc0: 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61  e next.** invoca
ccd0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63  tion of this opc
cce0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 66  ode..**.** SQL f
ccf0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 69  unctions are ini
cd00: 74 69 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  tially coded as 
cd10: 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 20 77 69 74  OP_Function0 wit
cd20: 68 20 50 34 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  h P4 pointing.**
cd30: 20 74 6f 20 61 20 46 75 6e 63 44 65 66 20 6f 62   to a FuncDef ob
cd40: 6a 65 63 74 2e 20 20 42 75 74 20 6f 6e 20 66 69  ject.  But on fi
cd50: 72 73 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20  rst evaluation, 
cd60: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
cd70: 73 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  s.** automatical
cd80: 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  ly converted int
cd90: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e  o an sqlite3_con
cda0: 74 65 78 74 20 6f 62 6a 65 63 74 20 61 6e 64 20  text object and 
cdb0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
cdc0: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 69 73   changed to this
cdd0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
cde0: 6f 64 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ode.  In this wa
cdf0: 79 2c 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  y, the initializ
ce00: 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ation of.** the 
ce10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
ce20: 6f 62 6a 65 63 74 20 6f 63 63 75 72 73 20 6f 6e  object occurs on
ce30: 6c 79 20 6f 6e 63 65 2c 20 72 61 74 68 65 72 20  ly once, rather 
ce40: 74 68 61 6e 20 6f 6e 63 65 20 66 6f 72 20 65 61  than once for ea
ce50: 63 68 0a 2a 2a 20 65 76 61 6c 75 61 74 69 6f 6e  ch.** evaluation
ce60: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
ce70: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
ce80: 3a 20 46 75 6e 63 74 69 6f 6e 30 2c 20 41 67 67  : Function0, Agg
ce90: 53 74 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a  Step, AggFinal.*
cea0: 2f 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69  /.case OP_Functi
ceb0: 6f 6e 30 3a 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  on0: {.  int n;.
cec0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
ced0: 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65  t *pCtx;..  asse
cee0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
cef0: 3d 50 34 5f 46 55 4e 43 44 45 46 20 29 3b 0a 20  =P4_FUNCDEF );. 
cf00: 20 6e 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20   n = pOp->p5;.  
cf10: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
cf20: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
cf30: 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
cf40: 75 72 73 6f 72 29 20 29 3b 0a 20 20 61 73 73 65  ursor) );.  asse
cf50: 72 74 28 20 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70  rt( n==0 || (pOp
cf60: 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p2>0 && pOp->p
cf70: 32 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  2+n<=(p->nMem+1 
cf80: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 29  - p->nCursor)+1)
cf90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
cfa0: 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c  p->p3<pOp->p2 ||
cfb0: 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70   pOp->p3>=pOp->p
cfc0: 32 2b 6e 20 29 3b 0a 20 20 70 43 74 78 20 3d 20  2+n );.  pCtx = 
cfd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
cfe0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
cff0: 2a 70 43 74 78 29 20 2b 20 28 6e 2d 31 29 2a 73  *pCtx) + (n-1)*s
d000: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76 61  izeof(sqlite3_va
d010: 6c 75 65 2a 29 29 3b 0a 20 20 69 66 28 20 70 43  lue*));.  if( pC
d020: 74 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  tx==0 ) goto no_
d030: 6d 65 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75  mem;.  pCtx->pOu
d040: 74 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70  t = 0;.  pCtx->p
d050: 46 75 6e 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Func = pOp->p4.p
d060: 46 75 6e 63 3b 0a 20 20 70 43 74 78 2d 3e 69 4f  Func;.  pCtx->iO
d070: 70 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20  p = (int)(pOp - 
d080: 61 4f 70 29 3b 0a 20 20 70 43 74 78 2d 3e 70 56  aOp);.  pCtx->pV
d090: 64 62 65 20 3d 20 70 3b 0a 20 20 70 43 74 78 2d  dbe = p;.  pCtx-
d0a0: 3e 61 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70  >argc = n;.  pOp
d0b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55  ->p4type = P4_FU
d0c0: 4e 43 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34  NCCTX;.  pOp->p4
d0d0: 2e 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20  .pCtx = pCtx;.  
d0e0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
d0f0: 5f 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20  _Function;.  /* 
d100: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
d110: 6f 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 2a 2f  o OP_Function */
d120: 0a 7d 0a 63 61 73 65 20 4f 50 5f 46 75 6e 63 74  .}.case OP_Funct
d130: 69 6f 6e 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a  ion: {.  int i;.
d140: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
d150: 74 20 2a 70 43 74 78 3b 0a 0a 20 20 61 73 73 65  t *pCtx;..  asse
d160: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
d170: 3d 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20  =P4_FUNCCTX );. 
d180: 20 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e   pCtx = pOp->p4.
d190: 70 43 74 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pCtx;..  /* If t
d1a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d1b0: 69 6e 73 69 64 65 20 6f 66 20 61 20 74 72 69 67  inside of a trig
d1c0: 67 65 72 2c 20 74 68 65 20 72 65 67 69 73 74 65  ger, the registe
d1d0: 72 20 61 72 72 61 79 20 69 6e 20 61 4d 65 6d 5b  r array in aMem[
d1e0: 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20 63 68 61  ].  ** might cha
d1f0: 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20 65 76 61  nge from one eva
d200: 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 6e  luation to the n
d210: 65 78 74 2e 20 20 54 68 65 20 6e 65 78 74 20 62  ext.  The next b
d220: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a 20 20 2a  lock of code.  *
d230: 2a 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  * checks to see 
d240: 69 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  if the register 
d250: 61 72 72 61 79 20 68 61 73 20 63 68 61 6e 67 65  array has change
d260: 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 69 74 0a  d, and if so it.
d270: 20 20 2a 2a 20 72 65 69 6e 69 74 69 61 6c 69 7a    ** reinitializ
d280: 65 73 20 74 68 65 20 72 65 6c 61 76 61 6e 74 20  es the relavant 
d290: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 71 6c  parts of the sql
d2a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a  ite3_context obj
d2b0: 65 63 74 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20  ect */.  pOut = 
d2c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
d2d0: 20 20 69 66 28 20 70 43 74 78 2d 3e 70 4f 75 74    if( pCtx->pOut
d2e0: 20 21 3d 20 70 4f 75 74 20 29 7b 0a 20 20 20 20   != pOut ){.    
d2f0: 70 43 74 78 2d 3e 70 4f 75 74 20 3d 20 70 4f 75  pCtx->pOut = pOu
d300: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74  t;.    for(i=pCt
d310: 78 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b  x->argc-1; i>=0;
d320: 20 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76   i--) pCtx->argv
d330: 5b 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  [i] = &aMem[pOp-
d340: 3e 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 6d  >p2+i];.  }..  m
d350: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
d360: 70 2c 20 70 4f 75 74 29 3b 0a 23 69 66 64 65 66  p, pOut);.#ifdef
d370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d380: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d  for(i=0; i<pCtx-
d390: 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >argc; i++){.   
d3a0: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
d3b0: 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69  lid(pCtx->argv[i
d3c0: 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
d3d0: 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
d3e0: 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69  +i, pCtx->argv[i
d3f0: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ]);.  }.#endif. 
d400: 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
d410: 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  pOut, MEM_Null);
d420: 0a 20 20 70 43 74 78 2d 3e 66 45 72 72 6f 72 4f  .  pCtx->fErrorO
d430: 72 41 75 78 20 3d 20 30 3b 0a 20 20 28 2a 70 43  rAux = 0;.  (*pC
d440: 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  tx->pFunc->xSFun
d450: 63 29 28 70 43 74 78 2c 20 70 43 74 78 2d 3e 61  c)(pCtx, pCtx->a
d460: 72 67 63 2c 20 70 43 74 78 2d 3e 61 72 67 76 29  rgc, pCtx->argv)
d470: 3b 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35  ;/* IMP: R-24505
d480: 2d 32 33 32 33 30 20 2a 2f 0a 0a 20 20 2f 2a 20  -23230 */..  /* 
d490: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
d4a0: 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
d4b0: 72 2c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65  r, throw an exce
d4c0: 70 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ption */.  if( p
d4d0: 43 74 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78  Ctx->fErrorOrAux
d4e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78   ){.    if( pCtx
d4f0: 2d 3e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->isError ){.   
d500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
d510: 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c  ror(p, "%s", sql
d520: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
d530: 70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 63  pOut));.      rc
d540: 20 3d 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72   = pCtx->isError
d550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d560: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
d570: 44 61 74 61 28 64 62 2c 20 26 70 2d 3e 70 41 75  Data(db, &p->pAu
d580: 78 44 61 74 61 2c 20 70 43 74 78 2d 3e 69 4f 70  xData, pCtx->iOp
d590: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
d5a0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
d5b0: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
d5c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
d5d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d5e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f  he function into
d5f0: 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a   register P3 */.
d600: 20 20 69 66 28 20 70 4f 75 74 2d 3e 66 6c 61 67    if( pOut->flag
d610: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
d620: 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 73 71  _Blob) ){.    sq
d630: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
d640: 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65 6e  ncoding(pOut, en
d650: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 66 28  coding);.    if(
d660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
d670: 6f 6f 42 69 67 28 70 4f 75 74 29 20 29 20 67 6f  ooBig(pOut) ) go
d680: 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
d690: 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
d6a0: 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75 74 29  E(pOp->p3, pOut)
d6b0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
d6c0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
d6d0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
d6e0: 63 6f 64 65 3a 20 42 69 74 41 6e 64 20 50 31 20  code: BitAnd P1 
d6f0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
d700: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
d710: 31 5d 26 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]&r[P2].**.** T
d720: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
d730: 20 41 4e 44 20 6f 66 20 74 68 65 20 76 61 6c 75   AND of the valu
d740: 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  es in register P
d750: 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20  1 and P2 and.** 
d760: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
d770: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
d780: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
d790: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
d7a0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
d7b0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .*/./* Opcode: B
d7c0: 69 74 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20  itOr P1 P2 P3 * 
d7d0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d7e0: 5b 50 33 5d 3d 72 5b 50 31 5d 7c 72 5b 50 32 5d  [P3]=r[P1]|r[P2]
d7f0: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
d800: 62 69 74 2d 77 69 73 65 20 4f 52 20 6f 66 20 74  bit-wise OR of t
d810: 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67  he values in reg
d820: 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32 20  ister P1 and P2 
d830: 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65  and.** store the
d840: 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73   result in regis
d850: 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69  ter P3..** If ei
d860: 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55  ther input is NU
d870: 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  LL, the result i
d880: 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70  s NULL..*/./* Op
d890: 63 6f 64 65 3a 20 53 68 69 66 74 4c 65 66 74 20  code: ShiftLeft 
d8a0: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
d8b0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
d8c0: 72 5b 50 32 5d 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]<<r[P1].**.
d8d0: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
d8e0: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
d8f0: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
d900: 20 6c 65 66 74 20 62 79 20 74 68 65 0a 2a 2a 20   left by the.** 
d910: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73  number of bits s
d920: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
d930: 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69 73  integer in regis
d940: 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65  ter P1..** Store
d950: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
d960: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
d970: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
d980: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
d990: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
d9a0: 2a 20 4f 70 63 6f 64 65 3a 20 53 68 69 66 74 52  * Opcode: ShiftR
d9b0: 69 67 68 74 20 50 31 20 50 32 20 50 33 20 2a 20  ight P1 P2 P3 * 
d9c0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d9d0: 5b 50 33 5d 3d 72 5b 50 32 5d 3e 3e 72 5b 50 31  [P3]=r[P2]>>r[P1
d9e0: 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74 20 74 68  ].**.** Shift th
d9f0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
da00: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 20 74  in register P2 t
da10: 6f 20 74 68 65 20 72 69 67 68 74 20 62 79 20 74  o the right by t
da20: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
da30: 62 69 74 73 20 73 70 65 63 69 66 69 65 64 20 62  bits specified b
da40: 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 69 6e  y the integer in
da50: 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
da60: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
da70: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  t in register P3
da80: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69  ..** If either i
da90: 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  nput is NULL, th
daa0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
dab0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  ..*/.case OP_Bit
dac0: 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  And:            
dad0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dae0: 54 4b 5f 42 49 54 41 4e 44 2c 20 69 6e 31 2c 20  TK_BITAND, in1, 
daf0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
db00: 65 20 4f 50 5f 42 69 74 4f 72 3a 20 20 20 20 20  e OP_BitOr:     
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db20: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4f 52  same as TK_BITOR
db30: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
db40: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
db50: 74 4c 65 66 74 3a 20 20 20 20 20 20 20 20 20 20  tLeft:          
db60: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
db70: 4b 5f 4c 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_LSHIFT, in1, i
db80: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
db90: 20 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3a 20   OP_ShiftRight: 
dba0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
dbb0: 61 6d 65 20 61 73 20 54 4b 5f 52 53 48 49 46 54  ame as TK_RSHIFT
dbc0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
dbd0: 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 0a 20 20   */.  i64 iA;.  
dbe0: 75 36 34 20 75 41 3b 0a 20 20 69 36 34 20 69 42  u64 uA;.  i64 iB
dbf0: 3b 0a 20 20 75 38 20 6f 70 3b 0a 0a 20 20 70 49  ;.  u8 op;..  pI
dc00: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
dc10: 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  p1];.  pIn2 = &a
dc20: 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
dc30: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
dc40: 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 28 70 49  ->p3];.  if( (pI
dc50: 6e 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32  n1->flags | pIn2
dc60: 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e  ->flags) & MEM_N
dc70: 75 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ull ){.    sqlit
dc80: 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
dc90: 28 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61  (pOut);.    brea
dca0: 6b 3b 0a 20 20 7d 0a 20 20 69 41 20 3d 20 73 71  k;.  }.  iA = sq
dcb0: 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
dcc0: 65 28 70 49 6e 32 29 3b 0a 20 20 69 42 20 3d 20  e(pIn2);.  iB = 
dcd0: 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61  sqlite3VdbeIntVa
dce0: 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 6f 70 20  lue(pIn1);.  op 
dcf0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
dd00: 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42 69 74 41   if( op==OP_BitA
dd10: 6e 64 20 29 7b 0a 20 20 20 20 69 41 20 26 3d 20  nd ){.    iA &= 
dd20: 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  iB;.  }else if( 
dd30: 6f 70 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 7b 0a  op==OP_BitOr ){.
dd40: 20 20 20 20 69 41 20 7c 3d 20 69 42 3b 0a 20 20      iA |= iB;.  
dd50: 7d 65 6c 73 65 20 69 66 28 20 69 42 21 3d 30 20  }else if( iB!=0 
dd60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  ){.    assert( o
dd70: 70 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  p==OP_ShiftRight
dd80: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74   || op==OP_Shift
dd90: 4c 65 66 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Left );..    /* 
dda0: 49 66 20 73 68 69 66 74 69 6e 67 20 62 79 20 61  If shifting by a
ddb0: 20 6e 65 67 61 74 69 76 65 20 61 6d 6f 75 6e 74   negative amount
ddc0: 2c 20 73 68 69 66 74 20 69 6e 20 74 68 65 20 6f  , shift in the o
ddd0: 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 20 2a  ther direction *
dde0: 2f 0a 20 20 20 20 69 66 28 20 69 42 3c 30 20 29  /.    if( iB<0 )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 3d 3d 4f  OP_ShiftRight==O
de10: 50 5f 53 68 69 66 74 4c 65 66 74 2b 31 20 29 3b  P_ShiftLeft+1 );
de20: 0a 20 20 20 20 20 20 6f 70 20 3d 20 32 2a 4f 50  .      op = 2*OP
de30: 5f 53 68 69 66 74 4c 65 66 74 20 2b 20 31 20 2d  _ShiftLeft + 1 -
de40: 20 6f 70 3b 0a 20 20 20 20 20 20 69 42 20 3d 20   op;.      iB = 
de50: 69 42 3e 28 2d 36 34 29 20 3f 20 2d 69 42 20 3a  iB>(-64) ? -iB :
de60: 20 36 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   64;.    }..    
de70: 69 66 28 20 69 42 3e 3d 36 34 20 29 7b 0a 20 20  if( iB>=64 ){.  
de80: 20 20 20 20 69 41 20 3d 20 28 69 41 3e 3d 30 20      iA = (iA>=0 
de90: 7c 7c 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  || op==OP_ShiftL
dea0: 65 66 74 29 20 3f 20 30 20 3a 20 2d 31 3b 0a 20  eft) ? 0 : -1;. 
deb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dec0: 6d 65 6d 63 70 79 28 26 75 41 2c 20 26 69 41 2c  memcpy(&uA, &iA,
ded0: 20 73 69 7a 65 6f 66 28 75 41 29 29 3b 0a 20 20   sizeof(uA));.  
dee0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 53      if( op==OP_S
def0: 68 69 66 74 4c 65 66 74 20 29 7b 0a 20 20 20 20  hiftLeft ){.    
df00: 20 20 20 20 75 41 20 3c 3c 3d 20 69 42 3b 0a 20      uA <<= iB;. 
df10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df20: 20 20 20 20 75 41 20 3e 3e 3d 20 69 42 3b 0a 20      uA >>= iB;. 
df30: 20 20 20 20 20 20 20 2f 2a 20 53 69 67 6e 2d 65         /* Sign-e
df40: 78 74 65 6e 64 20 6f 6e 20 61 20 72 69 67 68 74  xtend on a right
df50: 20 73 68 69 66 74 20 6f 66 20 61 20 6e 65 67 61   shift of a nega
df60: 74 69 76 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  tive number */. 
df70: 20 20 20 20 20 20 20 69 66 28 20 69 41 3c 30 20         if( iA<0 
df80: 29 20 75 41 20 7c 3d 20 28 28 28 28 75 36 34 29  ) uA |= ((((u64)
df90: 30 78 66 66 66 66 66 66 66 66 29 3c 3c 33 32 29  0xffffffff)<<32)
dfa0: 7c 30 78 66 66 66 66 66 66 66 66 29 20 3c 3c 20  |0xffffffff) << 
dfb0: 28 36 34 2d 69 42 29 3b 0a 20 20 20 20 20 20 7d  (64-iB);.      }
dfc0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 69  .      memcpy(&i
dfd0: 41 2c 20 26 75 41 2c 20 73 69 7a 65 6f 66 28 69  A, &uA, sizeof(i
dfe0: 41 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  A));.    }.  }. 
dff0: 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 69 41 3b   pOut->u.i = iA;
e000: 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61  .  MemSetTypeFla
e010: 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29  g(pOut, MEM_Int)
e020: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
e030: 20 4f 70 63 6f 64 65 3a 20 41 64 64 49 6d 6d 20   Opcode: AddImm 
e040: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
e050: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d  Synopsis: r[P1]=
e060: 72 5b 50 31 5d 2b 50 32 0a 2a 2a 20 0a 2a 2a 20  r[P1]+P2.** .** 
e070: 41 64 64 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  Add the constant
e080: 20 50 32 20 74 6f 20 74 68 65 20 76 61 6c 75 65   P2 to the value
e090: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
e0a0: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
e0b0: 73 20 61 6c 77 61 79 73 20 61 6e 20 69 6e 74 65  s always an inte
e0c0: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 66 6f  ger..**.** To fo
e0d0: 72 63 65 20 61 6e 79 20 72 65 67 69 73 74 65 72  rce any register
e0e0: 20 74 6f 20 62 65 20 61 6e 20 69 6e 74 65 67 65   to be an intege
e0f0: 72 2c 20 6a 75 73 74 20 61 64 64 20 30 2e 0a 2a  r, just add 0..*
e100: 2f 0a 63 61 73 65 20 4f 50 5f 41 64 64 49 6d 6d  /.case OP_AddImm
e110: 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
e120: 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  * in1 */.  pIn1 
e130: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
e140: 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68  ;.  memAboutToCh
e150: 61 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20  ange(p, pIn1);. 
e160: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
e170: 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b  ntegerify(pIn1);
e180: 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2b 3d 20  .  pIn1->u.i += 
e190: 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 72 65 61 6b  pOp->p2;.  break
e1a0: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
e1b0: 4d 75 73 74 42 65 49 6e 74 20 50 31 20 50 32 20  MustBeInt P1 P2 
e1c0: 2a 20 2a 20 2a 0a 2a 2a 20 0a 2a 2a 20 46 6f 72  * * *.** .** For
e1d0: 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ce the value in 
e1e0: 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20 62  register P1 to b
e1f0: 65 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  e an integer.  I
e200: 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
e210: 6e 20 50 31 20 69 73 20 6e 6f 74 20 61 6e 20 69  n P1 is not an i
e220: 6e 74 65 67 65 72 20 61 6e 64 20 63 61 6e 6e 6f  nteger and canno
e230: 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
e240: 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 0a 2a  nto an integer.*
e250: 2a 20 77 69 74 68 6f 75 74 20 64 61 74 61 20 6c  * without data l
e260: 6f 73 73 2c 20 74 68 65 6e 20 6a 75 6d 70 20 69  oss, then jump i
e270: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
e280: 2c 20 6f 72 20 69 66 20 50 32 3d 3d 30 0a 2a 2a  , or if P2==0.**
e290: 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45   raise an SQLITE
e2a0: 5f 4d 49 53 4d 41 54 43 48 20 65 78 63 65 70 74  _MISMATCH except
e2b0: 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
e2c0: 4d 75 73 74 42 65 49 6e 74 3a 20 7b 20 20 20 20  MustBeInt: {    
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c          /* jump,
e2e0: 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
e2f0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
e300: 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
e310: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d  ags & MEM_Int)==
e320: 30 20 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66  0 ){.    applyAf
e330: 66 69 6e 69 74 79 28 70 49 6e 31 2c 20 53 51 4c  finity(pIn1, SQL
e340: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
e350: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20   encoding);.    
e360: 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
e370: 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d  (pIn1->flags&MEM
e380: 5f 49 6e 74 29 3d 3d 30 2c 20 32 29 3b 0a 20 20  _Int)==0, 2);.  
e390: 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
e3a0: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
e3b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
e3c0: 70 2d 3e 70 32 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p2==0 ){.    
e3d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3e0: 4d 49 53 4d 41 54 43 48 3b 0a 20 20 20 20 20 20  MISMATCH;.      
e3f0: 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
e400: 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  _to_error;.     
e410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e420: 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
e430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e440: 20 7d 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46   }.  MemSetTypeF
e450: 6c 61 67 28 70 49 6e 31 2c 20 4d 45 4d 5f 49 6e  lag(pIn1, MEM_In
e460: 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  t);.  break;.}..
e470: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e480: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
e490: 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  NT./* Opcode: Re
e4a0: 61 6c 41 66 66 69 6e 69 74 79 20 50 31 20 2a 20  alAffinity P1 * 
e4b0: 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 72  * * *.**.** If r
e4c0: 65 67 69 73 74 65 72 20 50 31 20 68 6f 6c 64 73  egister P1 holds
e4d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 76   an integer conv
e4e0: 65 72 74 20 69 74 20 74 6f 20 61 20 72 65 61 6c  ert it to a real
e4f0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
e500: 69 73 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  is opcode is use
e510: 64 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  d when extractin
e520: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
e530: 6f 6d 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74  om a column that
e540: 0a 2a 2a 20 68 61 73 20 52 45 41 4c 20 61 66 66  .** has REAL aff
e550: 69 6e 69 74 79 2e 20 20 53 75 63 68 20 63 6f 6c  inity.  Such col
e560: 75 6d 6e 20 76 61 6c 75 65 73 20 6d 61 79 20 73  umn values may s
e570: 74 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61  till be stored a
e580: 73 0a 2a 2a 20 69 6e 74 65 67 65 72 73 2c 20 66  s.** integers, f
e590: 6f 72 20 73 70 61 63 65 20 65 66 66 69 63 69 65  or space efficie
e5a0: 6e 63 79 2c 20 62 75 74 20 61 66 74 65 72 20 65  ncy, but after e
e5b0: 78 74 72 61 63 74 69 6f 6e 20 77 65 20 77 61 6e  xtraction we wan
e5c0: 74 20 74 68 65 6d 0a 2a 2a 20 74 6f 20 68 61 76  t them.** to hav
e5d0: 65 20 6f 6e 6c 79 20 61 20 72 65 61 6c 20 76 61  e only a real va
e5e0: 6c 75 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lue..*/.case OP_
e5f0: 52 65 61 6c 41 66 66 69 6e 69 74 79 3a 20 7b 20  RealAffinity: { 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e   /* in1 */.  pIn
e620: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
e630: 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  1];.  if( pIn1->
e640: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
e650: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e660: 62 65 4d 65 6d 52 65 61 6c 69 66 79 28 70 49 6e  beMemRealify(pIn
e670: 31 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  1);.  }.  break;
e680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
e690: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
e6a0: 41 53 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43  AST./* Opcode: C
e6b0: 61 73 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ast P1 P2 * * *.
e6c0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66  ** Synopsis: aff
e6d0: 69 6e 69 74 79 28 72 5b 50 31 5d 29 0a 2a 2a 0a  inity(r[P1]).**.
e6e0: 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76 61 6c  ** Force the val
e6f0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
e700: 31 20 74 6f 20 62 65 20 74 68 65 20 74 79 70 65  1 to be the type
e710: 20 64 65 66 69 6e 65 64 20 62 79 20 50 32 2e 0a   defined by P2..
e720: 2a 2a 20 0a 2a 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c  ** .** <ul>.** <
e730: 6c 69 20 76 61 6c 75 65 3d 22 39 37 22 3e 20 54  li value="97"> T
e740: 45 58 54 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  EXT.** <li value
e750: 3d 22 39 38 22 3e 20 42 4c 4f 42 0a 2a 2a 20 3c  ="98"> BLOB.** <
e760: 6c 69 20 76 61 6c 75 65 3d 22 39 39 22 3e 20 4e  li value="99"> N
e770: 55 4d 45 52 49 43 0a 2a 2a 20 3c 6c 69 20 76 61  UMERIC.** <li va
e780: 6c 75 65 3d 22 31 30 30 22 3e 20 49 4e 54 45 47  lue="100"> INTEG
e790: 45 52 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65 3d  ER.** <li value=
e7a0: 22 31 30 31 22 3e 20 52 45 41 4c 0a 2a 2a 20 3c  "101"> REAL.** <
e7b0: 2f 75 6c 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  /ul>.**.** A NUL
e7c0: 4c 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 63  L value is not c
e7d0: 68 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 72  hanged by this r
e7e0: 6f 75 74 69 6e 65 2e 20 20 49 74 20 72 65 6d 61  outine.  It rema
e7f0: 69 6e 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73  ins NULL..*/.cas
e800: 65 20 4f 50 5f 43 61 73 74 3a 20 7b 20 20 20 20  e OP_Cast: {    
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e820: 20 69 6e 31 20 2a 2f 0a 20 20 61 73 73 65 72 74   in1 */.  assert
e830: 28 20 70 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54  ( pOp->p2>=SQLIT
e840: 45 5f 41 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f  E_AFF_BLOB && pO
e850: 70 2d 3e 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46  p->p2<=SQLITE_AF
e860: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 74 65 73 74  F_REAL );.  test
e870: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e880: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
e890: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
e8a0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
e8b0: 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74  F_BLOB );.  test
e8c0: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
e8d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
e8e0: 43 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  C );.  testcase(
e8f0: 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45   pOp->p2==SQLITE
e900: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
e910: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
e920: 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  >p2==SQLITE_AFF_
e930: 52 45 41 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d  REAL );.  pIn1 =
e940: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
e950: 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61  .  memAboutToCha
e960: 6e 67 65 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20  nge(p, pIn1);.  
e970: 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
e980: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
e990: 56 64 62 65 4d 65 6d 43 61 73 74 28 70 49 6e 31  VdbeMemCast(pIn1
e9a0: 2c 20 70 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64  , pOp->p2, encod
e9b0: 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d  ing);.  UPDATE_M
e9c0: 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31  AX_BLOBSIZE(pIn1
e9d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
e9e0: 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
e9f0: 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
ea00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ea10: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a  TE_OMIT_CAST */.
ea20: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 71 20 50  ./* Opcode: Eq P
ea30: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
ea40: 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b   Synopsis: IF r[
ea50: 50 33 5d 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  P3]==r[P1].**.**
ea60: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
ea70: 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  ues in register 
ea80: 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72  P1 and P3.  If r
ea90: 65 67 28 50 33 29 3d 3d 72 65 67 28 50 31 29 20  eg(P3)==reg(P1) 
eaa0: 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20  then.** jump to 
eab0: 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20  address P2.  Or 
eac0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54  if the SQLITE_ST
ead0: 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65  OREP2 flag is se
eae0: 74 20 69 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a  t in P5, then.**
eaf0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
eb00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
eb10: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
eb20: 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
eb30: 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f  _AFF_MASK portio
eb40: 6e 20 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20  n of P5 must be 
eb50: 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 72  an affinity char
eb60: 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54  acter -.** SQLIT
eb70: 45 5f 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49  E_AFF_TEXT, SQLI
eb80: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20  TE_AFF_INTEGER, 
eb90: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e  and so forth. An
eba0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
ebb0: 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62   .** to coerce b
ebc0: 6f 74 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72  oth inputs accor
ebd0: 64 69 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66  ding to this aff
ebe0: 69 6e 69 74 79 20 62 65 66 6f 72 65 20 74 68 65  inity before the
ebf0: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
ec00: 73 20 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53  s made. If the S
ec10: 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69  QLITE_AFF_MASK i
ec20: 73 20 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d  s 0x00, then num
ec30: 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79  eric.** affinity
ec40: 20 69 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74   is used. Note t
ec50: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
ec60: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
ec70: 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20   stored.** back 
ec80: 69 6e 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72  into the input r
ec90: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
eca0: 50 33 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63  P3.  So this opc
ecb0: 6f 64 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a  ode can cause.**
ecc0: 20 70 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e   persistent chan
ecd0: 67 65 73 20 74 6f 20 72 65 67 69 73 74 65 72 73  ges to registers
ece0: 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a   P1 and P3..**.*
ecf0: 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65  * Once any conve
ed00: 72 73 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65  rsions have take
ed10: 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69  n place, and nei
ed20: 74 68 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55  ther value is NU
ed30: 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75  LL, .** the valu
ed40: 65 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e  es are compared.
ed50: 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   If both values 
ed60: 61 72 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d  are blobs then m
ed70: 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73  emcmp() is.** us
ed80: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
ed90: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
eda0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
edb0: 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a  If both values.*
edc0: 2a 20 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e  * are text, then
edd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
ede0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
edf0: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
ee00: 0a 2a 2a 20 50 34 20 69 73 20 75 73 65 64 20 74  .** P4 is used t
ee10: 6f 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  o do the compari
ee20: 73 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e  son.  If P4 is n
ee30: 6f 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65  ot specified the
ee40: 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73  n.** memcmp() is
ee50: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
ee60: 20 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49   text string.  I
ee70: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
ee80: 65 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68  e.** numeric, th
ee90: 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d  en a numeric com
eea0: 70 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e  parison is used.
eeb0: 20 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   If the two valu
eec0: 65 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66  es.** are of dif
eed0: 66 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68  ferent types, th
eee0: 65 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63  en numbers are c
eef0: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
ef00: 68 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61  han.** strings a
ef10: 6e 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63  nd strings are c
ef20: 6f 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74  onsidered less t
ef30: 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a  han blobs..**.**
ef40: 20 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45   If SQLITE_NULLE
ef50: 51 20 69 73 20 73 65 74 20 69 6e 20 50 35 20 74  Q is set in P5 t
ef60: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
ef70: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
ef80: 61 6c 77 61 79 73 20 65 69 74 68 65 72 0a 2a 2a  always either.**
ef90: 20 74 72 75 65 20 6f 72 20 66 61 6c 73 65 20 61   true or false a
efa0: 6e 64 20 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c  nd is never NULL
efb0: 2e 20 20 49 66 20 62 6f 74 68 20 6f 70 65 72 61  .  If both opera
efc0: 6e 64 73 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  nds are NULL the
efd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
efe0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
eff0: 20 74 72 75 65 2e 20 20 49 66 20 65 69 74 68 65   true.  If eithe
f000: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f010: 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  L then the resul
f020: 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49  t is false..** I
f030: 66 20 6e 65 69 74 68 65 72 20 6f 70 65 72 61 6e  f neither operan
f040: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 20 72 65  d is NULL the re
f050: 73 75 6c 74 20 69 73 20 74 68 65 20 73 61 6d 65  sult is the same
f060: 20 61 73 20 69 74 20 77 6f 75 6c 64 20 62 65 20   as it would be 
f070: 69 66 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  if.** the SQLITE
f080: 5f 4e 55 4c 4c 45 51 20 66 6c 61 67 20 77 65 72  _NULLEQ flag wer
f090: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 50  e omitted from P
f0a0: 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68  5..**.** If both
f0b0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
f0c0: 61 6e 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e  and SQLITE_KEEPN
f0d0: 55 4c 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65  ULL flags are se
f0e0: 74 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f  t then the.** co
f0f0: 6e 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69  ntent of r[P2] i
f100: 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
f110: 66 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  f the new value 
f120: 69 73 20 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61  is NULL or 0 (fa
f130: 6c 73 65 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  lse)..** In othe
f140: 72 20 77 6f 72 64 73 2c 20 61 20 70 72 69 6f 72  r words, a prior
f150: 20 72 5b 50 32 5d 20 76 61 6c 75 65 20 77 69 6c   r[P2] value wil
f160: 6c 20 6e 6f 74 20 62 65 20 6f 76 65 72 77 72 69  l not be overwri
f170: 74 74 65 6e 20 62 79 20 31 20 28 74 72 75 65 29  tten by 1 (true)
f180: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
f190: 4e 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Ne P1 P2 P3 P4 P
f1a0: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
f1b0: 46 20 72 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a  F r[P3]!=r[P1].*
f1c0: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
f1d0: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 45 71  just like the Eq
f1e0: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
f1f0: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
f200: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
f210: 6f 70 65 72 61 6e 64 73 20 69 6e 20 72 65 67 69  operands in regi
f220: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 20  sters P1 and P3 
f230: 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20  are not equal.  
f240: 53 65 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64  See the Eq opcod
f250: 65 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f  e for.** additio
f260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
f270: 0a 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53  .**.** If both S
f280: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e  QLITE_STOREP2 an
f290: 64 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  d SQLITE_KEEPNUL
f2a0: 4c 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20  L flags are set 
f2b0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  then the.** cont
f2c0: 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20  ent of r[P2] is 
f2d0: 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20  only changed if 
f2e0: 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73  the new value is
f2f0: 20 4e 55 4c 4c 20 6f 72 20 31 20 28 74 72 75 65   NULL or 1 (true
f300: 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  )..** In other w
f310: 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b  ords, a prior r[
f320: 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  P2] value will n
f330: 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ot be overwritte
f340: 6e 20 62 79 20 30 20 28 66 61 6c 73 65 29 2e 0a  n by 0 (false)..
f350: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74  */./* Opcode: Lt
f360: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
f370: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
f380: 72 5b 50 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P3]<r[P1].**.*
f390: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
f3a0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
f3b0: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 49 66 20   P1 and P3.  If 
f3c0: 72 65 67 28 50 33 29 3c 72 65 67 28 50 31 29 20  reg(P3)<reg(P1) 
f3d0: 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20  then.** jump to 
f3e0: 61 64 64 72 65 73 73 20 50 32 2e 20 20 4f 72 20  address P2.  Or 
f3f0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 54  if the SQLITE_ST
f400: 4f 52 45 50 32 20 66 6c 61 67 20 69 73 20 73 65  OREP2 flag is se
f410: 74 20 69 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a  t in P5 store.**
f420: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
f430: 6f 6d 70 61 72 69 73 6f 6e 20 28 30 20 6f 72 20  omparison (0 or 
f440: 31 20 6f 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20  1 or NULL) into 
f450: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
f460: 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  ** If the SQLITE
f470: 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20  _JUMPIFNULL bit 
f480: 6f 66 20 50 35 20 69 73 20 73 65 74 20 61 6e 64  of P5 is set and
f490: 20 65 69 74 68 65 72 20 72 65 67 28 50 31 29 20   either reg(P1) 
f4a0: 6f 72 0a 2a 2a 20 72 65 67 28 50 33 29 20 69 73  or.** reg(P3) is
f4b0: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 74   NULL then the t
f4c0: 61 6b 65 20 74 68 65 20 6a 75 6d 70 2e 20 20 49  ake the jump.  I
f4d0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d  f the SQLITE_JUM
f4e0: 50 49 46 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20  PIFNULL .** bit 
f4f0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 66 61  is clear then fa
f500: 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 65 69  ll through if ei
f510: 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
f520: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
f530: 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20  SQLITE_AFF_MASK 
f540: 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75  portion of P5 mu
f550: 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e 69 74  st be an affinit
f560: 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a  y character -.**
f570: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
f580: 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  , SQLITE_AFF_INT
f590: 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72  EGER, and so for
f5a0: 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  th. An attempt i
f5b0: 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f  s made .** to co
f5c0: 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75 74 73  erce both inputs
f5d0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
f5e0: 69 73 20 61 66 66 69 6e 69 74 79 20 62 65 66 6f  is affinity befo
f5f0: 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72  re the.** compar
f600: 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20 49 66  ison is made. If
f610: 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
f620: 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20 74 68  MASK is 0x00, th
f630: 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66  en numeric.** af
f640: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 2e 20  finity is used. 
f650: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 66  Note that the af
f660: 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73 69 6f  finity conversio
f670: 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ns are stored.**
f680: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 69   back into the i
f690: 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20 50  nput registers P
f6a0: 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20 74 68  1 and P3.  So th
f6b0: 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20 63 61  is opcode can ca
f6c0: 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e  use.** persisten
f6d0: 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72 65 67  t changes to reg
f6e0: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f6f0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79  ..**.** Once any
f700: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68 61 76   conversions hav
f710: 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61  e taken place, a
f720: 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c 75 65  nd neither value
f730: 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68   is NULL, .** th
f740: 65 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6d  e values are com
f750: 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68 20 76  pared. If both v
f760: 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62 73 20  alues are blobs 
f770: 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73  then memcmp() is
f780: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65  .** used to dete
f790: 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  rmine the result
f7a0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
f7b0: 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20 76 61  son.  If both va
f7c0: 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65 78 74  lues.** are text
f7d0: 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70 72 6f  , then the appro
f7e0: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
f7f0: 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66   function specif
f800: 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20  ied in.** P4 is 
f810: 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
f820: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
f830: 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66  P4 is not specif
f840: 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63  ied then.** memc
f850: 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  mp() is used to 
f860: 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74 72  compare text str
f870: 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76 61  ing.  If both va
f880: 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65  lues are.** nume
f890: 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65  ric, then a nume
f8a0: 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  ric comparison i
f8b0: 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20 74  s used. If the t
f8c0: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65  wo values.** are
f8d0: 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74 79   of different ty
f8e0: 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72  pes, then number
f8f0: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
f900: 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74   less than.** st
f910: 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e 67  rings and string
f920: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
f930: 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62 73   less than blobs
f940: 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
f950: 4c 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  Le P1 P2 P3 P4 P
f960: 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49  5.** Synopsis: I
f970: 46 20 72 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a  F r[P3]<=r[P1].*
f980: 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
f990: 6a 75 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74  just like the Lt
f9a0: 20 6f 70 63 6f 64 65 20 65 78 63 65 70 74 20 74   opcode except t
f9b0: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20  hat the jump is 
f9c0: 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20  taken if.** the 
f9d0: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
f9e0: 74 65 72 20 50 33 20 69 73 20 6c 65 73 73 20 74  ter P3 is less t
f9f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
fa00: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a  the content of.*
fa10: 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20  * register P1.  
fa20: 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64  See the Lt opcod
fa30: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
fa40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
fa50: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 74 20 50  ./* Opcode: Gt P
fa60: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
fa70: 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b   Synopsis: IF r[
fa80: 50 33 5d 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  P3]>r[P1].**.** 
fa90: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
faa0: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
fab0: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
fac0: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
fad0: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
fae0: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
faf0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
fb00: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
fb10: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e  .** register P1.
fb20: 20 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63    See the Lt opc
fb30: 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
fb40: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
fb50: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65  */./* Opcode: Ge
fb60: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
fb70: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20  ** Synopsis: IF 
fb80: 72 5b 50 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a  r[P3]>=r[P1].**.
fb90: 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75  ** This works ju
fba0: 73 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f  st like the Lt o
fbb0: 70 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61  pcode except tha
fbc0: 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
fbd0: 6b 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ken if.** the co
fbe0: 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65  ntent of registe
fbf0: 72 20 50 33 20 69 73 20 67 72 65 61 74 65 72 20  r P3 is greater 
fc00: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
fc10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
fc20: 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 2e 20  ** register P1. 
fc30: 20 53 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f   See the Lt opco
fc40: 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  de for additiona
fc50: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
fc60: 2f 0a 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20  /.case OP_Eq:   
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
fc80: 61 6d 65 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75  ame as TK_EQ, ju
fc90: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
fca0: 63 61 73 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20  case OP_Ne:     
fcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
fcc0: 65 20 61 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70  e as TK_NE, jump
fcd0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61  , in1, in3 */.ca
fce0: 73 65 20 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20  se OP_Lt:       
fcf0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
fd00: 61 73 20 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20  as TK_LT, jump, 
fd10: 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  in1, in3 */.case
fd20: 20 4f 50 5f 4c 65 3a 20 20 20 20 20 20 20 20 20   OP_Le:         
fd30: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
fd40: 20 54 4b 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e   TK_LE, jump, in
fd50: 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f  1, in3 */.case O
fd60: 50 5f 47 74 3a 20 20 20 20 20 20 20 20 20 20 20  P_Gt:           
fd70: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fd80: 4b 5f 47 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_GT, jump, in1,
fd90: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fda0: 47 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  Ge: {           
fdb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fdc0: 47 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  GE, jump, in1, i
fdd0: 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c  n3 */.  int res,
fde0: 20 72 65 73 32 3b 20 20 20 20 20 20 2f 2a 20 52   res2;      /* R
fdf0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d  esult of the com
fe00: 70 61 72 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20  parison of pIn1 
fe10: 61 67 61 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a  against pIn3 */.
fe20: 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b    char affinity;
fe30: 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
fe40: 79 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d  y to use for com
fe50: 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36  parison */.  u16
fe60: 20 66 6c 61 67 73 31 3b 20 20 20 20 20 20 20 20   flags1;        
fe70: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74   /* Copy of init
fe80: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e  ial value of pIn
fe90: 31 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31  1->flags */.  u1
fea0: 36 20 66 6c 61 67 73 33 3b 20 20 20 20 20 20 20  6 flags3;       
feb0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69    /* Copy of ini
fec0: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 49  tial value of pI
fed0: 6e 33 2d 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  n3->flags */..  
fee0: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
fef0: 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20  ->p1];.  pIn3 = 
ff00: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
ff10: 20 20 66 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d    flags1 = pIn1-
ff20: 3e 66 6c 61 67 73 3b 0a 20 20 66 6c 61 67 73 33  >flags;.  flags3
ff30: 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a   = pIn3->flags;.
ff40: 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20    if( (flags1 | 
ff50: 66 6c 61 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c  flags3)&MEM_Null
ff60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f   ){.    /* One o
ff70: 72 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20  r both operands 
ff80: 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20  are NULL */.    
ff90: 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
ffa0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20  LITE_NULLEQ ){. 
ffb0: 20 20 20 20 20 2f 2a 20 49 66 20 53 51 4c 49 54       /* If SQLIT
ffc0: 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74 20  E_NULLEQ is set 
ffd0: 28 77 68 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79  (which will only
ffe0: 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6f   happen if the o
fff0: 70 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 20  perator is.     
10000 20 2a 2a 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f   ** OP_Eq or OP_
10010 4e 65 29 20 74 68 65 6e 20 74 61 6b 65 20 74 68  Ne) then take th
10020 65 20 6a 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65  e jump or not de
10030 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
10040 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e  er.      ** or n
10050 6f 74 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  ot both operands
10060 20 61 72 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20   are null..     
10070 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10080 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
10090 50 5f 45 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  P_Eq || pOp->opc
100a0 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
100b0 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
100c0 67 73 31 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65  gs1 & MEM_Cleare
100d0 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
100e0 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20  ssert( (pOp->p5 
100f0 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  & SQLITE_JUMPIFN
10100 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ULL)==0 );.     
10110 20 69 66 28 20 28 66 6c 61 67 73 31 26 66 6c 61   if( (flags1&fla
10120 67 73 33 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  gs3&MEM_Null)!=0
10130 0a 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67  .       && (flag
10140 73 33 26 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d  s3&MEM_Cleared)=
10150 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
10160 20 20 20 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a      res = 0;  /*
10170 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 65 71   Operands are eq
10180 75 61 6c 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ual */.      }el
10190 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
101a0 3d 20 31 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64  = 1;  /* Operand
101b0 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20  s are not equal 
101c0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
101d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
101e0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20  QLITE_NULLEQ is 
101f0 63 6c 65 61 72 20 61 6e 64 20 61 74 20 6c 65 61  clear and at lea
10200 73 74 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69  st one operand i
10210 73 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a  s NULL,.      **
10220 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
10230 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e   is always NULL.
10240 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
10250 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  mp is taken if t
10260 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
10270 4e 55 4c 4c 20 62 69 74 20 69 73 20 73 65 74 2e  NULL bit is set.
10280 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10290 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
102a0 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
102b0 20 20 20 20 20 20 20 20 70 4f 75 74 20 3d 20 26          pOut = &
102c0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
102d0 20 20 20 20 20 20 20 69 43 6f 6d 70 61 72 65 20         iCompare 
102e0 3d 20 31 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61  = 1;    /* Opera
102f0 6e 64 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  nds are not equa
10300 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
10310 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
10320 20 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20   pOut);.        
10330 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
10340 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
10350 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
10360 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
10370 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pOut);.      }el
10380 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
10390 42 72 61 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29  BranchTaken(2,3)
103a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
103b0 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4a  p->p5 & SQLITE_J
103c0 55 4d 50 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20  UMPIFNULL ){.   
103d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70         goto jump
103e0 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20 20  _to_p2;.        
103f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
10410 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69  else{.    /* Nei
10420 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20  ther operand is 
10430 4e 55 4c 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70  NULL.  Do a comp
10440 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61  arison. */.    a
10450 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70  ffinity = pOp->p
10460 35 20 26 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d  5 & SQLITE_AFF_M
10470 41 53 4b 3b 0a 20 20 20 20 69 66 28 20 61 66 66  ASK;.    if( aff
10480 69 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46  inity>=SQLITE_AF
10490 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
104a0 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20 7c     if( (flags1 |
104b0 20 66 6c 61 67 73 33 29 26 4d 45 4d 5f 53 74 72   flags3)&MEM_Str
104c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
104d0 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49  (flags1 & (MEM_I
104e0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
104f0 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
10500 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c  {.          appl
10510 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
10520 28 70 49 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20  (pIn1,0);.      
10530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
10540 61 67 73 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67  ags3!=pIn3->flag
10550 73 20 29 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65  s ); /* Possible
10560 20 69 66 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a   if pIn1==pIn3 *
10570 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  /.          flag
10580 73 33 20 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73  s3 = pIn3->flags
10590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
105a0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33 20      if( (flags3 
105b0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
105c0 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d  eal|MEM_Str))==M
105d0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
105e0 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
105f0 41 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 30 29  Affinity(pIn3,0)
10600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10610 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e    }.      /* Han
10620 64 6c 65 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  dle the common c
10630 61 73 65 20 6f 66 20 69 6e 74 65 67 65 72 20 63  ase of integer c
10640 6f 6d 70 61 72 69 73 6f 6e 20 68 65 72 65 2c 20  omparison here, 
10650 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  as an.      ** o
10660 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20  ptimization, to 
10670 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
10680 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
10690 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  e() */.      if(
106a0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
106b0 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
106c0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
106d0 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75       if( pIn3->u
106e0 2e 69 20 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29  .i > pIn1->u.i )
106f0 7b 20 72 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f  { res = +1; goto
10700 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20   compare_op; }. 
10710 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 33 2d         if( pIn3-
10720 3e 75 2e 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69  >u.i < pIn1->u.i
10730 20 29 7b 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f   ){ res = -1; go
10740 74 6f 20 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d  to compare_op; }
10750 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30  .        res = 0
10760 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63  ;.        goto c
10770 6f 6d 70 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20  ompare_op;.     
10780 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
10790 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54   affinity==SQLIT
107a0 45 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20  E_AFF_TEXT ){.  
107b0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20      if( (flags1 
107c0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26  & MEM_Str)==0 &&
107d0 20 28 66 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f   (flags1 & (MEM_
107e0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d  Int|MEM_Real))!=
107f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73  0 ){.        tes
10800 74 63 61 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61  tcase( pIn1->fla
10810 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
10820 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10830 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
10840 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
10850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
10860 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31  emStringify(pIn1
10870 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a  , encoding, 1);.
10880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10890 28 20 28 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79  ( (flags1&MEM_Dy
108a0 6e 29 20 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61  n) != (pIn1->fla
108b0 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20  gs&MEM_Dyn) );. 
108c0 20 20 20 20 20 20 20 66 6c 61 67 73 31 20 3d 20         flags1 = 
108d0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e  (pIn1->flags & ~
108e0 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20  MEM_TypeMask) | 
108f0 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 54 79  (flags1 & MEM_Ty
10900 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  peMask);.       
10910 20 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70   assert( pIn1!=p
10920 49 6e 33 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  In3 );.      }. 
10930 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 33       if( (flags3
10940 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26   & MEM_Str)==0 &
10950 26 20 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d  & (flags3 & (MEM
10960 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21  _Int|MEM_Real))!
10970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
10980 73 74 63 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c  stcase( pIn3->fl
10990 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b  ags & MEM_Int );
109a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
109b0 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  e( pIn3->flags &
109c0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
109d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
109e0 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70 49 6e  MemStringify(pIn
109f0 33 2c 20 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b  3, encoding, 1);
10a00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10a10 65 28 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44  e( (flags3&MEM_D
10a20 79 6e 29 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c  yn) != (pIn3->fl
10a30 61 67 73 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a  ags&MEM_Dyn) );.
10a40 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20 3d          flags3 =
10a50 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
10a60 7e 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c  ~MEM_TypeMask) |
10a70 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54   (flags3 & MEM_T
10a80 79 70 65 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  ypeMask);.      
10a90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
10aa0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
10ab0 3d 50 34 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70  =P4_COLLSEQ || p
10ac0 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20  Op->p4.pColl==0 
10ad0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  );.    res = sql
10ae0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70  ite3MemCompare(p
10af0 49 6e 33 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e  In3, pIn1, pOp->
10b00 70 34 2e 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63  p4.pColl);.  }.c
10b10 6f 6d 70 61 72 65 5f 6f 70 3a 0a 20 20 73 77 69  ompare_op:.  swi
10b20 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
10b30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f   ){.    case OP_
10b40 45 71 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65  Eq:    res2 = re
10b50 73 3d 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b  s==0;     break;
10b60 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 3a  .    case OP_Ne:
10b70 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 3b 20      res2 = res; 
10b80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10b90 20 20 63 61 73 65 20 4f 50 5f 4c 74 3a 20 20 20    case OP_Lt:   
10ba0 20 72 65 73 32 20 3d 20 72 65 73 3c 30 3b 20 20   res2 = res<0;  
10bb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10bc0 61 73 65 20 4f 50 5f 4c 65 3a 20 20 20 20 72 65  ase OP_Le:    re
10bd0 73 32 20 3d 20 72 65 73 3c 3d 30 3b 20 20 20 20  s2 = res<=0;    
10be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10bf0 20 4f 50 5f 47 74 3a 20 20 20 20 72 65 73 32 20   OP_Gt:    res2 
10c00 3d 20 72 65 73 3e 30 3b 20 20 20 20 20 20 62 72  = res>0;      br
10c10 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
10c20 3a 20 20 20 20 20 20 20 72 65 73 32 20 3d 20 72  :       res2 = r
10c30 65 73 3e 3d 30 3b 20 20 20 20 20 62 72 65 61 6b  es>=0;     break
10c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f  ;.  }..  /* Undo
10c50 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
10c60 65 20 62 79 20 61 70 70 6c 79 41 66 66 69 6e 69  e by applyAffini
10c70 74 79 28 29 20 74 6f 20 74 68 65 20 69 6e 70 75  ty() to the inpu
10c80 74 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  t registers. */.
10c90 20 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d    assert( (pIn1-
10ca0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
10cb0 29 20 3d 3d 20 28 66 6c 61 67 73 31 20 26 20 4d  ) == (flags1 & M
10cc0 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 70 49 6e  EM_Dyn) );.  pIn
10cd0 31 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  1->flags = flags
10ce0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  1;.  assert( (pI
10cf0 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
10d00 44 79 6e 29 20 3d 3d 20 28 66 6c 61 67 73 33 20  Dyn) == (flags3 
10d10 26 20 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20  & MEM_Dyn) );.  
10d20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  pIn3->flags = fl
10d30 61 67 73 33 3b 0a 0a 20 20 69 66 28 20 70 4f 70  ags3;..  if( pOp
10d40 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54  ->p5 & SQLITE_ST
10d50 4f 52 45 50 32 20 29 7b 0a 20 20 20 20 70 4f 75  OREP2 ){.    pOu
10d60 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
10d70 32 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  2];.    iCompare
10d80 20 3d 20 72 65 73 3b 0a 20 20 20 20 72 65 73 32   = res;.    res2
10d90 20 3d 20 72 65 73 32 21 3d 30 3b 20 20 2f 2a 20   = res2!=0;  /* 
10da0 46 6f 72 20 74 68 69 73 20 70 61 74 68 20 72 65  For this path re
10db0 73 32 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  s2 must be exact
10dc0 6c 79 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 20  ly 0 or 1 */.   
10dd0 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20   if( (pOp->p5 & 
10de0 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 29  SQLITE_KEEPNULL)
10df0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
10e00 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66 6c 61  The KEEPNULL fla
10e10 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f 45 71  g prevents OP_Eq
10e20 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e   from overwritin
10e30 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20 31 0a  g a NULL with 1.
10e40 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 72 65        ** and pre
10e50 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72 6f 6d  vents OP_Ne from
10e60 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e 55 4c   overwriting NUL
10e70 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69 73 20  L with 0.  This 
10e80 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  flag.      ** is
10e90 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20 63 6f   only used in co
10ea0 6e 74 65 78 74 73 20 77 68 65 72 65 20 65 69 74  ntexts where eit
10eb0 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20 20 20  her:.      **   
10ec0 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (1) op==OP_Eq &&
10ed0 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c   (r[P2]==NULL ||
10ee0 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20 20 20   r[P2]==0).     
10ef0 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d 4f 50   **   (2) op==OP
10f00 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d 3d 4e  _Ne && (r[P2]==N
10f10 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d 31 29  ULL || r[P2]==1)
10f20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 66  .      ** Theref
10f30 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  ore it is not ne
10f40 63 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b  cessary to check
10f50 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
10f60 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20 20 20  r[P2] for.      
10f70 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20  ** NULL. */.    
10f80 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
10f90 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c 7c 20  pcode==OP_Ne || 
10fa0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
10fb0 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Eq );.      asse
10fc0 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c 20 72  rt( res2==0 || r
10fd0 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  es2==1 );.      
10fe0 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d 3d  testcase( res2==
10ff0 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0 && pOp->opcode
11000 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20  ==OP_Eq );.     
11010 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32 3d   testcase( res2=
11020 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64  =1 && pOp->opcod
11030 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20  e==OP_Eq );.    
11040 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
11050 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 && pOp->opco
11060 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  de==OP_Ne );.   
11070 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
11080 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==1 && pOp->opc
11090 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20  ode==OP_Ne );.  
110a0 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70      if( (pOp->op
110b0 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d 72 65  code==OP_Eq)==re
110c0 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  s2 ) break;.    
110d0 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f  }.    memAboutTo
110e0 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b  Change(p, pOut);
110f0 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
11100 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e  lag(pOut, MEM_In
11110 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  t);.    pOut->u.
11120 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20 52 45  i = res2;.    RE
11130 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
11140 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20 7d  ->p2, pOut);.  }
11150 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42 72  else{.    VdbeBr
11160 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
11170 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c  , (pOp->p5 & SQL
11180 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a 33 29  ITE_NULLEQ)?2:3)
11190 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32 20 29  ;.    if( res2 )
111a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  {.      goto jum
111b0 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20  p_to_p2;.    }. 
111c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
111d0 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65 4e 6f  * Opcode: ElseNo
111e0 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a  tEq * P2 * * *.*
111f0 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
11200 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74 65 6c   must immediatel
11210 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50 5f 4c  y follow an OP_L
11220 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d 70 61  t or OP_Gt compa
11230 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
11240 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f 66 20  ** If result of 
11250 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69  an OP_Eq compari
11260 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  son on the same 
11270 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20  two operands.** 
11280 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20 4e 55  would have be NU
11290 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30 29 2c  LL or false (0),
112a0 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d 70 20   then then jump 
112b0 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20 74 68  to P2. .** If th
112c0 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f  e result of an O
112d0 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f 6e 20  P_Eq comparison 
112e0 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65 76 69  on the two previ
112f0 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20  ous operands.** 
11300 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
11310 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e 20 66  true (1), then f
11320 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
11330 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f 74 45  case OP_ElseNotE
11340 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 73 61  q: {       /* sa
11350 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50 45 2c  me as TK_ESCAPE,
11360 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65 72   jump */.  asser
11370 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a 20 20  t( pOp>aOp );.  
11380 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e  assert( pOp[-1].
11390 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20 7c 7c  opcode==OP_Lt ||
113a0 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
113b0 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
113c0 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35 20 26  rt( pOp[-1].p5 &
113d0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
113e0 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
113f0 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21 3d 30  aken(iCompare!=0
11400 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43 6f 6d  , 2);.  if( iCom
11410 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f 20 6a  pare!=0 ) goto j
11420 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
11430 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64  ak;.}.../* Opcod
11440 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e 20 2a  e: Permutation *
11450 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20   * * P4 *.**.** 
11460 53 65 74 20 74 68 65 20 70 65 72 6d 75 74 61 74  Set the permutat
11470 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
11480 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65 72 61  OP_Compare opera
11490 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78 74 0a  tor in the next.
114a0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ** instruction. 
114b0 20 54 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   The permutation
114c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
114d0 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a 2a 2a  e P4 operand..**
114e0 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74 61 74  .** The permutat
114f0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ion is only vali
11500 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74  d until the next
11510 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68 61 74   OP_Compare that
11520 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50 46 4c   has.** the OPFL
11530 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 73  AG_PERMUTE bit s
11540 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69 63 61  et in P5. Typica
11550 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72 6d 75  lly the OP_Permu
11560 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 0a 2a  tation should .*
11570 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69 61 74  * occur immediat
11580 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ely prior to the
11590 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a 2a 0a   OP_Compare..**.
115a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  ** The first int
115b0 65 67 65 72 20 69 6e 20 74 68 65 20 50 34 20 69  eger in the P4 i
115c0 6e 74 65 67 65 72 20 61 72 72 61 79 20 69 73 20  nteger array is 
115d0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
115e0 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64 20 64  e array.** and d
115f0 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65 20 70  oes not become p
11600 61 72 74 20 6f 66 20 74 68 65 20 70 65 72 6d 75  art of the permu
11610 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  tation..*/.case 
11620 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 3a 20  OP_Permutation: 
11630 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  {.  assert( pOp-
11640 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 41  >p4type==P4_INTA
11650 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65 72 74  RRAY );.  assert
11660 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29 3b 0a  ( pOp->p4.ai );.
11670 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d    assert( pOp[1]
11680 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6d 70  .opcode==OP_Comp
11690 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  are );.  assert(
116a0 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f 50 46   pOp[1].p5 & OPF
116b0 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b 0a 20  LAG_PERMUTE );. 
116c0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
116d0 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20 50 31  code: Compare P1
116e0 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
116f0 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 40 50  Synopsis: r[P1@P
11700 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33 5d 0a  3] <-> r[P2@P3].
11710 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  **.** Compare tw
11720 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72 65 67  o vectors of reg
11730 69 73 74 65 72 73 20 69 6e 20 72 65 67 28 50 31  isters in reg(P1
11740 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31 29 20  )..reg(P1+P3-1) 
11750 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 76 65  (call this.** ve
11760 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20 69 6e  ctor "A") and in
11770 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28 50 32   reg(P2)..reg(P2
11780 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20 20 53  +P3-1) ("B").  S
11790 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
117a0 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  f.** the compari
117b0 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79 20 74  son for use by t
117c0 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d 70 20  he next OP_Jump 
117d0 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20  instruct..**.** 
117e0 49 66 20 50 35 20 68 61 73 20 74 68 65 20 4f 50  If P5 has the OP
117f0 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
11800 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6f   set, then the o
11810 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72 69 73  rder of comparis
11820 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72 6d 69  on is.** determi
11830 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ned by the most 
11840 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d 75 74  recent OP_Permut
11850 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  ation operator. 
11860 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46 4c 41   If the.** OPFLA
11870 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20 69 73  G_PERMUTE bit is
11880 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65 67   clear, then reg
11890 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70 61 72  ister are compar
118a0 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69 61 6c  ed in sequential
118b0 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a  .** order..**.**
118c0 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e 66 6f   P4 is a KeyInfo
118d0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
118e0 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74 69 6e  defines collatin
118f0 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20  g sequences and 
11900 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73 20 66  sort.** orders f
11910 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
11920 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74  n.  The permutat
11930 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f 20 72  ion applies to r
11940 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e 6c 79  egisters.** only
11950 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 65  .  The KeyInfo e
11960 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73 65 64  lements are used
11970 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e 0a 2a   sequentially..*
11980 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
11990 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20 63 6f  son is a sort co
119a0 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e 55 4c  mparison, so NUL
119b0 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  Ls compare equal
119c0 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65 20 6c  ,.** NULLs are l
119d0 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65 72 73  ess than numbers
119e0 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6c 65  , numbers are le
119f0 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67 73 2c  ss than strings,
11a00 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67 73 20  .** and strings 
11a10 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 62 6c  are less than bl
11a20 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  obs..*/.case OP_
11a30 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69 6e 74  Compare: {.  int
11a40 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
11a50 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70 32 3b  nt p1;.  int p2;
11a60 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
11a70 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e   *pKeyInfo;.  in
11a80 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53 65 71  t idx;.  CollSeq
11a90 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43   *pColl;    /* C
11aa0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
11ab0 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68 69 73  e to use on this
11ac0 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   term */.  int b
11ad0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Rev;          /*
11ae0 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 45 4e   True for DESCEN
11af0 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65 72 20  DING sort order 
11b00 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
11b10 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  te;     /* The p
11b20 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a 0a 20  ermutation */.. 
11b30 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26 20   if( (pOp->p5 & 
11b40 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3d  OPFLAG_PERMUTE)=
11b50 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72 6d 75  =0 ){.    aPermu
11b60 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  te = 0;.  }else{
11b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
11b80 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73 73 65  >aOp );.    asse
11b90 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
11ba0 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61 74 69  de==OP_Permutati
11bb0 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  on );.    assert
11bc0 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79 70 65  ( pOp[-1].p4type
11bd0 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 29 3b  ==P4_INTARRAY );
11be0 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20 3d 20  .    aPermute = 
11bf0 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20 2b 20  pOp[-1].p4.ai + 
11c00 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  1;.    assert( a
11c10 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a 20 20  Permute!=0 );.  
11c20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  }.  n = pOp->p3;
11c30 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  .  pKeyInfo = pO
11c40 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
11c50 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
11c60 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
11c70 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31 20 3d  nfo!=0 );.  p1 =
11c80 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32 20 3d   pOp->p1;.  p2 =
11c90 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64 65 66   pOp->p2;.#ifdef
11ca0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11cb0 69 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a  if( aPermute ){.
11cc0 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20 3d 20      int k, mx = 
11cd0 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  0;.    for(k=0; 
11ce0 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20 61 50  k<n; k++) if( aP
11cf0 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29 20 6d  ermute[k]>mx ) m
11d00 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3b  x = aPermute[k];
11d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
11d20 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70 2d 3e  0 && p1+mx<=(p->
11d30 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
11d40 73 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73  sor)+1 );.    as
11d50 73 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32  sert( p2>0 && p2
11d60 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  +mx<=(p->nMem+1 
11d70 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
11d80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11d90 61 73 73 65 72 74 28 20 70 31 3e 30 20 26 26 20  assert( p1>0 && 
11da0 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  p1+n<=(p->nMem+1
11db0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31   - p->nCursor)+1
11dc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11dd0 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d 28 70  p2>0 && p2+n<=(p
11de0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
11df0 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 7d 0a  ursor)+1 );.  }.
11e00 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11e10 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f 72 28  _DEBUG */.  for(
11e20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
11e30 20 20 20 20 69 64 78 20 3d 20 61 50 65 72 6d 75      idx = aPermu
11e40 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b 69 5d  te ? aPermute[i]
11e50 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74   : i;.    assert
11e60 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
11e70 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b 0a 20  em[p1+idx]) );. 
11e80 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
11e90 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32 2b 69  Valid(&aMem[p2+i
11ea0 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  dx]) );.    REGI
11eb0 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b 69 64  STER_TRACE(p1+id
11ec0 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d  x, &aMem[p1+idx]
11ed0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
11ee0 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20 26 61  TRACE(p2+idx, &a
11ef0 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a 20 20  Mem[p2+idx]);.  
11f00 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b 65 79    assert( i<pKey
11f10 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Info->nField );.
11f20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 4b 65 79      pColl = pKey
11f30 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 3b 0a  Info->aColl[i];.
11f40 20 20 20 20 62 52 65 76 20 3d 20 70 4b 65 79 49      bRev = pKeyI
11f50 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
11f60 69 5d 3b 0a 20 20 20 20 69 43 6f 6d 70 61 72 65  i];.    iCompare
11f70 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
11f80 70 61 72 65 28 26 61 4d 65 6d 5b 70 31 2b 69 64  pare(&aMem[p1+id
11f90 78 5d 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78  x], &aMem[p2+idx
11fa0 5d 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 69  ], pColl);.    i
11fb0 66 28 20 69 43 6f 6d 70 61 72 65 20 29 7b 0a 20  f( iCompare ){. 
11fc0 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 20       if( bRev ) 
11fd0 69 43 6f 6d 70 61 72 65 20 3d 20 2d 69 43 6f 6d  iCompare = -iCom
11fe0 70 61 72 65 3b 0a 20 20 20 20 20 20 62 72 65 61  pare;.      brea
11ff0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  k;.    }.  }.  b
12000 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12010 64 65 3a 20 4a 75 6d 70 20 50 31 20 50 32 20 50  de: Jump P1 P2 P
12020 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
12030 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
12040 69 6f 6e 20 61 74 20 61 64 64 72 65 73 73 20 50  ion at address P
12050 31 2c 20 50 32 2c 20 6f 72 20 50 33 20 64 65 70  1, P2, or P3 dep
12060 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
12070 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 6f 73 74  r.** in the most
12080 20 72 65 63 65 6e 74 20 4f 50 5f 43 6f 6d 70 61   recent OP_Compa
12090 72 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  re instruction t
120a0 68 65 20 50 31 20 76 65 63 74 6f 72 20 77 61 73  he P1 vector was
120b0 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 65 71   less than.** eq
120c0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
120d0 65 72 20 74 68 61 6e 20 74 68 65 20 50 32 20 76  er than the P2 v
120e0 65 63 74 6f 72 2c 20 72 65 73 70 65 63 74 69 76  ector, respectiv
120f0 65 6c 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ely..*/.case OP_
12100 4a 75 6d 70 3a 20 7b 20 20 20 20 20 20 20 20 20  Jump: {         
12110 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20      /* jump */. 
12120 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3c 30 20   if( iCompare<0 
12130 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
12140 68 54 61 6b 65 6e 28 30 2c 33 29 3b 20 70 4f 70  hTaken(0,3); pOp
12150 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 31 20   = &aOp[pOp->p1 
12160 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  - 1];.  }else if
12170 28 20 69 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ( iCompare==0 ){
12180 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54  .    VdbeBranchT
12190 61 6b 65 6e 28 31 2c 33 29 3b 20 70 4f 70 20 3d  aken(1,3); pOp =
121a0 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20   &aOp[pOp->p2 - 
121b0 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
121c0 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
121d0 28 32 2c 33 29 3b 20 70 4f 70 20 3d 20 26 61 4f  (2,3); pOp = &aO
121e0 70 5b 70 4f 70 2d 3e 70 33 20 2d 20 31 5d 3b 0a  p[pOp->p3 - 1];.
121f0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12200 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 6e 64 20 50  /* Opcode: And P
12210 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
12220 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
12230 72 5b 50 31 5d 20 26 26 20 72 5b 50 32 5d 29 0a  r[P1] && r[P2]).
12240 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
12250 6f 67 69 63 61 6c 20 41 4e 44 20 6f 66 20 74 68  ogical AND of th
12260 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69  e values in regi
12270 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 32 20  sters P1 and P2 
12280 61 6e 64 0a 2a 2a 20 77 72 69 74 65 20 74 68 65  and.** write the
12290 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72 65 67   result into reg
122a0 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  ister P3..**.** 
122b0 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72 20  If either P1 or 
122c0 50 32 20 69 73 20 30 20 28 66 61 6c 73 65 29 20  P2 is 0 (false) 
122d0 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
122e0 69 73 20 30 20 65 76 65 6e 20 69 66 0a 2a 2a 20  is 0 even if.** 
122f0 74 68 65 20 6f 74 68 65 72 20 69 6e 70 75 74 20  the other input 
12300 69 73 20 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c  is NULL.  A NULL
12310 20 61 6e 64 20 74 72 75 65 20 6f 72 20 74 77 6f   and true or two
12320 20 4e 55 4c 4c 73 20 67 69 76 65 0a 2a 2a 20 61   NULLs give.** a
12330 20 4e 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f   NULL output..*/
12340 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 72 20 50  ./* Opcode: Or P
12350 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
12360 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 28  ynopsis: r[P3]=(
12370 72 5b 50 31 5d 20 7c 7c 20 72 5b 50 32 5d 29 0a  r[P1] || r[P2]).
12380 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20 6c  **.** Take the l
12390 6f 67 69 63 61 6c 20 4f 52 20 6f 66 20 74 68 65  ogical OR of the
123a0 20 76 61 6c 75 65 73 20 69 6e 20 72 65 67 69 73   values in regis
123b0 74 65 72 20 50 31 20 61 6e 64 20 50 32 20 61 6e  ter P1 and P2 an
123c0 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 61  d.** store the a
123d0 6e 73 77 65 72 20 69 6e 20 72 65 67 69 73 74 65  nswer in registe
123e0 72 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  r P3..**.** If e
123f0 69 74 68 65 72 20 50 31 20 6f 72 20 50 32 20 69  ither P1 or P2 i
12400 73 20 6e 6f 6e 7a 65 72 6f 20 28 74 72 75 65 29  s nonzero (true)
12410 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
12420 20 69 73 20 31 20 28 74 72 75 65 29 0a 2a 2a 20   is 1 (true).** 
12430 65 76 65 6e 20 69 66 20 74 68 65 20 6f 74 68 65  even if the othe
12440 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e  r input is NULL.
12450 20 20 41 20 4e 55 4c 4c 20 61 6e 64 20 66 61 6c    A NULL and fal
12460 73 65 20 6f 72 20 74 77 6f 20 4e 55 4c 4c 73 0a  se or two NULLs.
12470 2a 2a 20 67 69 76 65 20 61 20 4e 55 4c 4c 20 6f  ** give a NULL o
12480 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f  utput..*/.case O
12490 50 5f 41 6e 64 3a 20 20 20 20 20 20 20 20 20 20  P_And:          
124a0 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
124b0 4b 5f 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c  K_AND, in1, in2,
124c0 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50   out3 */.case OP
124d0 5f 4f 72 3a 20 7b 20 20 20 20 20 20 20 20 20 20  _Or: {          
124e0 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
124f0 5f 4f 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  _OR, in1, in2, o
12500 75 74 33 20 2a 2f 0a 20 20 69 6e 74 20 76 31 3b  ut3 */.  int v1;
12510 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72      /* Left oper
12520 61 6e 64 3a 20 20 30 3d 3d 46 41 4c 53 45 2c 20  and:  0==FALSE, 
12530 31 3d 3d 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e  1==TRUE, 2==UNKN
12540 4f 57 4e 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  OWN or NULL */. 
12550 20 69 6e 74 20 76 32 3b 20 20 20 20 2f 2a 20 52   int v2;    /* R
12560 69 67 68 74 20 6f 70 65 72 61 6e 64 3a 20 30 3d  ight operand: 0=
12570 3d 46 41 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c  =FALSE, 1==TRUE,
12580 20 32 3d 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e   2==UNKNOWN or N
12590 55 4c 4c 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d  ULL */..  pIn1 =
125a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
125b0 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61  .  if( pIn1->fla
125c0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
125d0 0a 20 20 20 20 76 31 20 3d 20 32 3b 0a 20 20 7d  .    v1 = 2;.  }
125e0 65 6c 73 65 7b 0a 20 20 20 20 76 31 20 3d 20 73  else{.    v1 = s
125f0 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c  qlite3VdbeIntVal
12600 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 20 20 7d  ue(pIn1)!=0;.  }
12610 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
12620 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
12630 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn2->flags & ME
12640 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 76 32  M_Null ){.    v2
12650 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
12660 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
12670 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32  dbeIntValue(pIn2
12680 29 21 3d 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )!=0;.  }.  if( 
12690 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
126a0 41 6e 64 20 29 7b 0a 20 20 20 20 73 74 61 74 69  And ){.    stati
126b0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
126c0 20 63 68 61 72 20 61 6e 64 5f 6c 6f 67 69 63 5b   char and_logic[
126d0 5d 20 3d 20 7b 20 30 2c 20 30 2c 20 30 2c 20 30  ] = { 0, 0, 0, 0
126e0 2c 20 31 2c 20 32 2c 20 30 2c 20 32 2c 20 32 20  , 1, 2, 0, 2, 2 
126f0 7d 3b 0a 20 20 20 20 76 31 20 3d 20 61 6e 64 5f  };.    v1 = and_
12700 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
12710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
12720 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
12730 65 64 20 63 68 61 72 20 6f 72 5f 6c 6f 67 69 63  ed char or_logic
12740 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
12750 31 2c 20 31 2c 20 31 2c 20 32 2c 20 31 2c 20 32  1, 1, 1, 2, 1, 2
12760 20 7d 3b 0a 20 20 20 20 76 31 20 3d 20 6f 72 5f   };.    v1 = or_
12770 6c 6f 67 69 63 5b 76 31 2a 33 2b 76 32 5d 3b 0a  logic[v1*3+v2];.
12780 20 20 7d 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d    }.  pOut = &aM
12790 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69  em[pOp->p3];.  i
127a0 66 28 20 76 31 3d 3d 32 20 29 7b 0a 20 20 20 20  f( v1==2 ){.    
127b0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
127c0 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  Out, MEM_Null);.
127d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4f 75    }else{.    pOu
127e0 74 2d 3e 75 2e 69 20 3d 20 76 31 3b 0a 20 20 20  t->u.i = v1;.   
127f0 20 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28   MemSetTypeFlag(
12800 70 4f 75 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a  pOut, MEM_Int);.
12810 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12820 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 20 50  /* Opcode: Not P
12830 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
12840 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 20 21  nopsis: r[P2]= !
12850 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  r[P1].**.** Inte
12860 72 70 72 65 74 20 74 68 65 20 76 61 6c 75 65 20  rpret the value 
12870 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 61  in register P1 a
12880 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  s a boolean valu
12890 65 2e 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a  e.  Store the.**
128a0 20 62 6f 6f 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d   boolean complem
128b0 65 6e 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ent in register 
128c0 50 32 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  P2.  If the valu
128d0 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  e in register P1
128e0 20 69 73 20 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68   is .** NULL, th
128f0 65 6e 20 61 20 4e 55 4c 4c 20 69 73 20 73 74 6f  en a NULL is sto
12900 72 65 64 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61  red in P2..*/.ca
12910 73 65 20 4f 50 5f 4e 6f 74 3a 20 7b 20 20 20 20  se OP_Not: {    
12920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
12930 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54 2c 20 69  ame as TK_NOT, i
12940 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20 20 70 49  n1, out2 */.  pI
12950 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
12960 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p1];.  pOut = &a
12970 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
12980 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
12990 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 69  tNull(pOut);.  i
129a0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
129b0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
129c0 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
129d0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
129e0 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 21 73 71   pOut->u.i = !sq
129f0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
12a00 65 28 70 49 6e 31 29 3b 0a 20 20 7d 0a 20 20 62  e(pIn1);.  }.  b
12a10 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
12a20 64 65 3a 20 42 69 74 4e 6f 74 20 50 31 20 50 32  de: BitNot P1 P2
12a30 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
12a40 69 73 3a 20 72 5b 50 31 5d 3d 20 7e 72 5b 50 31  is: r[P1]= ~r[P1
12a50 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ].**.** Interpre
12a60 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  t the content of
12a70 20 72 65 67 69 73 74 65 72 20 50 31 20 61 73 20   register P1 as 
12a80 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 53 74 6f  an integer.  Sto
12a90 72 65 20 74 68 65 0a 2a 2a 20 6f 6e 65 73 2d 63  re the.** ones-c
12aa0 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  omplement of the
12ab0 20 50 31 20 76 61 6c 75 65 20 69 6e 74 6f 20 72   P1 value into r
12ac0 65 67 69 73 74 65 72 20 50 32 2e 20 20 49 66 20  egister P2.  If 
12ad0 50 31 20 68 6f 6c 64 73 0a 2a 2a 20 61 20 4e 55  P1 holds.** a NU
12ae0 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 61 20  LL then store a 
12af0 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a 2a 2f 0a 63  NULL in P2..*/.c
12b00 61 73 65 20 4f 50 5f 42 69 74 4e 6f 74 3a 20 7b  ase OP_BitNot: {
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 4e 4f  same as TK_BITNO
12b30 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a  T, in1, out2 */.
12b40 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
12b50 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Op->p1];.  pOut 
12b60 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
12b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
12b80 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b  emSetNull(pOut);
12b90 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
12ba0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
12bb0 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  =0 ){.    pOut->
12bc0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
12bd0 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  .    pOut->u.i =
12be0 20 7e 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74   ~sqlite3VdbeInt
12bf0 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20 7d  Value(pIn1);.  }
12c00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12c10 4f 70 63 6f 64 65 3a 20 4f 6e 63 65 20 50 31 20  Opcode: Once P1 
12c20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 49  P2 * * *.**.** I
12c30 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69  f the P1 value i
12c40 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 50  s equal to the P
12c50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4f  1 value on the O
12c60 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 20 61 74  P_Init opcode at
12c70 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  .** instruction 
12c80 30 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  0, then jump to 
12c90 50 32 2e 20 20 49 66 20 74 68 65 20 74 77 6f 20  P2.  If the two 
12ca0 50 31 20 76 61 6c 75 65 73 20 64 69 66 66 65 72  P1 values differ
12cb0 2c 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 68  , then.** set th
12cc0 65 20 50 31 20 76 61 6c 75 65 20 6f 6e 20 74 68  e P1 value on th
12cd0 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 65 71 75  is opcode to equ
12ce0 61 6c 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  al the P1 value 
12cf0 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69 74 0a 2a  on the OP_Init.*
12d00 2a 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75  * and fall throu
12d10 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  gh..*/.case OP_O
12d20 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
12d30 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20     /* jump */.  
12d40 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 5b 30  assert( p->aOp[0
12d50 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ].opcode==OP_Ini
12d60 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  t );.  VdbeBranc
12d70 68 54 61 6b 65 6e 28 70 2d 3e 61 4f 70 5b 30 5d  hTaken(p->aOp[0]
12d80 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 2c 20 32 29  .p1==pOp->p1, 2)
12d90 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30  ;.  if( p->aOp[0
12da0 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b  ].p1==pOp->p1 ){
12db0 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
12dc0 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  o_p2;.  }else{. 
12dd0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 2d 3e     pOp->p1 = p->
12de0 61 4f 70 5b 30 5d 2e 70 31 3b 0a 20 20 7d 0a 20  aOp[0].p1;.  }. 
12df0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
12e00 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32 20 50  code: If P1 P2 P
12e10 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70  3 * *.**.** Jump
12e20 20 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61   to P2 if the va
12e30 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
12e40 50 31 20 69 73 20 74 72 75 65 2e 20 20 54 68 65  P1 is true.  The
12e50 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e   value.** is con
12e60 73 69 64 65 72 65 64 20 74 72 75 65 20 69 66 20  sidered true if 
12e70 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20 61 6e  it is numeric an
12e80 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20  d non-zero.  If 
12e90 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20  the value.** in 
12ea0 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  P1 is NULL then 
12eb0 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
12ec0 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20   and only if P3 
12ed0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  is non-zero..*/.
12ee0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 6f 74  /* Opcode: IfNot
12ef0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
12f00 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  .** Jump to P2 i
12f10 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
12f20 65 67 69 73 74 65 72 20 50 31 20 69 73 20 46 61  egister P1 is Fa
12f30 6c 73 65 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  lse.  The value.
12f40 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
12f50 20 66 61 6c 73 65 20 69 66 20 69 74 20 68 61 73   false if it has
12f60 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65   a numeric value
12f70 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66 20 74 68   of zero.  If th
12f80 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31  e value.** in P1
12f90 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 61   is NULL then ta
12fa0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61  ke the jump if a
12fb0 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33 20 69 73  nd only if P3 is
12fc0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 63 61   non-zero..*/.ca
12fd0 73 65 20 4f 50 5f 49 66 3a 20 20 20 20 20 20 20  se OP_If:       
12fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
12ff0 70 2c 20 69 6e 31 20 2a 2f 0a 63 61 73 65 20 4f  p, in1 */.case O
13000 50 5f 49 66 4e 6f 74 3a 20 7b 20 20 20 20 20 20  P_IfNot: {      
13010 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
13020 6e 31 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 0a 20  n1 */.  int c;. 
13030 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
13040 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49  p->p1];.  if( pI
13050 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
13060 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 63 20 3d 20  Null ){.    c = 
13070 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 65 6c 73 65  pOp->p3;.  }else
13080 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13090 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
130a0 49 4e 54 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  INT.    c = sqli
130b0 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28  te3VdbeIntValue(
130c0 70 49 6e 31 29 21 3d 30 3b 0a 23 65 6c 73 65 0a  pIn1)!=0;.#else.
130d0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
130e0 64 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e  dbeRealValue(pIn
130f0 31 29 21 3d 30 2e 30 3b 0a 23 65 6e 64 69 66 0a  1)!=0.0;.#endif.
13100 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
13110 6f 64 65 3d 3d 4f 50 5f 49 66 4e 6f 74 20 29 20  ode==OP_IfNot ) 
13120 63 20 3d 20 21 63 3b 0a 20 20 7d 0a 20 20 56 64  c = !c;.  }.  Vd
13130 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 63 21  beBranchTaken(c!
13140 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 63 20  =0, 2);.  if( c 
13150 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ){.    goto jump
13160 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
13170 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
13180 65 3a 20 49 73 4e 75 6c 6c 20 50 31 20 50 32 20  e: IsNull P1 P2 
13190 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
131a0 73 3a 20 69 66 20 72 5b 50 31 5d 3d 3d 4e 55 4c  s: if r[P1]==NUL
131b0 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  L goto P2.**.** 
131c0 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68  Jump to P2 if th
131d0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
131e0 74 65 72 20 50 31 20 69 73 20 4e 55 4c 4c 2e 0a  ter P1 is NULL..
131f0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 73 4e 75 6c  */.case OP_IsNul
13200 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l: {            
13210 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 49 53  /* same as TK_IS
13220 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
13230 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13240 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
13250 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
13260 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
13270 4d 5f 4e 75 6c 6c 29 21 3d 30 2c 20 32 29 3b 0a  M_Null)!=0, 2);.
13280 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
13290 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d  gs & MEM_Null)!=
132a0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
132b0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
132c0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
132d0 6f 64 65 3a 20 4e 6f 74 4e 75 6c 6c 20 50 31 20  ode: NotNull P1 
132e0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
132f0 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d  psis: if r[P1]!=
13300 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  NULL goto P2.**.
13310 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66  ** Jump to P2 if
13320 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
13330 67 69 73 74 65 72 20 50 31 20 69 73 20 6e 6f 74  gister P1 is not
13340 20 4e 55 4c 4c 2e 20 20 0a 2a 2f 0a 63 61 73 65   NULL.  .*/.case
13350 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3a 20 7b 20 20   OP_NotNull: {  
13360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
13370 65 20 61 73 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  e as TK_NOTNULL,
13380 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
13390 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
133a0 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
133b0 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
133c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
133d0 6c 29 3d 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)==0, 2);.  if(
133e0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
133f0 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a  MEM_Null)==0 ){.
13400 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
13410 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
13420 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
13430 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33 20  Column P1 P2 P3 
13440 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
13450 73 3a 20 72 5b 50 33 5d 3d 50 58 0a 2a 2a 0a 2a  s: r[P3]=PX.**.*
13460 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
13470 64 61 74 61 20 74 68 61 74 20 63 75 72 73 6f 72  data that cursor
13480 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 20 61 73   P1 points to as
13490 20 61 20 73 74 72 75 63 74 75 72 65 20 62 75 69   a structure bui
134a0 6c 74 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  lt using.** the 
134b0 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74 72  MakeRecord instr
134c0 75 63 74 69 6f 6e 2e 20 20 28 53 65 65 20 74 68  uction.  (See th
134d0 65 20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  e MakeRecord opc
134e0 6f 64 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ode for addition
134f0 61 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  al.** informatio
13500 6e 20 61 62 6f 75 74 20 74 68 65 20 66 6f 72 6d  n about the form
13510 61 74 20 6f 66 20 74 68 65 20 64 61 74 61 2e 29  at of the data.)
13520 20 20 45 78 74 72 61 63 74 20 74 68 65 20 50 32    Extract the P2
13530 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 66 72  -th column.** fr
13540 6f 6d 20 74 68 69 73 20 72 65 63 6f 72 64 2e 20  om this record. 
13550 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   If there are le
13560 73 73 20 74 68 61 74 20 28 50 32 2b 31 29 20 0a  ss that (P2+1) .
13570 2a 2a 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ** values in the
13580 20 72 65 63 6f 72 64 2c 20 65 78 74 72 61 63 74   record, extract
13590 20 61 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54   a NULL..**.** T
135a0 68 65 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  he value extract
135b0 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ed is stored in 
135c0 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a  register P3..**.
135d0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ** If the column
135e0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
135f0 74 68 61 6e 20 50 32 20 66 69 65 6c 64 73 2c 20  than P2 fields, 
13600 74 68 65 6e 20 65 78 74 72 61 63 74 20 61 20 4e  then extract a N
13610 55 4c 4c 2e 20 20 4f 72 2c 0a 2a 2a 20 69 66 20  ULL.  Or,.** if 
13620 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e 74 20  the P4 argument 
13630 69 73 20 61 20 50 34 5f 4d 45 4d 20 75 73 65 20  is a P4_MEM use 
13640 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13650 20 50 34 20 61 72 67 75 6d 65 6e 74 20 61 73 0a   P4 argument as.
13660 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  ** the result..*
13670 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c  *.** If the OPFL
13680 41 47 5f 43 4c 45 41 52 43 41 43 48 45 20 62 69  AG_CLEARCACHE bi
13690 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 20 61  t is set on P5 a
136a0 6e 64 20 50 31 20 69 73 20 61 20 70 73 65 75 64  nd P1 is a pseud
136b0 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 0a  o-table cursor,.
136c0 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 61 63 68  ** then the cach
136d0 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
136e0 69 73 20 72 65 73 65 74 20 70 72 69 6f 72 20 74  is reset prior t
136f0 6f 20 65 78 74 72 61 63 74 69 6e 67 20 74 68 65  o extracting the
13700 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20   column..** The 
13710 66 69 72 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  first OP_Column 
13720 61 67 61 69 6e 73 74 20 61 20 70 73 65 75 64 6f  against a pseudo
13730 2d 74 61 62 6c 65 20 61 66 74 65 72 20 74 68 65  -table after the
13740 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f   value of the co
13750 6e 74 65 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  ntent.** registe
13760 72 20 68 61 73 20 63 68 61 6e 67 65 64 20 73 68  r has changed sh
13770 6f 75 6c 64 20 68 61 76 65 20 74 68 69 73 20 62  ould have this b
13780 69 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  it set..**.** If
13790 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c 45 4e 47   the OPFLAG_LENG
137a0 54 48 41 52 47 20 61 6e 64 20 4f 50 46 4c 41 47  THARG and OPFLAG
137b0 5f 54 59 50 45 4f 46 41 52 47 20 62 69 74 73 20  _TYPEOFARG bits 
137c0 61 72 65 20 73 65 74 20 6f 6e 20 50 35 20 77 68  are set on P5 wh
137d0 65 6e 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  en.** the result
137e0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
137f0 6f 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 61  o only be used a
13800 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6f  s the argument o
13810 66 20 61 20 6c 65 6e 67 74 68 28 29 0a 2a 2a 20  f a length().** 
13820 6f 72 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63  or typeof() func
13830 74 69 6f 6e 2c 20 72 65 73 70 65 63 74 69 76 65  tion, respective
13840 6c 79 2e 20 20 54 68 65 20 6c 6f 61 64 69 6e 67  ly.  The loading
13850 20 6f 66 20 6c 61 72 67 65 20 62 6c 6f 62 73 20   of large blobs 
13860 63 61 6e 20 62 65 0a 2a 2a 20 73 6b 69 70 70 65  can be.** skippe
13870 64 20 66 6f 72 20 6c 65 6e 67 74 68 28 29 20 61  d for length() a
13880 6e 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 6c  nd all content l
13890 6f 61 64 69 6e 67 20 63 61 6e 20 62 65 20 73 6b  oading can be sk
138a0 69 70 70 65 64 20 66 6f 72 20 74 79 70 65 6f 66  ipped for typeof
138b0 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  ()..*/.case OP_C
138c0 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 69 6e 74 20 70  olumn: {.  int p
138d0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  2;            /*
138e0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 74   column number t
138f0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
13900 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 20  VdbeCursor *pC; 
13910 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
13920 75 72 73 6f 72 20 2a 2f 0a 20 20 42 74 43 75 72  ursor */.  BtCur
13930 73 6f 72 20 2a 70 43 72 73 72 3b 20 20 20 2f 2a  sor *pCrsr;   /*
13940 20 54 68 65 20 42 54 72 65 65 20 63 75 72 73 6f   The BTree curso
13950 72 20 2a 2f 0a 20 20 75 33 32 20 2a 61 4f 66 66  r */.  u32 *aOff
13960 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 61 4f 66  set;      /* aOf
13970 66 73 65 74 5b 69 5d 20 69 73 20 6f 66 66 73 65  fset[i] is offse
13980 74 20 74 6f 20 73 74 61 72 74 20 6f 66 20 64 61  t to start of da
13990 74 61 20 66 6f 72 20 69 2d 74 68 20 63 6f 6c 75  ta for i-th colu
139a0 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  mn */.  int len;
139b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
139c0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
139d0 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
139e0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a  for the column *
139f0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
13a00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13a10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4d 65 6d 20  ounter */.  Mem 
13a20 2a 70 44 65 73 74 3b 20 20 20 20 20 20 20 20 2f  *pDest;        /
13a30 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
13a40 20 74 68 65 20 65 78 74 72 61 63 74 65 64 20 76   the extracted v
13a50 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 73 4d  alue */.  Mem sM
13a60 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
13a70 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20  For storing the 
13a80 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
13a90 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
13aa0 75 38 20 2a 7a 44 61 74 61 3b 20 20 20 2f 2a 20  u8 *zData;   /* 
13ab0 50 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  Part of the reco
13ac0 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
13ad0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
13ae0 7a 48 64 72 3b 20 20 20 20 2f 2a 20 4e 65 78 74  zHdr;    /* Next
13af0 20 75 6e 70 61 72 73 65 64 20 62 79 74 65 20 6f   unparsed byte o
13b00 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
13b10 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 45 6e 64    const u8 *zEnd
13b20 48 64 72 3b 20 2f 2a 20 50 6f 69 6e 74 65 72 20  Hdr; /* Pointer 
13b30 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 61 66  to first byte af
13b40 74 65 72 20 74 68 65 20 68 65 61 64 65 72 20 2a  ter the header *
13b50 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 3b 20  /.  u32 offset; 
13b60 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
13b70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 2a   into the data *
13b80 2f 0a 20 20 75 36 34 20 6f 66 66 73 65 74 36 34  /.  u64 offset64
13b90 3b 20 20 20 20 20 20 2f 2a 20 36 34 2d 62 69 74  ;      /* 64-bit
13ba0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
13bb0 20 61 76 61 69 6c 3b 20 20 20 20 20 20 20 20 20   avail;         
13bc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
13bd0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
13be0 64 61 74 61 20 2a 2f 0a 20 20 75 33 32 20 74 3b  data */.  u32 t;
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c00 41 20 74 79 70 65 20 63 6f 64 65 20 66 72 6f 6d  A type code from
13c10 20 74 68 65 20 72 65 63 6f 72 64 20 68 65 61 64   the record head
13c20 65 72 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 65  er */.  Mem *pRe
13c30 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 73  g;         /* Ps
13c40 65 75 64 6f 54 61 62 6c 65 20 69 6e 70 75 74 20  eudoTable input 
13c50 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 70  register */..  p
13c60 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
13c70 2d 3e 70 31 5d 3b 0a 20 20 70 32 20 3d 20 70 4f  ->p1];.  p2 = pO
13c80 70 2d 3e 70 32 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->p2;..  /* If 
13c90 74 68 65 20 63 75 72 73 6f 72 20 63 61 63 68 65  the cursor cache
13ca0 20 69 73 20 73 74 61 6c 65 2c 20 62 72 69 6e 67   is stale, bring
13cb0 20 69 74 20 75 70 2d 74 6f 2d 64 61 74 65 20 2a   it up-to-date *
13cc0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
13cd0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
13ce0 28 26 70 43 2c 20 26 70 32 29 3b 0a 20 20 69 66  (&pC, &p2);.  if
13cf0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
13d00 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
13d10 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
13d20 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c  p3>0 && pOp->p3<
13d30 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
13d40 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 70  >nCursor) );.  p
13d50 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  Dest = &aMem[pOp
13d60 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75  ->p3];.  memAbou
13d70 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 44 65  tToChange(p, pDe
13d80 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  st);.  assert( p
13d90 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
13da0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
13db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  );.  assert( pC!
13dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13dd0 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 20 29 3b  p2<pC->nField );
13de0 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 70 43 2d  .  aOffset = pC-
13df0 3e 61 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  >aOffset;.  asse
13e00 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
13e10 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29  !=CURTYPE_VTAB )
13e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
13e30 65 43 75 72 54 79 70 65 21 3d 43 55 52 54 59 50  eCurType!=CURTYP
13e40 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e  E_PSEUDO || pC->
13e50 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 61 73 73  nullRow );.  ass
13e60 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
13e70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52 54 45  e!=CURTYPE_SORTE
13e80 52 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 2d 3e  R );..  if( pC->
13e90 63 61 63 68 65 53 74 61 74 75 73 21 3d 70 2d 3e  cacheStatus!=p->
13ea0 63 61 63 68 65 43 74 72 20 29 7b 20 20 20 20 20  cacheCtr ){     
13eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f 50 54             /*OPT
13ec0 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
13ed0 53 45 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 2d  SE*/.    if( pC-
13ee0 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  >nullRow ){.    
13ef0 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72 54 79    if( pC->eCurTy
13f00 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55  pe==CURTYPE_PSEU
13f10 44 4f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  DO ){.        as
13f20 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 73 65  sert( pC->uc.pse
13f30 75 64 6f 54 61 62 6c 65 52 65 67 3e 30 20 29 3b  udoTableReg>0 );
13f40 0a 20 20 20 20 20 20 20 20 70 52 65 67 20 3d 20  .        pReg = 
13f50 26 61 4d 65 6d 5b 70 43 2d 3e 75 63 2e 70 73 65  &aMem[pC->uc.pse
13f60 75 64 6f 54 61 62 6c 65 52 65 67 5d 3b 0a 20 20  udoTableReg];.  
13f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13f80 65 67 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  eg->flags & MEM_
13f90 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
13fa0 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
13fb0 69 64 28 70 52 65 67 29 20 29 3b 0a 20 20 20 20  id(pReg) );.    
13fc0 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53      pC->payloadS
13fd0 69 7a 65 20 3d 20 70 43 2d 3e 73 7a 52 6f 77 20  ize = pC->szRow 
13fe0 3d 20 61 76 61 69 6c 20 3d 20 70 52 65 67 2d 3e  = avail = pReg->
13ff0 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 61  n;.        pC->a
14000 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 65 67 2d  Row = (u8*)pReg-
14010 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  >z;.      }else{
14020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14030 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
14040 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 67  Dest);.        g
14050 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75  oto op_column_ou
14060 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
14070 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 72 73  else{.      pCrs
14080 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
14090 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
140a0 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
140b0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
140c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
140d0 43 72 73 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Crsr );.      as
140e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
140f0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
14100 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20 20 20  pCrsr) );.      
14110 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20  pC->payloadSize 
14120 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
14130 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73 72 29  yloadSize(pCrsr)
14140 3b 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f 77  ;.      pC->aRow
14150 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
14160 61 79 6c 6f 61 64 46 65 74 63 68 28 70 43 72 73  ayloadFetch(pCrs
14170 72 2c 20 26 61 76 61 69 6c 29 3b 0a 20 20 20 20  r, &avail);.    
14180 20 20 61 73 73 65 72 74 28 20 61 76 61 69 6c 3c    assert( avail<
14190 3d 36 35 35 33 36 20 29 3b 20 20 2f 2a 20 4d 61  =65536 );  /* Ma
141a0 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65 20  ximum page size 
141b0 69 73 20 36 34 4b 69 42 20 2a 2f 0a 20 20 20 20  is 64KiB */.    
141c0 20 20 69 66 28 20 70 43 2d 3e 70 61 79 6c 6f 61    if( pC->payloa
141d0 64 53 69 7a 65 20 3c 3d 20 28 75 33 32 29 61 76  dSize <= (u32)av
141e0 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ail ){.        p
141f0 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 43 2d 3e 70  C->szRow = pC->p
14200 61 79 6c 6f 61 64 53 69 7a 65 3b 0a 20 20 20 20  ayloadSize;.    
14210 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e    }else if( pC->
14220 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75  payloadSize > (u
14230 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
14240 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14250 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  H] ){.        go
14260 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20  to too_big;.    
14270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14280 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 61 76 61   pC->szRow = ava
14290 69 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  il;.      }.    
142a0 7d 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  }.    pC->cacheS
142b0 74 61 74 75 73 20 3d 20 70 2d 3e 63 61 63 68 65  tatus = p->cache
142c0 43 74 72 3b 0a 20 20 20 20 70 43 2d 3e 69 48 64  Ctr;.    pC->iHd
142d0 72 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72  rOffset = getVar
142e0 69 6e 74 33 32 28 70 43 2d 3e 61 52 6f 77 2c 20  int32(pC->aRow, 
142f0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 70 43 2d  offset);.    pC-
14300 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 30 3b  >nHdrParsed = 0;
14310 0a 20 20 20 20 61 4f 66 66 73 65 74 5b 30 5d 20  .    aOffset[0] 
14320 3d 20 6f 66 66 73 65 74 3b 0a 0a 0a 20 20 20 20  = offset;...    
14330 69 66 28 20 61 76 61 69 6c 3c 6f 66 66 73 65 74  if( avail<offset
14340 20 29 7b 20 20 20 20 20 20 2f 2a 4f 50 54 49 4d   ){      /*OPTIM
14350 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45  IZATION-IF-FALSE
14360 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 43 2d 3e  */.      /* pC->
14370 61 52 6f 77 20 64 6f 65 73 20 6e 6f 74 20 68 61  aRow does not ha
14380 76 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  ve to hold the e
14390 6e 74 69 72 65 20 72 6f 77 2c 20 62 75 74 20 69  ntire row, but i
143a0 74 20 64 6f 65 73 20 61 74 20 6c 65 61 73 74 0a  t does at least.
143b0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f        ** need to
143c0 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64 65   cover the heade
143d0 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e  r of the record.
143e0 20 20 49 66 20 70 43 2d 3e 61 52 6f 77 20 64 6f    If pC->aRow do
143f0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 20  es not contain. 
14400 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70       ** the comp
14410 6c 65 74 65 20 68 65 61 64 65 72 2c 20 74 68 65  lete header, the
14420 6e 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  n set it to zero
14430 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 68 65  , forcing the he
14440 61 64 65 72 20 74 6f 20 62 65 0a 20 20 20 20 20  ader to be.     
14450 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
14460 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
14470 20 20 20 20 70 43 2d 3e 61 52 6f 77 20 3d 20 30      pC->aRow = 0
14480 3b 0a 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f  ;.      pC->szRo
14490 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
144a0 20 4d 61 6b 65 20 73 75 72 65 20 61 20 63 6f 72   Make sure a cor
144b0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 68 61  rupt database ha
144c0 73 20 6e 6f 74 20 67 69 76 65 6e 20 75 73 20 61  s not given us a
144d0 6e 20 6f 76 65 72 73 69 7a 65 20 68 65 61 64 65  n oversize heade
144e0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 44 6f 20 74  r..      ** Do t
144f0 68 69 73 20 6e 6f 77 20 74 6f 20 61 76 6f 69 64  his now to avoid
14500 20 61 6e 20 6f 76 65 72 73 69 7a 65 20 6d 65 6d   an oversize mem
14510 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a  ory allocation..
14520 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
14530 2a 20 54 79 70 65 20 65 6e 74 72 69 65 73 20 63  * Type entries c
14540 61 6e 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  an be between 1 
14550 61 6e 64 20 35 20 62 79 74 65 73 20 65 61 63 68  and 5 bytes each
14560 2e 20 20 42 75 74 20 34 20 61 6e 64 20 35 20 62  .  But 4 and 5 b
14570 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  yte.      ** typ
14580 65 73 20 75 73 65 20 73 6f 20 6d 75 63 68 20 64  es use so much d
14590 61 74 61 20 73 70 61 63 65 20 74 68 61 74 20 74  ata space that t
145a0 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62 65  here can only be
145b0 20 34 30 39 36 20 61 6e 64 20 33 32 20 6f 66 0a   4096 and 32 of.
145c0 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 2c 20 72        ** them, r
145d0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 53 6f  espectively.  So
145e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 61   the maximum hea
145f0 64 65 72 20 6c 65 6e 67 74 68 20 72 65 73 75 6c  der length resul
14600 74 73 20 66 72 6f 6d 20 61 0a 20 20 20 20 20 20  ts from a.      
14610 2a 2a 20 33 2d 62 79 74 65 20 74 79 70 65 20 66  ** 3-byte type f
14620 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20 6d  or each of the m
14630 61 78 69 6d 75 6d 20 6f 66 20 33 32 37 36 38 20  aximum of 32768 
14640 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
14650 65 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72  ee.      ** extr
14660 61 20 62 79 74 65 73 20 66 6f 72 20 74 68 65 20  a bytes for the 
14670 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20 69 74  header length it
14680 73 65 6c 66 2e 20 20 33 32 37 36 38 2a 33 20 2b  self.  32768*3 +
14690 20 33 20 3d 20 39 38 33 30 37 2e 0a 20 20 20 20   3 = 98307..    
146a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
146b0 66 66 73 65 74 20 3e 20 39 38 33 30 37 20 7c 7c  ffset > 98307 ||
146c0 20 6f 66 66 73 65 74 20 3e 20 70 43 2d 3e 70 61   offset > pC->pa
146d0 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a 20 20 20  yloadSize ){.   
146e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
146f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
14700 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
14710 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
14720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14730 65 20 69 66 28 20 6f 66 66 73 65 74 3e 30 20 29  e if( offset>0 )
14740 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  { /*OPTIMIZATION
14750 2d 49 46 2d 54 52 55 45 2a 2f 0a 20 20 20 20 20  -IF-TRUE*/.     
14760 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
14770 67 20 67 6f 74 6f 20 69 73 20 61 6e 20 6f 70 74  g goto is an opt
14780 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 63  imization.  It c
14790 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 6e  an be omitted an
147a0 64 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 72 79  d.      ** every
147b0 74 68 69 6e 67 20 77 69 6c 6c 20 73 74 69 6c 6c  thing will still
147c0 20 77 6f 72 6b 2e 20 20 42 75 74 20 4f 50 5f 43   work.  But OP_C
147d0 6f 6c 75 6d 6e 20 69 73 20 6d 65 61 73 75 72 61  olumn is measura
147e0 62 6c 79 20 66 61 73 74 65 72 0a 20 20 20 20 20  bly faster.     
147f0 20 2a 2a 20 62 79 20 73 6b 69 70 70 69 6e 67 20   ** by skipping 
14800 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 63  the subsequent c
14810 6f 6e 64 69 74 69 6f 6e 61 6c 2c 20 77 68 69 63  onditional, whic
14820 68 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65  h is always true
14830 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14840 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
14850 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
14860 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
14870 3d 70 32 20 29 3b 20 20 20 20 20 20 20 20 20 2f  =p2 );         /
14880 2a 20 43 6f 6e 64 69 74 69 6f 6e 61 6c 20 73 6b  * Conditional sk
14890 69 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 67  ipped */.      g
148a0 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65  oto op_column_re
148b0 61 64 5f 68 65 61 64 65 72 3b 0a 20 20 20 20 7d  ad_header;.    }
148c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
148d0 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 74 68  sure at least th
148e0 65 20 66 69 72 73 74 20 70 32 2b 31 20 65 6e 74  e first p2+1 ent
148f0 72 69 65 73 20 6f 66 20 74 68 65 20 68 65 61 64  ries of the head
14900 65 72 20 68 61 76 65 20 62 65 65 6e 0a 20 20 2a  er have been.  *
14910 2a 20 70 61 72 73 65 64 20 61 6e 64 20 76 61 6c  * parsed and val
14920 69 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  id information i
14930 73 20 69 6e 20 61 4f 66 66 73 65 74 5b 5d 20 61  s in aOffset[] a
14940 6e 64 20 70 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a  nd pC->aType[]..
14950 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 2d 3e 6e    */.  if( pC->n
14960 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29 7b  HdrParsed<=p2 ){
14970 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14980 20 69 73 20 6d 6f 72 65 20 68 65 61 64 65 72 20   is more header 
14990 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 70 61  available for pa
149a0 72 73 69 6e 67 20 69 6e 20 74 68 65 20 72 65 63  rsing in the rec
149b0 6f 72 64 2c 20 74 72 79 0a 20 20 20 20 2a 2a 20  ord, try.    ** 
149c0 74 6f 20 65 78 74 72 61 63 74 20 61 64 64 69 74  to extract addit
149d0 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 75 70 20  ional fields up 
149e0 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2b 31  through the p2+1
149f0 2d 74 68 20 66 69 65 6c 64 20 0a 20 20 20 20 2a  -th field .    *
14a00 2f 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69 48  /.    if( pC->iH
14a10 64 72 4f 66 66 73 65 74 3c 61 4f 66 66 73 65 74  drOffset<aOffset
14a20 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
14a30 4d 61 6b 65 20 73 75 72 65 20 7a 44 61 74 61 20  Make sure zData 
14a40 70 6f 69 6e 74 73 20 74 6f 20 65 6e 6f 75 67 68  points to enough
14a50 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 74   of the record t
14a60 6f 20 63 6f 76 65 72 20 74 68 65 20 68 65 61 64  o cover the head
14a70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
14a80 20 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a   pC->aRow==0 ){.
14a90 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
14aa0 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sMem, 0, sizeof(
14ab0 73 4d 65 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  sMem));.        
14ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
14ad0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
14ae0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
14af0 61 4f 66 66 73 65 74 5b 30 5d 2c 20 26 73 4d 65  aOffset[0], &sMe
14b00 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  m);.        if( 
14b10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
14b20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
14b30 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  o_error;.       
14b40 20 7a 44 61 74 61 20 3d 20 28 75 38 2a 29 73 4d   zData = (u8*)sM
14b50 65 6d 2e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  em.z;.      }els
14b60 65 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 61  e{.        zData
14b70 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20 20   = pC->aRow;.   
14b80 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
14b90 20 46 69 6c 6c 20 69 6e 20 70 43 2d 3e 61 54 79   Fill in pC->aTy
14ba0 70 65 5b 69 5d 20 61 6e 64 20 61 4f 66 66 73 65  pe[i] and aOffse
14bb0 74 5b 69 5d 20 76 61 6c 75 65 73 20 74 68 72 6f  t[i] values thro
14bc0 75 67 68 20 74 68 65 20 70 32 2d 74 68 20 66 69  ugh the p2-th fi
14bd0 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 6f 70 5f 63  eld. */.    op_c
14be0 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65  olumn_read_heade
14bf0 72 3a 0a 20 20 20 20 20 20 69 20 3d 20 70 43 2d  r:.      i = pC-
14c00 3e 6e 48 64 72 50 61 72 73 65 64 3b 0a 20 20 20  >nHdrParsed;.   
14c10 20 20 20 6f 66 66 73 65 74 36 34 20 3d 20 61 4f     offset64 = aO
14c20 66 66 73 65 74 5b 69 5d 3b 0a 20 20 20 20 20 20  ffset[i];.      
14c30 7a 48 64 72 20 3d 20 7a 44 61 74 61 20 2b 20 70  zHdr = zData + p
14c40 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3b 0a 20  C->iHdrOffset;. 
14c50 20 20 20 20 20 7a 45 6e 64 48 64 72 20 3d 20 7a       zEndHdr = z
14c60 44 61 74 61 20 2b 20 61 4f 66 66 73 65 74 5b 30  Data + aOffset[0
14c70 5d 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ];.      do{.   
14c80 20 20 20 20 20 69 66 28 20 28 74 20 3d 20 7a 48       if( (t = zH
14c90 64 72 5b 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20  dr[0])<0x80 ){. 
14ca0 20 20 20 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b           zHdr++;
14cb0 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
14cc0 74 36 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64  t64 += sqlite3Vd
14cd0 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
14ce0 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20  ypeLen(t);.     
14cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d00 20 20 20 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69      zHdr += sqli
14d10 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a  te3GetVarint32(z
14d20 48 64 72 2c 20 26 74 29 3b 0a 20 20 20 20 20 20  Hdr, &t);.      
14d30 20 20 20 20 6f 66 66 73 65 74 36 34 20 2b 3d 20      offset64 += 
14d40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14d50 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20  lTypeLen(t);.   
14d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
14d70 43 2d 3e 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20  C->aType[i++] = 
14d80 74 3b 0a 20 20 20 20 20 20 20 20 61 4f 66 66 73  t;.        aOffs
14d90 65 74 5b 69 5d 20 3d 20 28 75 33 32 29 28 6f 66  et[i] = (u32)(of
14da0 66 73 65 74 36 34 20 26 20 30 78 66 66 66 66 66  fset64 & 0xfffff
14db0 66 66 66 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  fff);.      }whi
14dc0 6c 65 28 20 69 3c 3d 70 32 20 26 26 20 7a 48 64  le( i<=p2 && zHd
14dd0 72 3c 7a 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20  r<zEndHdr );..  
14de0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
14df0 64 20 69 73 20 63 6f 72 72 75 70 74 20 69 66 20  d is corrupt if 
14e00 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
14e10 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
14e20 20 20 20 20 20 2a 2a 20 28 31 29 20 74 68 65 20       ** (1) the 
14e30 62 79 74 65 73 20 6f 66 20 74 68 65 20 68 65 61  bytes of the hea
14e40 64 65 72 20 65 78 74 65 6e 64 20 70 61 73 74 20  der extend past 
14e50 74 68 65 20 64 65 63 6c 61 72 65 64 20 68 65 61  the declared hea
14e60 64 65 72 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  der size.      *
14e70 2a 20 28 32 29 20 74 68 65 20 65 6e 74 69 72 65  * (2) the entire
14e80 20 68 65 61 64 65 72 20 77 61 73 20 75 73 65 64   header was used
14e90 20 62 75 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74   but not all dat
14ea0 61 20 77 61 73 20 75 73 65 64 0a 20 20 20 20 20  a was used.     
14eb0 20 2a 2a 20 28 33 29 20 74 68 65 20 65 6e 64 20   ** (3) the end 
14ec0 6f 66 20 74 68 65 20 64 61 74 61 20 65 78 74 65  of the data exte
14ed0 6e 64 73 20 62 65 79 6f 6e 64 20 74 68 65 20 65  nds beyond the e
14ee0 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  nd of the record
14ef0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14f00 20 69 66 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64   if( (zHdr>=zEnd
14f10 48 64 72 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e  Hdr && (zHdr>zEn
14f20 64 48 64 72 20 7c 7c 20 6f 66 66 73 65 74 36 34  dHdr || offset64
14f30 21 3d 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a  !=pC->payloadSiz
14f40 65 29 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f  e)).       || (o
14f50 66 66 73 65 74 36 34 20 3e 20 70 43 2d 3e 70 61  ffset64 > pC->pa
14f60 79 6c 6f 61 64 53 69 7a 65 29 0a 20 20 20 20 20  yloadSize).     
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14f80 70 43 2d 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71  pC->aRow==0 ) sq
14f90 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
14fa0 61 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20  ase(&sMem);.    
14fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14fc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14fd0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
14fe0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
14ff0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 43       }..      pC
15000 2d 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 69  ->nHdrParsed = i
15010 3b 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64 72  ;.      pC->iHdr
15020 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 28 7a  Offset = (u32)(z
15030 48 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20  Hdr - zData);.  
15040 20 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77      if( pC->aRow
15050 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
15060 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65  eMemRelease(&sMe
15070 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
15080 20 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20 20       t = 0;.    
15090 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74  }..    /* If aft
150a0 65 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74  er trying to ext
150b0 72 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73  ract new entries
150c0 20 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72   from the header
150d0 2c 20 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a  , nHdrParsed is.
150e0 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74      ** still not
150f0 20 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20   up to p2, that 
15100 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
15110 65 63 6f 72 64 20 68 61 73 20 66 65 77 65 72 20  ecord has fewer 
15120 74 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63  than p2.    ** c
15130 6f 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20  olumns.  So the 
15140 72 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65  result will be e
15150 69 74 68 65 72 20 74 68 65 20 64 65 66 61 75 6c  ither the defaul
15160 74 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c  t value or a NUL
15170 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
15180 28 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  ( pC->nHdrParsed
15190 3c 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66  <=p2 ){.      if
151a0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
151b0 34 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  4_MEM ){.       
151c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
151d0 68 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74  hallowCopy(pDest
151e0 2c 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20  , pOp->p4.pMem, 
151f0 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20  MEM_Static);.   
15200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15210 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
15220 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a  SetNull(pDest);.
15230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
15240 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74  to op_column_out
15250 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15260 0a 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79  .    t = pC->aTy
15270 70 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  pe[p2];.  }..  /
15280 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f  * Extract the co
15290 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32  ntent for the p2
152a0 2b 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43  +1-th column.  C
152b0 6f 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a  ontrol can only.
152c0 20 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20    ** reach this 
152d0 70 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74  point if aOffset
152e0 5b 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32  [p2], aOffset[p2
152f0 2b 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79  +1], and pC->aTy
15300 70 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20  pe[p2] are.  ** 
15310 61 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a  all valid..  */.
15320 20 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d    assert( p2<pC-
15330 3e 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20  >nHdrParsed );. 
15340 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
15350 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
15360 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
15370 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
15380 73 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66  s(pDest) );.  if
15390 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63  ( VdbeMemDynamic
153a0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 73  (pDest) ){.    s
153b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
153c0 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 7d  Null(pDest);.  }
153d0 0a 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70 43  .  assert( t==pC
153e0 2d 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a 20  ->aType[p2] );. 
153f0 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e 3d   if( pC->szRow>=
15400 61 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29 7b  aOffset[p2+1] ){
15410 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
15420 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
15430 77 68 65 72 65 20 74 68 65 20 64 65 73 69 72 65  where the desire
15440 64 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20 6f  d content fits o
15450 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  n the original. 
15460 20 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68 65     ** page - whe
15470 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  re the content i
15480 73 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65 72  s not on an over
15490 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 20  flow page */.   
154a0 20 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f   zData = pC->aRo
154b0 77 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d 3b  w + aOffset[p2];
154c0 0a 20 20 20 20 69 66 28 20 74 3c 31 32 20 29 7b  .    if( t<12 ){
154d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
154e0 62 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61 74  beSerialGet(zDat
154f0 61 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  a, t, pDest);.  
15500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
15510 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
15520 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
15530 67 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65 72  g, we need a per
15540 73 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20 6e  sistent value, n
15550 6f 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d 45  ot.      ** a ME
15560 4d 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20 20  M_Ephem value.  
15570 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
15580 20 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74 20   fast short-cut 
15590 74 68 61 74 20 69 73 20 65 71 75 69 76 61 6c 65  that is equivale
155a0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 63  nt.      ** to c
155b0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 64  alling sqlite3Vd
155c0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
155d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 65  d sqlite3VdbeDee
155e0 70 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a 20  phemeralize().. 
155f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
15600 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
15610 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
15620 6c 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  lob, MEM_Str|MEM
15630 5f 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20 70  _Term };.      p
15640 44 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d 20  Dest->n = len = 
15650 28 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  (t-12)/2;.      
15660 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
15670 6f 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66 28  oding;.      if(
15680 20 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f 63   pDest->szMalloc
15690 20 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20 20   < len+2 ){.    
156a0 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
156b0 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
156c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
156d0 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65 73  VdbeMemGrow(pDes
156e0 74 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20 67  t, len+2, 0) ) g
156f0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
15700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15710 20 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65 73   pDest->z = pDes
15720 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20  t->zMalloc;.    
15730 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
15740 28 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74 61  (pDest->z, zData
15750 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70 44  , len);.      pD
15760 65 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30 3b  est->z[len] = 0;
15770 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b  .      pDest->z[
15780 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  len+1] = 0;.    
15790 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d    pDest->flags =
157a0 20 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20 20   aFlag[t&1];.   
157b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
157c0 70 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63  pDest->enc = enc
157d0 6f 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54 68  oding;.    /* Th
157e0 69 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e  is branch happen
157f0 73 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74  s only when cont
15800 65 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c  ent is on overfl
15810 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ow pages */.    
15820 69 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20  if( ((pOp->p5 & 
15830 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  (OPFLAG_LENGTHAR
15840 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  G|OPFLAG_TYPEOFA
15850 52 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RG))!=0.        
15860 20 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20    && ((t>=12 && 
15870 28 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f  (t&1)==0) || (pO
15880 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54  p->p5 & OPFLAG_T
15890 59 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20  YPEOFARG)!=0)). 
158a0 20 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71      || (len = sq
158b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
158c0 79 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20  ypeLen(t))==0.  
158d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f    ){.      /* Co
158e0 6e 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76  ntent is irrelev
158f0 61 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ant for.      **
15900 20 20 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f      1. the typeo
15910 66 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20  f() function,.  
15920 20 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65      **    2. the
15930 20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74   length(X) funct
15940 69 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c  ion if X is a bl
15950 6f 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ob, and.      **
15960 20 20 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f      3. if the co
15970 6e 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20  ntent length is 
15980 7a 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53  zero..      ** S
15990 6f 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65  o we might as we
159a0 6c 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e  ll use bogus con
159b0 74 65 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e  tent rather than
159c0 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a   reading.      *
159d0 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  * content from d
159e0 69 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  isk. .      **. 
159f0 20 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67 68       ** Although
15a00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15a10 61 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61 64  alGet() may read
15a20 20 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65 73   at most 8 bytes
15a30 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20   from the.      
15a40 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ** buffer passed
15a50 20 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69 6e   to it, debuggin
15a60 67 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65 4d  g function VdbeM
15a70 65 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29 20  emPrettyPrint() 
15a80 6d 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  may.      ** rea
15a90 64 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20 31  d up to 16. So 1
15aa0 36 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75 73  6 bytes of bogus
15ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70 70   content is supp
15ac0 6c 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lied..      */. 
15ad0 20 20 20 20 20 73 74 61 74 69 63 20 75 38 20 61       static u8 a
15ae0 5a 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54 68  Zero[16];  /* Th
15af0 69 73 20 69 73 20 74 68 65 20 62 6f 67 75 73 20  is is the bogus 
15b00 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20  content */.     
15b10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15b20 61 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20  alGet(aZero, t, 
15b30 70 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  pDest);.    }els
15b40 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
15b50 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
15b60 42 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75  Btree(pC->uc.pCu
15b70 72 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70 32  rsor, aOffset[p2
15b80 5d 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a  ], len, pDest);.
15b90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15ba0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
15bb0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
15bc0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
15bd0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 63  VdbeSerialGet((c
15be0 6f 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d 3e  onst u8*)pDest->
15bf0 7a 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20  z, t, pDest);.  
15c00 20 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73      pDest->flags
15c10 20 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a   &= ~MEM_Ephem;.
15c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f      }.  }..op_co
15c30 6c 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41  lumn_out:.  UPDA
15c40 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
15c50 70 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54  pDest);.  REGIST
15c60 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
15c70 2c 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61  , pDest);.  brea
15c80 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
15c90 20 41 66 66 69 6e 69 74 79 20 50 31 20 50 32 20   Affinity P1 P2 
15ca0 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
15cb0 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b 50  is: affinity(r[P
15cc0 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70  1@P2]).**.** App
15cd0 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f  ly affinities to
15ce0 20 61 20 72 61 6e 67 65 20 6f 66 20 50 32 20 72   a range of P2 r
15cf0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
15d00 67 20 77 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a  g with P1..**.**
15d10 20 50 34 20 69 73 20 61 20 73 74 72 69 6e 67 20   P4 is a string 
15d20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72 61  that is P2 chara
15d30 63 74 65 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20  cters long. The 
15d40 6e 74 68 20 63 68 61 72 61 63 74 65 72 20 6f 66  nth character of
15d50 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69   the.** string i
15d60 6e 64 69 63 61 74 65 73 20 74 68 65 20 63 6f 6c  ndicates the col
15d70 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 68 61  umn affinity tha
15d80 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
15d90 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20   for the nth.** 
15da0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74  memory cell in t
15db0 68 65 20 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73  he range..*/.cas
15dc0 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b  e OP_Affinity: {
15dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15de0 41 66 66 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54  Affinity;   /* T
15df0 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62  he affinity to b
15e00 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63  e applied */.  c
15e10 68 61 72 20 63 41 66 66 3b 20 20 20 20 20 20 20  har cAff;       
15e20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
15e30 67 6c 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  gle character of
15e40 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20   affinity */..  
15e50 7a 41 66 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d  zAffinity = pOp-
15e60 3e 70 34 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28  >p4.z;.  assert(
15e70 20 7a 41 66 66 69 6e 69 74 79 21 3d 30 20 29 3b   zAffinity!=0 );
15e80 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
15e90 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30  nity[pOp->p2]==0
15ea0 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   );.  pIn1 = &aM
15eb0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77  em[pOp->p1];.  w
15ec0 68 69 6c 65 28 20 28 63 41 66 66 20 3d 20 2a 28  hile( (cAff = *(
15ed0 7a 41 66 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30  zAffinity++))!=0
15ee0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15ef0 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
15f00 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  [(p->nMem+1 - p-
15f10 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20  >nCursor)] );.  
15f20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
15f30 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
15f40 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
15f50 70 49 6e 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f  pIn1, cAff, enco
15f60 64 69 6e 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b  ding);.    pIn1+
15f70 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  +;.  }.  break;.
15f80 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
15f90 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
15fa0 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
15fb0 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28  is: r[P3]=mkrec(
15fc0 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  r[P1@P2]).**.** 
15fd0 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69 73  Convert P2 regis
15fe0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
15ff0 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20  ith P1 into the 
16000 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a  [record format].
16010 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74 61  ** use as a data
16020 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
16030 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
16040 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
16050 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f   index.  The OP_
16060 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61  Column opcode ca
16070 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 63  n decode the rec
16080 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a  ord later..**.**
16090 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72   P4 may be a str
160a0 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
160b0 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
160c0 20 54 68 65 20 6e 74 68 20 63 68 61 72 61 63 74   The nth charact
160d0 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72  er of the.** str
160e0 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  ing indicates th
160f0 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
16100 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  y that should be
16110 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6e 74   used for the nt
16120 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  h.** field of th
16130 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a  e index key..**.
16140 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67 20 66  ** The mapping f
16150 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20 74 6f  rom character to
16160 20 61 66 66 69 6e 69 74 79 20 69 73 20 67 69 76   affinity is giv
16170 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  en by the SQLITE
16180 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20  _AFF_.** macros 
16190 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
161a0 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66  eInt.h..**.** If
161b0 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P4 is NULL then
161c0 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65 6c 64   all index field
161d0 73 20 68 61 76 65 20 74 68 65 20 61 66 66 69 6e  s have the affin
161e0 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73  ity BLOB..*/.cas
161f0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a  e OP_MakeRecord:
16200 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52 65 63   {.  u8 *zNewRec
16210 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  ord;        /* A
16220 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
16230 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
16240 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
16250 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20 20 20   Mem *pRec;     
16260 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
16270 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75  ew record */.  u
16280 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  64 nData;       
16290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
162a0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
162b0 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20   space */.  int 
162c0 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  nHdr;           
162d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
162e0 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  bytes of header 
162f0 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e  space */.  i64 n
16300 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
16310 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63 65 20    /* Data space 
16320 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
16330 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36  s record */.  i6
16340 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20 20 20  4 nZero;        
16350 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16360 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  f zero bytes at 
16370 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
16380 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
16390 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20 20 20  Varint;         
163a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
163b0 79 74 65 73 20 69 6e 20 61 20 76 61 72 69 6e 74  ytes in a varint
163c0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
163d0 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  _type;       /* 
163e0 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Type field */.  
163f0 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20 20 20  Mem *pData0;    
16400 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16410 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62  field to be comb
16420 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 72 65  ined into the re
16430 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  cord */.  Mem *p
16440 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
16450 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64 20 6f   /* Last field o
16460 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
16470 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20    int nField;   
16480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16490 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
164a0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
164b0 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b  char *zAffinity;
164c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 66         /* The af
164d0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 66 6f  finity string fo
164e0 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  r the record */.
164f0 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61    int file_forma
16500 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  t;       /* File
16510 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65 20 66   format to use f
16520 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  or encoding */. 
16530 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16540 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
16550 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63   used in zNewRec
16560 6f 72 64 5b 5d 20 68 65 61 64 65 72 20 2a 2f 0a  ord[] header */.
16570 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
16580 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
16590 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52 65  e used in zNewRe
165a0 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 6e 74 20 2a  cord[] content *
165b0 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
165c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
165d0 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c 64 20  ngth of a field 
165e0 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e  */..  /* Assumin
165f0 67 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  g the record con
16600 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20  tains N fields, 
16610 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
16620 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b  t looks.  ** lik
16630 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
16640 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
16650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20  ----------.  ** 
16690 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74 79 70  | hdr-size | typ
166a0 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c 20 2e  e 0 | type 1 | .
166b0 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20 7c 20  .. | type N-1 | 
166c0 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20 64 61  data0 | ... | da
166d0 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d  ta N-1 | .  ** -
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16720 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a  -------.  **.  *
16730 2a 20 44 61 74 61 28 30 29 20 69 73 20 74 61 6b  * Data(0) is tak
16740 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  en from register
16750 20 50 31 2e 20 20 44 61 74 61 28 31 29 20 63 6f   P1.  Data(1) co
16760 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73 74 65  mes from registe
16770 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e 64 20  r P1+1.  ** and 
16780 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20  so forth..  **. 
16790 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20 66 69   ** Each type fi
167a0 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e 74 20  eld is a varint 
167b0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
167c0 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   serial type of 
167d0 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72 65 73  the .  ** corres
167e0 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65 6c 65  ponding data ele
167f0 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69 74 65  ment (see sqlite
16800 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
16810 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68 64 72  )). The.  ** hdr
16820 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
16830 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77 68 69  lso a varint whi
16840 63 68 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ch is the offset
16850 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
16860 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
16870 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61 30 2e  record to data0.
16880 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20 3d 20  .  */.  nData = 
16890 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
168a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
168b0 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f 0a 20   data space */. 
168c0 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20 20 20   nHdr = 0;      
168d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
168e0 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   bytes of header
168f0 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a 65 72   space */.  nZer
16900 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  o = 0;         /
16910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f  * Number of zero
16920 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
16930 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  d of the record 
16940 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  */.  nField = pO
16950 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69  p->p1;.  zAffini
16960 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  ty = pOp->p4.z;.
16970 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
16980 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20  >0 && pOp->p2>0 
16990 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c  && pOp->p2+nFiel
169a0 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  d<=(p->nMem+1 - 
169b0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
169c0 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61 4d 65  .  pData0 = &aMe
169d0 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69  m[nField];.  nFi
169e0 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  eld = pOp->p2;. 
169f0 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74 61 30   pLast = &pData0
16a00 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69  [nField-1];.  fi
16a10 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d  le_format = p->m
16a20 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
16a30 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  t;..  /* Identif
16a40 79 20 74 68 65 20 6f 75 74 70 75 74 20 72 65 67  y the output reg
16a50 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  ister */.  asser
16a60 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e  t( pOp->p3<pOp->
16a70 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70  p1 || pOp->p3>=p
16a80 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29  Op->p1+pOp->p2 )
16a90 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
16aa0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d  [pOp->p3];.  mem
16ab0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
16ac0 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70   pOut);..  /* Ap
16ad0 70 6c 79 20 74 68 65 20 72 65 71 75 65 73 74 65  ply the requeste
16ae0 64 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 6c  d affinity to al
16af0 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20  l inputs.  */.  
16b00 61 73 73 65 72 74 28 20 70 44 61 74 61 30 3c 3d  assert( pData0<=
16b10 70 4c 61 73 74 20 29 3b 0a 20 20 69 66 28 20 7a  pLast );.  if( z
16b20 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  Affinity ){.    
16b30 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b 0a 20  pRec = pData0;. 
16b40 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 70 70     do{.      app
16b50 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 63 2b  lyAffinity(pRec+
16b60 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b  +, *(zAffinity++
16b70 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  ), encoding);.  
16b80 20 20 20 20 61 73 73 65 72 74 28 20 7a 41 66 66      assert( zAff
16b90 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70  inity[0]==0 || p
16ba0 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20  Rec<=pLast );.  
16bb0 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66 69 6e    }while( zAffin
16bc0 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 23  ity[0] );.  }..#
16bd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16be0 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a 20 20  BLE_NULL_TRIM.  
16bf0 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e 20 62 65 20  /* NULLs can be 
16c00 73 61 66 65 6c 79 20 74 72 69 6d 6d 65 64 20 66  safely trimmed f
16c10 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
16c20 68 65 20 72 65 63 6f 72 64 2c 20 61 73 20 6c 6f  he record, as lo
16c30 6e 67 20 61 73 0a 20 20 2a 2a 20 61 73 20 74 68  ng as.  ** as th
16c40 65 20 73 63 68 65 6d 61 20 66 6f 72 6d 61 74 20  e schema format 
16c50 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
16c60 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 6d 69   none of the omi
16c70 74 74 65 64 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  tted columns.  *
16c80 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e 55 4c  * have a non-NUL
16c90 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  L default value.
16ca0 20 20 41 6c 73 6f 2c 20 74 68 65 20 72 65 63 6f    Also, the reco
16cb0 72 64 20 6d 75 73 74 20 62 65 20 6c 65 66 74 20  rd must be left 
16cc0 77 69 74 68 0a 20 20 2a 2a 20 61 74 20 6c 65 61  with.  ** at lea
16cd0 73 74 20 6f 6e 65 20 66 69 65 6c 64 2e 20 20 49  st one field.  I
16ce0 66 20 50 35 3e 30 20 74 68 65 6e 20 69 74 20 77  f P5>0 then it w
16cf0 69 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f 72 65 20  ill be one more 
16d00 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  than the.  ** in
16d10 64 65 78 20 6f 66 20 74 68 65 20 72 69 67 68 74  dex of the right
16d20 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 77 69 74  -most column wit
16d30 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64 65 66  h a non-NULL def
16d40 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
16d50 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
16d60 20 20 20 77 68 69 6c 65 28 20 28 70 4c 61 73 74     while( (pLast
16d70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
16d80 6c 6c 29 21 3d 30 20 26 26 20 6e 46 69 65 6c 64  ll)!=0 && nField
16d90 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20  >pOp->p5 ){.    
16da0 20 20 70 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20    pLast--;.     
16db0 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20 20 20 7d   nField--;.    }
16dc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16dd0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
16de0 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74  he elements that
16df0 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68   will make up th
16e00 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75  e record to figu
16e10 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20  re.  ** out how 
16e20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
16e30 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e  quired for the n
16e40 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a  ew record..  */.
16e50 20 20 70 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a    pRec = pLast;.
16e60 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
16e70 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65  ( memIsValid(pRe
16e80 63 29 20 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e  c) );.    pRec->
16e90 75 54 65 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74  uTemp = serial_t
16ea0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ype = sqlite3Vdb
16eb0 65 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63  eSerialType(pRec
16ec0 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26  , file_format, &
16ed0 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 52  len);.    if( pR
16ee0 65 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ec->flags & MEM_
16ef0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
16f00 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( nData ){.     
16f10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
16f20 62 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28  beMemExpandBlob(
16f30 70 52 65 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f  pRec) ) goto no_
16f40 6d 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mem;.      }else
16f50 7b 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 6f 20  {.        nZero 
16f60 2b 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f  += pRec->u.nZero
16f70 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d  ;.        len -=
16f80 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRec->u.nZero;.
16f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16fa0 20 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a    nData += len;.
16fb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
16fc0 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29  rial_type==127 )
16fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16fe0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38  serial_type==128
16ff0 20 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20   );.    nHdr += 
17000 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37  serial_type<=127
17010 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 56 61   ? 1 : sqlite3Va
17020 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
17030 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  ype);.    if( pR
17040 65 63 3d 3d 70 44 61 74 61 30 20 29 20 62 72 65  ec==pData0 ) bre
17050 61 6b 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a  ak;.    pRec--;.
17060 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20    }while(1);..  
17070 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17080 52 2d 32 32 35 36 34 2d 31 31 36 34 37 20 54 68  R-22564-11647 Th
17090 65 20 68 65 61 64 65 72 20 62 65 67 69 6e 73 20  e header begins 
170a0 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 76 61  with a single va
170b0 72 69 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68 20  rint.  ** which 
170c0 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74  determines the t
170d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
170e0 79 74 65 73 20 69 6e 20 74 68 65 20 68 65 61 64  ytes in the head
170f0 65 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 20  er. The varint. 
17100 20 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65   ** value is the
17110 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
17120 64 65 72 20 69 6e 20 62 79 74 65 73 20 69 6e 63  der in bytes inc
17130 6c 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20  luding the size 
17140 76 61 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65  varint.  ** itse
17150 6c 66 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  lf. */.  testcas
17160 65 28 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a  e( nHdr==126 );.
17170 20 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72    testcase( nHdr
17180 3d 3d 31 32 37 20 29 3b 0a 20 20 69 66 28 20 6e  ==127 );.  if( n
17190 48 64 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20  Hdr<=126 ){.    
171a0 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
171b0 73 65 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b  se */.    nHdr +
171c0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
171d0 20 20 2f 2a 20 52 61 72 65 20 63 61 73 65 20 6f    /* Rare case o
171e0 66 20 61 20 72 65 61 6c 6c 79 20 6c 61 72 67 65  f a really large
171f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e   header */.    n
17200 56 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33  Varint = sqlite3
17210 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b  VarintLen(nHdr);
17220 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61  .    nHdr += nVa
17230 72 69 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 56  rint;.    if( nV
17240 61 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72  arint<sqlite3Var
17250 69 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e  intLen(nHdr) ) n
17260 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79  Hdr++;.  }.  nBy
17270 74 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b  te = nHdr+nData;
17280 0a 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 5a 65  .  if( nByte+nZe
17290 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  ro>db->aLimit[SQ
172a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
172b0 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
172c0 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f  oo_big;.  }..  /
172d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
172e0 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  output register 
172f0 68 61 73 20 61 20 62 75 66 66 65 72 20 6c 61 72  has a buffer lar
17300 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f  ge enough to sto
17310 72 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77  re .  ** the new
17320 20 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75 74   record. The out
17330 70 75 74 20 72 65 67 69 73 74 65 72 20 28 70 4f  put register (pO
17340 70 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61 6c  p->p3) is not al
17350 6c 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65  lowed to.  ** be
17360 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75   one of the inpu
17370 74 20 72 65 67 69 73 74 65 72 73 20 28 62 65 63  t registers (bec
17380 61 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ause the followi
17390 6e 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20  ng call to.  ** 
173a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
173b0 65 61 72 41 6e 64 52 65 73 69 7a 65 28 29 20 63  earAndResize() c
173c0 6f 75 6c 64 20 63 6c 6f 62 62 65 72 20 74 68 65  ould clobber the
173d0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 69 74   value before it
173e0 20 69 73 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a   is used)..  */.
173f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
17400 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
17410 7a 65 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42  ze(pOut, (int)nB
17420 79 74 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  yte) ){.    goto
17430 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a   no_mem;.  }.  z
17440 4e 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20  NewRecord = (u8 
17450 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a  *)pOut->z;..  /*
17460 20 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72   Write the recor
17470 64 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61  d */.  i = putVa
17480 72 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72  rint32(zNewRecor
17490 64 2c 20 6e 48 64 72 29 3b 0a 20 20 6a 20 3d 20  d, nHdr);.  j = 
174a0 6e 48 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  nHdr;.  assert( 
174b0 70 44 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b  pData0<=pLast );
174c0 0a 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30  .  pRec = pData0
174d0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 65 72 69  ;.  do{.    seri
174e0 61 6c 5f 74 79 70 65 20 3d 20 70 52 65 63 2d 3e  al_type = pRec->
174f0 75 54 65 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56  uTemp;.    /* EV
17500 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35  IDENCE-OF: R-065
17510 32 39 2d 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69  29-47362 Followi
17520 6e 67 20 74 68 65 20 73 69 7a 65 20 76 61 72 69  ng the size vari
17530 6e 74 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  nt are one or mo
17540 72 65 0a 20 20 20 20 2a 2a 20 61 64 64 69 74 69  re.    ** additi
17550 6f 6e 61 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e  onal varints, on
17560 65 20 70 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  e per column. */
17570 0a 20 20 20 20 69 20 2b 3d 20 70 75 74 56 61 72  .    i += putVar
17580 69 6e 74 33 32 28 26 7a 4e 65 77 52 65 63 6f 72  int32(&zNewRecor
17590 64 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  d[i], serial_typ
175a0 65 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  e);            /
175b0 2a 20 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f  * serial type */
175c0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
175d0 2d 4f 46 3a 20 52 2d 36 34 35 33 36 2d 35 31 37  -OF: R-64536-517
175e0 32 38 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f  28 The values fo
175f0 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e  r each column in
17600 20 74 68 65 20 72 65 63 6f 72 64 0a 20 20 20 20   the record.    
17610 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
17620 6f 6c 6c 6f 77 20 74 68 65 20 68 65 61 64 65 72  ollow the header
17630 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b 3d 20 73 71  . */.    j += sq
17640 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
17650 75 74 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a  ut(&zNewRecord[j
17660 5d 2c 20 70 52 65 63 2c 20 73 65 72 69 61 6c 5f  ], pRec, serial_
17670 74 79 70 65 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e  type); /* conten
17680 74 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 28  t */.  }while( (
17690 2b 2b 70 52 65 63 29 3c 3d 70 4c 61 73 74 20 29  ++pRec)<=pLast )
176a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e  ;.  assert( i==n
176b0 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Hdr );.  assert(
176c0 20 6a 3d 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20   j==nByte );..  
176d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e  assert( pOp->p3>
176e0 30 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70  0 && pOp->p3<=(p
176f0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
17700 75 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74  ursor) );.  pOut
17710 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65  ->n = (int)nByte
17720 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
17730 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66  = MEM_Blob;.  if
17740 28 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70  ( nZero ){.    p
17750 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e  Out->u.nZero = n
17760 5a 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Zero;.    pOut->
17770 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72  flags |= MEM_Zer
17780 6f 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65  o;.  }.  pOut->e
17790 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
177a0 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68  ;  /* In case th
177b0 65 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63  e blob is ever c
177c0 6f 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78 74  onverted to text
177d0 20 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54   */.  REGISTER_T
177e0 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f  RACE(pOp->p3, pO
177f0 75 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ut);.  UPDATE_MA
17800 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
17810 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
17820 20 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50   Opcode: Count P
17830 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
17840 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f  nopsis: r[P2]=co
17850 75 6e 74 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72  unt().**.** Stor
17860 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
17870 65 6e 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65  entries (an inte
17880 67 65 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68  ger value) in th
17890 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
178a0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63   .** opened by c
178b0 75 72 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69  ursor P1 in regi
178c0 73 74 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64  ster P2.*/.#ifnd
178d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
178e0 54 52 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f  TREECOUNT.case O
178f0 50 5f 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20  P_Count: {      
17900 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
17910 69 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74  i64 nEntry;.  Bt
17920 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a  Cursor *pCrsr;..
17930 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
17940 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75  sr[pOp->p1]->eCu
17950 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17960 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
17970 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
17980 70 31 5d 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b  p1]->uc.pCursor;
17990 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72  .  assert( pCrsr
179a0 20 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30   );.  nEntry = 0
179b0 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
179c0 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
179d0 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
179e0 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
179f0 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70  ite3BtreeCount(p
17a00 43 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a  Crsr, &nEntry);.
17a10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
17a20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
17a30 6f 72 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74  or;.  pOut = out
17a40 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
17a50 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  Op);.  pOut->u.i
17a60 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65   = nEntry;.  bre
17a70 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
17a80 20 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69   Opcode: Savepoi
17a90 6e 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  nt P1 * * P4 *.*
17aa0 2a 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61  *.** Open, relea
17ab0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74  se or rollback t
17ac0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d  he savepoint nam
17ad0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
17ae0 50 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a  P4, depending.**
17af0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
17b00 20 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e   P1. To open a n
17b10 65 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31  ew savepoint, P1
17b20 3d 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20  ==0. To release 
17b30 28 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65  (commit) an.** e
17b40 78 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e  xisting savepoin
17b50 74 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20  t, P1==1, or to 
17b60 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73  rollback an exis
17b70 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50  ting savepoint P
17b80 31 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  1==2..*/.case OP
17b90 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20  _Savepoint: {.  
17ba0 69 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20  int p1;         
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f  /* Value of P1 o
17bd0 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72  perand */.  char
17be0 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17c00 61 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ame of savepoint
17c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
17c20 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e  .  Savepoint *pN
17c30 65 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  ew;.  Savepoint 
17c40 2a 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53  *pSavepoint;.  S
17c50 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a  avepoint *pTmp;.
17c60 20 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74    int iSavepoint
17c70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70  ;.  int ii;..  p
17c80 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a  1 = pOp->p1;.  z
17c90 4e 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  Name = pOp->p4.z
17ca0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
17cb0 68 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d  hat the p1 param
17cc0 65 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41  eter is valid. A
17cd0 6c 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72  lso that if ther
17ce0 65 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a  e is no open.  *
17cf0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  * transaction, t
17d00 68 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74  hen there cannot
17d10 20 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e   be any savepoin
17d20 74 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts. .  */.  asse
17d30 72 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  rt( db->pSavepoi
17d40 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74  nt==0 || db->aut
17d50 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  oCommit==0 );.  
17d60 61 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45  assert( p1==SAVE
17d70 50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d  POINT_BEGIN||p1=
17d80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
17d90 53 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  SE||p1==SAVEPOIN
17da0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
17db0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76  assert( db->pSav
17dc0 65 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73  epoint || db->is
17dd0 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
17de0 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  oint==0 );.  ass
17df0 65 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f  ert( checkSavepo
17e00 69 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a  intCount(db) );.
17e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
17e20 52 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28  Reader );..  if(
17e30 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42   p1==SAVEPOINT_B
17e40 45 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20  EGIN ){.    if( 
17e50 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30  db->nVdbeWrite>0
17e60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   ){.      /* A n
17e70 65 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  ew savepoint can
17e80 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69  not be created i
17e90 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
17ea0 76 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20  ve write .      
17eb0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69  ** statements (i
17ec0 2e 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72  .e. open read/wr
17ed0 69 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  ite incremental 
17ee0 62 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20  blob handles).. 
17ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
17f00 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
17f10 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73  , "cannot open s
17f20 61 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73  avepoint - SQL s
17f30 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f  tatements in pro
17f40 67 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72  gress");.      r
17f50 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17f70 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
17f80 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
17f90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17fa0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
17fb0 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  BLE.      /* Thi
17fc0 73 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65  s call is Ok eve
17fd0 6e 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f  n if this savepo
17fe0 69 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  int is actually 
17ff0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  a transaction.  
18000 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
18010 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
18020 73 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70  should not promp
18030 74 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20  t xSavepoint()) 
18040 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20  callbacks..     
18050 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
18060 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
18070 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65  epoint being ope
18080 6e 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  ned, it is guara
18090 6e 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  nteed.      ** t
180a0 68 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72  hat the db->aVTr
180b0 61 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65  ans[] array is e
180c0 6d 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mpty.  */.      
180d0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f  assert( db->auto
180e0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
180f0 3e 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20  >nVTrans==0 );. 
18100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18110 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
18120 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  b, SAVEPOINT_BEG
18130 49 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN,.            
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
18160 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
18170 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
18180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
18190 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
181a0 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20  error;.#endif.. 
181b0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
181c0 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73   new savepoint s
181d0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20  tructure. */.   
181e0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
181f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
18200 62 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f  b, sizeof(Savepo
18210 69 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20  int)+nName+1);. 
18220 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
18230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
18240 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26  Name = (char *)&
18250 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
18260 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e   memcpy(pNew->zN
18270 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
18280 65 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20  e+1);.    .     
18290 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
182a0 73 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61  s no open transa
182b0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b  ction, then mark
182c0 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
182d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74  al.        ** "t
182e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
182f0 6f 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20  oint". */.      
18300 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
18310 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
18320 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
18330 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
18340 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
18350 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a  nSavepoint = 1;.
18360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18370 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61           db->nSa
18380 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  vepoint++;.     
18390 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
183a0 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61   Link the new sa
183b0 76 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65  vepoint into the
183c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
183d0 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  's list. */.    
183e0 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
183f0 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
18400 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53  ;.        db->pS
18410 61 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b  avepoint = pNew;
18420 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
18430 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64  DeferredCons = d
18440 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
18450 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
18460 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
18470 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64   = db->nDeferred
18480 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d  ImmCons;.      }
18490 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
184a0 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d      iSavepoint =
184b0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   0;..    /* Find
184c0 20 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70   the named savep
184d0 6f 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69  oint. If there i
184e0 73 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f  s no such savepo
184f0 69 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20  int, then an.   
18500 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20   ** an error is 
18510 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
18520 75 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  user.  */.    fo
18530 72 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f  r(.      pSavepo
18540 69 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  int = db->pSavep
18550 6f 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61  oint; .      pSa
18560 76 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74  vepoint && sqlit
18570 65 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70  e3StrICmp(pSavep
18580 6f 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  oint->zName, zNa
18590 6d 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65  me);.      pSave
185a0 70 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69  point = pSavepoi
185b0 6e 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b  nt->pNext.    ){
185c0 0a 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e  .      iSavepoin
185d0 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t++;.    }.    i
185e0 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29  f( !pSavepoint )
185f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18600 64 62 65 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20  dbeError(p, "no 
18610 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20  such savepoint: 
18620 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
18630 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
18640 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
18650 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  if( db->nVdbeWri
18660 74 65 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45  te>0 && p1==SAVE
18670 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
18680 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
18690 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
186a0 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29  release (commit)
186b0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20   a savepoint if 
186c0 74 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20  there are .     
186d0 20 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65   ** active write
186e0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
186f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
18700 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
18710 22 63 61 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20  "cannot release 
18720 73 61 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20  savepoint - ".  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61          "SQL sta
18750 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72  tements in progr
18760 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ess");.      rc 
18770 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
18780 20 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20     }else{..     
18790 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
187a0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
187b0 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  s is a transacti
187c0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  on savepoint. If
187d0 20 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e   so,.      ** an
187e0 64 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  d this is a RELE
187f0 41 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65  ASE command, the
18800 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
18810 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20  ansaction .     
18820 20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64   ** is committed
18830 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
18840 20 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74    int isTransact
18850 69 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ion = pSavepoint
18860 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62  ->pNext==0 && db
18870 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
18880 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20  avepoint;.      
18890 61 73 73 65 72 74 28 20 64 62 2d 3e 62 43 6f 6e  assert( db->bCon
188a0 63 75 72 72 65 6e 74 3d 3d 30 20 7c 7c 20 64 62  current==0 || db
188b0 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
188c0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 3b 0a 20  avepoint==0 );. 
188d0 20 20 20 20 20 69 66 28 20 69 73 54 72 61 6e 73       if( isTrans
188e0 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d 53 41  action && p1==SA
188f0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
18900 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
18910 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
18920 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29 21 3d  CheckFk(p, 1))!=
18930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18940 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65         goto vdbe
18950 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20  _return;.       
18960 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61   }.        db->a
18970 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
18980 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
18990 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d 3d 53  e3VdbeHalt(p)==S
189a0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
189b0 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20          p->pc = 
189c0 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
189d0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
189e0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a  autoCommit = 0;.
189f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
18a00 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  = rc = SQLITE_BU
18a10 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  SY;.          go
18a20 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
18a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18a40 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
18a50 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
18a60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
18a70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->rc;.      }els
18a80 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
18a90 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  sSchemaChange;. 
18aa0 20 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e         iSavepoin
18ab0 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  t = db->nSavepoi
18ac0 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e 74 20  nt - iSavepoint 
18ad0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  - 1;.        if(
18ae0 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   p1==SAVEPOINT_R
18af0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
18b00 20 20 20 20 20 69 73 53 63 68 65 6d 61 43 68 61       isSchemaCha
18b10 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  nge = (db->flags
18b20 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   & SQLITE_Intern
18b30 43 68 61 6e 67 65 73 29 21 3d 30 3b 0a 20 20 20  Changes)!=0;.   
18b40 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b         for(ii=0;
18b50 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69 2b   ii<db->nDb; ii+
18b60 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
18b70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18b80 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
18b90 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
18ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
18bd0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 2c 0a 20  BORT_ROLLBACK,. 
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43 68        isSchemaCh
18c10 61 6e 67 65 3d 3d 30 29 3b 0a 20 20 20 20 20 20  ange==0);.      
18c20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18c30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61  LITE_OK ) goto a
18c40 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
18c50 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
18c60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18c70 20 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61          isSchema
18c80 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
18c90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
18ca0 72 28 69 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e  r(ii=0; ii<db->n
18cb0 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Db; ii++){.     
18cc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18cd0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
18ce0 64 62 2d 3e 61 44 62 5b 69 69 5d 2e 70 42 74 2c  db->aDb[ii].pBt,
18cf0 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   p1, iSavepoint)
18d00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
18d30 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
18d40 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
18d50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
18d60 20 20 20 20 69 66 28 20 69 73 53 63 68 65 6d 61      if( isSchema
18d70 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20  Change ){.      
18d80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
18d90 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
18da0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
18db0 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41     sqlite3ResetA
18dc0 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
18dd0 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20  ction(db);.     
18de0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
18df0 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
18e00 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
18e10 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  es);.        }. 
18e20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
18e30 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
18e40 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 73   whether this is
18e50 20 61 20 52 45 4c 45 41 53 45 20 6f 72 20 52 4f   a RELEASE or RO
18e60 4c 4c 42 41 43 4b 2c 20 64 65 73 74 72 6f 79 20  LLBACK, destroy 
18e70 61 6c 6c 20 0a 20 20 20 20 20 20 2a 2a 20 73 61  all .      ** sa
18e80 76 65 70 6f 69 6e 74 73 20 6e 65 73 74 65 64 20  vepoints nested 
18e90 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 73 61  inside of the sa
18ea0 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70  vepoint being op
18eb0 65 72 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  erated on. */.  
18ec0 20 20 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70      while( db->p
18ed0 53 61 76 65 70 6f 69 6e 74 21 3d 70 53 61 76 65  Savepoint!=pSave
18ee0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
18ef0 20 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76   pTmp = db->pSav
18f00 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20 20  epoint;.        
18f10 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
18f20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
18f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
18f40 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20  ree(db, pTmp);. 
18f50 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76 65         db->nSave
18f60 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 7d  point--;.      }
18f70 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74  ..      /* If it
18f80 20 69 73 20 61 20 52 45 4c 45 41 53 45 2c 20 74   is a RELEASE, t
18f90 68 65 6e 20 64 65 73 74 72 6f 79 20 74 68 65 20  hen destroy the 
18fa0 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20  savepoint being 
18fb0 6f 70 65 72 61 74 65 64 20 6f 6e 20 0a 20 20 20  operated on .   
18fc0 20 20 20 2a 2a 20 74 6f 6f 2e 20 49 66 20 69 74     ** too. If it
18fd0 20 69 73 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54   is a ROLLBACK T
18fe0 4f 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  O, then set the 
18ff0 6e 75 6d 62 65 72 20 6f 66 20 64 65 66 65 72 72  number of deferr
19000 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  ed .      ** con
19010 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
19020 6e 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ns present in th
19030 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
19040 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 0a 20  e value stored. 
19050 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
19060 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
19070 72 65 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  reated.  */.    
19080 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45 50 4f    if( p1==SAVEPO
19090 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
190a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
190b0 53 61 76 65 70 6f 69 6e 74 3d 3d 64 62 2d 3e 70  Savepoint==db->p
190c0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
190d0 20 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f       db->pSavepo
190e0 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  int = pSavepoint
190f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
19100 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19110 62 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b, pSavepoint);.
19120 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 54          if( !isT
19130 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
19140 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
19150 65 70 6f 69 6e 74 2d 2d 3b 0a 20 20 20 20 20 20  epoint--;.      
19160 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
19170 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  .        db->nDe
19180 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 53 61  ferredCons = pSa
19190 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66 65 72 72  vepoint->nDeferr
191a0 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20  edCons;.        
191b0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
191c0 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e  Cons = pSavepoin
191d0 74 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  t->nDeferredImmC
191e0 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ons;.      }..  
191f0 20 20 20 20 69 66 28 20 21 69 73 54 72 61 6e 73      if( !isTrans
19200 61 63 74 69 6f 6e 20 7c 7c 20 70 31 3d 3d 53 41  action || p1==SA
19210 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19230 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
19240 70 6f 69 6e 74 28 64 62 2c 20 70 31 2c 20 69 53  point(db, p1, iS
19250 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
19260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19270 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
19280 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
19290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
192a0 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  }.  if( rc ) got
192b0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
192c0 72 72 6f 72 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a  rror;..  break;.
192d0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 75  }../* Opcode: Au
192e0 74 6f 43 6f 6d 6d 69 74 20 50 31 20 50 32 20 50  toCommit P1 P2 P
192f0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20  3 * *.**.** Set 
19300 74 68 65 20 64 61 74 61 62 61 73 65 20 61 75 74  the database aut
19310 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f  o-commit flag to
19320 20 50 31 20 28 31 20 6f 72 20 30 29 2e 20 49 66   P1 (1 or 0). If
19330 20 50 32 20 69 73 20 74 72 75 65 2c 20 72 6f 6c   P2 is true, rol
19340 6c 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 75  l.** back any cu
19350 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 62  rrently active b
19360 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
19370 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  s. If there are 
19380 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 56 4d  any active.** VM
19390 73 20 28 61 70 61 72 74 20 66 72 6f 6d 20 74 68  s (apart from th
193a0 69 73 20 6f 6e 65 29 2c 20 74 68 65 6e 20 61 20  is one), then a 
193b0 52 4f 4c 4c 42 41 43 4b 20 66 61 69 6c 73 2e 20  ROLLBACK fails. 
193c0 20 41 20 43 4f 4d 4d 49 54 20 66 61 69 6c 73 20   A COMMIT fails 
193d0 69 66 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  if.** there are 
193e0 61 63 74 69 76 65 20 77 72 69 74 69 6e 67 20 56  active writing V
193f0 4d 73 20 6f 72 20 61 63 74 69 76 65 20 56 4d 73  Ms or active VMs
19400 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
19410 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   cache..**.** If
19420 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P3 is non-zero,
19430 20 74 68 65 6e 20 74 68 69 73 20 69 6e 73 74 72   then this instr
19440 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  uction is being 
19450 65 78 65 63 75 74 65 64 20 61 73 20 70 61 72 74  executed as part
19460 20 6f 66 0a 2a 2a 20 61 20 22 42 45 47 49 4e 20   of.** a "BEGIN 
19470 43 4f 4e 43 55 52 52 45 4e 54 22 20 63 6f 6d 6d  CONCURRENT" comm
19480 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  and..**.** This 
19490 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 75 73  instruction caus
194a0 65 73 20 74 68 65 20 56 4d 20 74 6f 20 68 61 6c  es the VM to hal
194b0 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 75  t..*/.case OP_Au
194c0 74 6f 43 6f 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e  toCommit: {.  in
194d0 74 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  t desiredAutoCom
194e0 6d 69 74 3b 0a 20 20 69 6e 74 20 69 52 6f 6c 6c  mit;.  int iRoll
194f0 62 61 63 6b 3b 0a 20 20 69 6e 74 20 62 43 6f 6e  back;.  int bCon
19500 63 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 68  current;.  int h
19510 72 63 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75  rc;..  desiredAu
19520 74 6f 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e  toCommit = pOp->
19530 70 31 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20  p1;.  iRollback 
19540 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 62 43 6f  = pOp->p2;.  bCo
19550 6e 63 75 72 72 65 6e 74 20 3d 20 70 4f 70 2d 3e  ncurrent = pOp->
19560 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65  p3;.  assert( de
19570 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d  siredAutoCommit=
19580 3d 31 20 7c 7c 20 64 65 73 69 72 65 64 41 75 74  =1 || desiredAut
19590 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  oCommit==0 );.  
195a0 61 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41  assert( desiredA
195b0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 7c 7c 20  utoCommit==1 || 
195c0 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 3b 0a  iRollback==0 );.
195d0 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72 65    assert( desire
195e0 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  dAutoCommit==0 |
195f0 7c 20 62 43 6f 6e 63 75 72 72 65 6e 74 3d 3d 30  | bConcurrent==0
19600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
19610 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
19620 7c 7c 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65  || db->bConcurre
19630 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nt==0 );.  asser
19640 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
19650 76 65 3e 30 20 29 3b 20 20 2f 2a 20 41 74 20 6c  ve>0 );  /* At l
19660 65 61 73 74 20 74 68 69 73 20 6f 6e 65 20 56 4d  east this one VM
19670 20 69 73 20 61 63 74 69 76 65 20 2a 2f 0a 20 20   is active */.  
19680 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
19690 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20 64  ader );..  if( d
196a0 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74  esiredAutoCommit
196b0 21 3d 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  !=db->autoCommit
196c0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 6c   ){.    if( iRol
196d0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  lback ){.      a
196e0 73 73 65 72 74 28 20 64 65 73 69 72 65 64 41 75  ssert( desiredAu
196f0 74 6f 43 6f 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20  toCommit==1 );. 
19700 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
19710 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
19720 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
19730 4b 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75  K);.      db->au
19740 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
19750 20 20 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72      db->bConcurr
19760 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
19770 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75  se if( desiredAu
19780 74 6f 43 6f 6d 6d 69 74 0a 20 20 20 20 20 20 20  toCommit.       
19790 20 20 20 20 20 26 26 20 28 64 62 2d 3e 6e 56 64       && (db->nVd
197a0 62 65 57 72 69 74 65 3e 30 20 7c 7c 20 28 64 62  beWrite>0 || (db
197b0 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 26 26  ->bConcurrent &&
197c0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
197d0 3e 31 29 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >1)) ){.      /*
197e0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
197f0 61 79 20 6f 6e 6c 79 20 62 65 20 63 6f 6d 6d 69  ay only be commi
19800 74 74 65 64 20 69 66 20 74 68 65 72 65 20 61 72  tted if there ar
19810 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76  e no other activ
19820 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 69 74 65  e.      ** write
19830 72 20 56 4d 73 2e 20 49 66 20 74 68 65 20 74 72  r VMs. If the tr
19840 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 43 4f 4e  ansaction is CON
19850 43 55 52 52 45 4e 54 2c 20 74 68 65 6e 20 69 74  CURRENT, then it
19860 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 20 20 20   may only be.   
19870 20 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20     ** committed 
19880 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
19890 61 63 74 69 76 65 20 56 4d 73 20 61 74 20 61 6c  active VMs at al
198a0 6c 20 28 72 65 61 64 65 72 73 20 6f 72 20 77 72  l (readers or wr
198b0 69 74 65 72 73 29 2e 0a 20 20 20 20 20 20 2a 2a  iters)..      **
198c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
198d0 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  s instruction is
198e0 20 61 20 43 4f 4d 4d 49 54 20 61 6e 64 20 74 68   a COMMIT and th
198f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
19900 79 20 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a  y not be.      *
19910 2a 20 63 6f 6d 6d 69 74 74 65 64 20 64 75 65 20  * committed due 
19920 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  to one of the co
19930 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 2c 20  nditions above, 
19940 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 0a  return an error.
19950 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74        ** indicat
19960 69 6e 67 20 74 68 61 74 20 6f 74 68 65 72 20 56  ing that other V
19970 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  Ms must complete
19980 20 62 65 66 6f 72 65 20 74 68 65 20 43 4f 4d 4d   before the COMM
19990 49 54 20 63 61 6e 20 0a 20 20 20 20 20 20 2a 2a  IT can .      **
199a0 20 62 65 20 70 72 6f 63 65 73 73 65 64 2e 20 20   be processed.  
199b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
199c0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61  VdbeError(p, "ca
199d0 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e  nnot commit tran
199e0 73 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20  saction - ".    
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65        "SQL state
19a10 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73  ments in progres
19a20 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  s");.      rc = 
19a30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
19a40 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19a50 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
19a60 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
19a70 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
19a80 46 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54  Fk(p, 1))!=SQLIT
19a90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19aa0 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a  to vdbe_return;.
19ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ac0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
19ad0 3d 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74  = (u8)desiredAut
19ae0 6f 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20  oCommit;.    }. 
19af0 20 20 20 68 72 63 20 3d 20 73 71 6c 69 74 65 33     hrc = sqlite3
19b00 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 20  VdbeHalt(p);.   
19b10 20 69 66 28 20 28 68 72 63 20 26 20 30 78 46 46   if( (hrc & 0xFF
19b20 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  )==SQLITE_BUSY )
19b30 7b 0a 20 20 20 20 20 20 70 2d 3e 70 63 20 3d 20  {.      p->pc = 
19b40 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
19b50 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f  ;.      db->auto
19b60 43 6f 6d 6d 69 74 20 3d 20 28 75 38 29 28 31 2d  Commit = (u8)(1-
19b70 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69  desiredAutoCommi
19b80 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  t);.      p->rc 
19b90 3d 20 68 72 63 3b 0a 20 20 20 20 20 20 72 63 20  = hrc;.      rc 
19ba0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
19bb0 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f 72       goto vdbe_r
19bc0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
19bd0 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74   db->bConcurrent
19be0 20 3d 20 28 75 38 29 62 43 6f 6e 63 75 72 72 65   = (u8)bConcurre
19bf0 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nt;.    assert( 
19c00 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
19c10 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
19c20 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
19c30 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  db);.    if( p->
19c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19c50 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19c60 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c  TE_DONE;.    }el
19c70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
19c80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
19c90 20 7d 0a 20 20 20 20 67 6f 74 6f 20 76 64 62 65   }.    goto vdbe
19ca0 5f 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65  _return;.  }else
19cb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
19cc0 65 45 72 72 6f 72 28 70 2c 0a 20 20 20 20 20 20  eError(p,.      
19cd0 20 20 28 21 64 65 73 69 72 65 64 41 75 74 6f 43    (!desiredAutoC
19ce0 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e 6f 74 20 73  ommit)?"cannot s
19cf0 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
19d00 6f 6e 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  on within a tran
19d10 73 61 63 74 69 6f 6e 22 3a 28 0a 20 20 20 20 20  saction":(.     
19d20 20 20 20 28 69 52 6f 6c 6c 62 61 63 6b 29 3f 22     (iRollback)?"
19d30 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62 61 63 6b 20  cannot rollback 
19d40 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e  - no transaction
19d50 20 69 73 20 61 63 74 69 76 65 22 3a 0a 20 20 20   is active":.   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 2d  "cannot commit -
19d80 20 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   no transaction 
19d90 69 73 20 61 63 74 69 76 65 22 29 29 3b 0a 20 20  is active"));.  
19da0 20 20 20 20 20 20 20 0a 20 20 20 20 72 63 20 3d         .    rc =
19db0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
19dc0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
19dd0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
19de0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
19df0 70 63 6f 64 65 3a 20 54 72 61 6e 73 61 63 74 69  pcode: Transacti
19e00 6f 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50  on P1 P2 P3 P4 P
19e10 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  5.**.** Begin a 
19e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 64  transaction on d
19e30 61 74 61 62 61 73 65 20 50 31 20 69 66 20 61 20  atabase P1 if a 
19e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
19e50 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 61 63  ot already.** ac
19e60 74 69 76 65 2e 0a 2a 2a 20 49 66 20 50 32 20 69  tive..** If P2 i
19e70 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
19e80 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
19e90 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
19ea0 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 72 65 61   or if a .** rea
19eb0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
19ec0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
19ed0 20 69 74 20 69 73 20 75 70 67 72 61 64 65 64 20   it is upgraded 
19ee0 74 6f 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  to a write-trans
19ef0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 50 32  action..** If P2
19f00 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
19f10 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
19f20 6e 20 69 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a  n is started..**
19f30 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
19f40 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
19f50 61 73 65 20 66 69 6c 65 20 6f 6e 20 77 68 69 63  ase file on whic
19f60 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
19f70 6e 20 69 73 0a 2a 2a 20 73 74 61 72 74 65 64 2e  n is.** started.
19f80 20 20 49 6e 64 65 78 20 30 20 69 73 20 74 68 65    Index 0 is the
19f90 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
19fa0 69 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 31 20  ile and index 1 
19fb0 69 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 75  is the.** file u
19fc0 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  sed for temporar
19fd0 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 64 69 63  y tables.  Indic
19fe0 65 73 20 6f 66 20 32 20 6f 72 20 6d 6f 72 65 20  es of 2 or more 
19ff0 61 72 65 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  are used for.** 
1a000 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1a010 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 77  es..**.** If a w
1a020 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a030 20 69 73 20 73 74 61 72 74 65 64 20 61 6e 64 20   is started and 
1a040 74 68 65 20 56 64 62 65 2e 75 73 65 73 53 74 6d  the Vdbe.usesStm
1a050 74 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  tJournal flag is
1a060 0a 2a 2a 20 74 72 75 65 20 28 74 68 69 73 20 66  .** true (this f
1a070 6c 61 67 20 69 73 20 73 65 74 20 69 66 20 74 68  lag is set if th
1a080 65 20 56 64 62 65 20 6d 61 79 20 6d 6f 64 69 66  e Vdbe may modif
1a090 79 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  y more than one 
1a0a0 72 6f 77 20 61 6e 64 20 6d 61 79 0a 2a 2a 20 74  row and may.** t
1a0b0 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
1a0c0 63 65 70 74 69 6f 6e 29 2c 20 61 20 73 74 61 74  ception), a stat
1a0d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a0e0 6e 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 6f 70  n may also be op
1a0f0 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72 65 20 73 70  ened..** More sp
1a100 65 63 69 66 69 63 61 6c 6c 79 2c 20 61 20 73 74  ecifically, a st
1a110 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1a120 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ion is opened if
1a130 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1a140 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  * connection is 
1a150 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 69 6e  currently not in
1a160 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
1a170 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 61 72  , or if there ar
1a180 65 20 6f 74 68 65 72 0a 2a 2a 20 61 63 74 69 76  e other.** activ
1a190 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 41 20  e statements. A 
1a1a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1a1b0 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65  ction allows the
1a1c0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
1a1d0 20 74 68 69 73 0a 2a 2a 20 56 44 42 45 20 74 6f   this.** VDBE to
1a1e0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1a1f0 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 77  after an error w
1a200 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1a210 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
1a220 2a 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  * entire transac
1a230 74 69 6f 6e 2e 20 49 66 20 6e 6f 20 65 72 72 6f  tion. If no erro
1a240 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1a250 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  , the statement 
1a260 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1a270 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
1a280 79 20 63 6f 6d 6d 69 74 20 77 68 65 6e 20 74 68  y commit when th
1a290 65 20 56 44 42 45 20 68 61 6c 74 73 2e 0a 2a 2a  e VDBE halts..**
1a2a0 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65  .** If P5!=0 the
1a2b0 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 61 6c  n this opcode al
1a2c0 73 6f 20 63 68 65 63 6b 73 20 74 68 65 20 73 63  so checks the sc
1a2d0 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 67 61 69  hema cookie agai
1a2e0 6e 73 74 20 50 33 0a 2a 2a 20 61 6e 64 20 74 68  nst P3.** and th
1a2f0 65 20 73 63 68 65 6d 61 20 67 65 6e 65 72 61 74  e schema generat
1a300 69 6f 6e 20 63 6f 75 6e 74 65 72 20 61 67 61 69  ion counter agai
1a310 6e 73 74 20 50 34 2e 0a 2a 2a 20 54 68 65 20 63  nst P4..** The c
1a320 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73 20 69 74  ookie changes it
1a330 73 20 76 61 6c 75 65 20 77 68 65 6e 65 76 65 72  s value whenever
1a340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1a350 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2a  hema changes..**
1a360 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
1a370 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 63  is used to detec
1a380 74 20 77 68 65 6e 20 74 68 61 74 20 74 68 65 20  t when that the 
1a390 63 6f 6f 6b 69 65 20 68 61 73 20 63 68 61 6e 67  cookie has chang
1a3a0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74  ed.** and that t
1a3b0 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
1a3c0 73 73 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65  ss needs to rere
1a3d0 61 64 20 74 68 65 20 73 63 68 65 6d 61 2e 20 20  ad the schema.  
1a3e0 49 66 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  If the schema.**
1a3f0 20 63 6f 6f 6b 69 65 20 69 6e 20 50 33 20 64 69   cookie in P3 di
1a400 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
1a410 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 6e 20  chema cookie in 
1a420 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
1a430 64 65 72 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  der or.** if the
1a440 20 73 63 68 65 6d 61 20 67 65 6e 65 72 61 74 69   schema generati
1a450 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 50 34  on counter in P4
1a460 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
1a470 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 67 65 6e  e current.** gen
1a480 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 2c  eration counter,
1a490 20 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f   then an SQLITE_
1a4a0 53 43 48 45 4d 41 20 65 72 72 6f 72 20 69 73 20  SCHEMA error is 
1a4b0 72 61 69 73 65 64 20 61 6e 64 20 65 78 65 63 75  raised and execu
1a4c0 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74 73 2e 20 20  tion.** halts.  
1a4d0 54 68 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  The sqlite3_step
1a4e0 28 29 20 77 72 61 70 70 65 72 20 66 75 6e 63 74  () wrapper funct
1a4f0 69 6f 6e 20 6d 69 67 68 74 20 74 68 65 6e 20 72  ion might then r
1a500 65 70 72 65 70 61 72 65 20 74 68 65 0a 2a 2a 20  eprepare the.** 
1a510 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
1a520 72 75 6e 20 69 74 20 66 72 6f 6d 20 74 68 65 20  run it from the 
1a530 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 63 61  beginning..*/.ca
1a540 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
1a550 6e 3a 20 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  n: {.  Btree *pB
1a560 74 3b 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a  t;.  int iMeta;.
1a570 20 20 69 6e 74 20 69 47 65 6e 3b 0a 0a 20 20 61    int iGen;..  a
1a580 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
1a590 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
1a5a0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
1a5b0 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29 3b  || pOp->p2==0 );
1a5c0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1a5d0 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31  p1>=0 && pOp->p1
1a5e0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
1a5f0 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
1a600 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
1a610 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20 69 66 28  Op->p1) );.  if(
1a620 20 70 4f 70 2d 3e 70 32 20 26 26 20 28 64 62 2d   pOp->p2 && (db-
1a630 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1a640 51 75 65 72 79 4f 6e 6c 79 29 21 3d 30 20 29 7b  QueryOnly)!=0 ){
1a650 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a660 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1a670 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1a680 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 42  _error;.  }.  pB
1a690 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  t = db->aDb[pOp-
1a6a0 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20 20 69 66 28  >p1].pBt;..  if(
1a6b0 20 70 42 74 20 29 7b 0a 20 20 20 20 72 63 20 3d   pBt ){.    rc =
1a6c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1a6d0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 70 4f 70  inTrans(pBt, pOp
1a6e0 2d 3e 70 32 29 3b 0a 20 20 20 20 74 65 73 74 63  ->p2);.    testc
1a6f0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
1a700 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 29 3b  BUSY_SNAPSHOT );
1a710 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1a720 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  c==SQLITE_BUSY_R
1a730 45 43 4f 56 45 52 59 20 29 3b 0a 20 20 20 20 69  ECOVERY );.    i
1a740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a750 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72   ){.      if( (r
1a760 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
1a770 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
1a780 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f  p->pc = (int)(pO
1a790 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20  p - aOp);.      
1a7a0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
1a7b0 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62 65 5f        goto vdbe_
1a7c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
1a7d0 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74        goto abort
1a7e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
1a7f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
1a800 70 2d 3e 70 32 20 26 26 20 70 2d 3e 75 73 65 73  p->p2 && p->uses
1a810 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 0a 20 20 20  StmtJournal .   
1a820 20 20 26 26 20 28 64 62 2d 3e 61 75 74 6f 43 6f    && (db->autoCo
1a830 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
1a840 56 64 62 65 52 65 61 64 3e 31 29 20 0a 20 20 20  VdbeRead>1) .   
1a850 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1a860 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
1a870 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 3b 0a  InTrans(pBt) );.
1a880 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 53 74        if( p->iSt
1a890 61 74 65 6d 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  atement==0 ){.  
1a8a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1a8b0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 3d 30 20  ->nStatement>=0 
1a8c0 26 26 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  && db->nSavepoin
1a8d0 74 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t>=0 );.        
1a8e0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 2b  db->nStatement++
1a8f0 3b 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 53  ; .        p->iS
1a900 74 61 74 65 6d 65 6e 74 20 3d 20 64 62 2d 3e 6e  tatement = db->n
1a910 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62 2d 3e  Savepoint + db->
1a920 6e 53 74 61 74 65 6d 65 6e 74 3b 0a 20 20 20 20  nStatement;.    
1a930 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
1a940 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
1a950 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
1a960 4e 54 5f 42 45 47 49 4e 2c 20 70 2d 3e 69 53 74  NT_BEGIN, p->iSt
1a970 61 74 65 6d 65 6e 74 2d 31 29 3b 0a 20 20 20 20  atement-1);.    
1a980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1a9a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a9b0 42 65 67 69 6e 53 74 6d 74 28 70 42 74 2c 20 70  BeginStmt(pBt, p
1a9c0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  ->iStatement);. 
1a9d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1a9e0 20 53 74 6f 72 65 20 74 68 65 20 63 75 72 72 65   Store the curre
1a9f0 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
1aa00 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
1aa10 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
1aa20 61 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  aint.      ** co
1aa30 75 6e 74 65 72 2e 20 49 66 20 74 68 65 20 73 74  unter. If the st
1aa40 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1aa50 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ion needs to be 
1aa60 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 0a 20 20 20  rolled back,.   
1aa70 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1aa80 6f 66 20 74 68 69 73 20 63 6f 75 6e 74 65 72 20  of this counter 
1aa90 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
1aaa0 6f 72 65 64 20 74 6f 6f 2e 20 20 2a 2f 0a 20 20  ored too.  */.  
1aab0 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43      p->nStmtDefC
1aac0 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
1aad0 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 70  redCons;.      p
1aae0 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e  ->nStmtDefImmCon
1aaf0 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  s = db->nDeferre
1ab00 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  dImmCons;.    }.
1ab10 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
1ab20 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
1ab30 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 68 65  n number for che
1ab40 63 6b 69 6e 67 3a 0a 20 20 20 20 2a 2a 20 49 4d  cking:.    ** IM
1ab50 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1ab60 20 52 2d 30 33 31 38 39 2d 35 31 31 33 35 20 41   R-03189-51135 A
1ab70 73 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  s each SQL state
1ab80 6d 65 6e 74 20 72 75 6e 73 2c 20 74 68 65 20 73  ment runs, the s
1ab90 63 68 65 6d 61 0a 20 20 20 20 2a 2a 20 76 65 72  chema.    ** ver
1aba0 73 69 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20  sion is checked 
1abb0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1abc0 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
1abd0 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  t changed since 
1abe0 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  the.    ** SQL s
1abf0 74 61 74 65 6d 65 6e 74 20 77 61 73 20 70 72 65  tatement was pre
1ac00 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
1ac10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
1ac20 74 4d 65 74 61 28 70 42 74 2c 20 42 54 52 45 45  tMeta(pBt, BTREE
1ac30 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
1ac40 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61 29 3b   (u32 *)&iMeta);
1ac50 0a 20 20 20 20 69 47 65 6e 20 3d 20 64 62 2d 3e  .    iGen = db->
1ac60 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53 63  aDb[pOp->p1].pSc
1ac70 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f  hema->iGeneratio
1ac80 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
1ac90 69 47 65 6e 20 3d 20 69 4d 65 74 61 20 3d 20 30  iGen = iMeta = 0
1aca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1acb0 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
1acc0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
1acd0 54 33 32 20 29 3b 0a 20 20 69 66 28 20 70 4f 70  T32 );.  if( pOp
1ace0 2d 3e 70 35 20 26 26 20 28 69 4d 65 74 61 21 3d  ->p5 && (iMeta!=
1acf0 70 4f 70 2d 3e 70 33 20 7c 7c 20 69 47 65 6e 21  pOp->p3 || iGen!
1ad00 3d 70 4f 70 2d 3e 70 34 2e 69 29 20 29 7b 0a 20  =pOp->p4.i) ){. 
1ad10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1ad20 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
1ad30 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
1ad40 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1ad50 75 70 28 64 62 2c 20 22 64 61 74 61 62 61 73 65  up(db, "database
1ad60 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
1ad70 67 65 64 22 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ged");.    /* If
1ad80 20 74 68 65 20 73 63 68 65 6d 61 2d 63 6f 6f 6b   the schema-cook
1ad90 69 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ie from the data
1ada0 62 61 73 65 20 66 69 6c 65 20 6d 61 74 63 68 65  base file matche
1adb0 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 0a 20 20  s the cookie .  
1adc0 20 20 2a 2a 20 73 74 6f 72 65 64 20 77 69 74 68    ** stored with
1add0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
1ade0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
1adf0 20 74 68 65 20 73 63 68 65 6d 61 2c 20 64 6f 0a   the schema, do.
1ae00 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65 6c 6f 61      ** not reloa
1ae10 64 20 74 68 65 20 73 63 68 65 6d 61 20 66 72 6f  d the schema fro
1ae20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1ae30 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1ae40 2a 2a 20 49 66 20 76 69 72 74 75 61 6c 2d 74 61  ** If virtual-ta
1ae50 62 6c 65 73 20 61 72 65 20 69 6e 20 75 73 65 2c  bles are in use,
1ae60 20 74 68 69 73 20 69 73 20 6e 6f 74 20 6a 75 73   this is not jus
1ae70 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  t an optimizatio
1ae80 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66 74 65 6e 2c  n..    ** Often,
1ae90 20 76 2d 74 61 62 6c 65 73 20 73 74 6f 72 65 20   v-tables store 
1aea0 74 68 65 69 72 20 64 61 74 61 20 69 6e 20 6f 74  their data in ot
1aeb0 68 65 72 20 53 51 4c 69 74 65 20 74 61 62 6c 65  her SQLite table
1aec0 73 2c 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20  s, which.    ** 
1aed0 61 72 65 20 71 75 65 72 69 65 64 20 66 72 6f 6d  are queried from
1aee0 20 77 69 74 68 69 6e 20 78 4e 65 78 74 28 29 20   within xNext() 
1aef0 61 6e 64 20 6f 74 68 65 72 20 76 2d 74 61 62 6c  and other v-tabl
1af00 65 20 6d 65 74 68 6f 64 73 20 75 73 69 6e 67 0a  e methods using.
1af10 20 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20      ** prepared 
1af20 71 75 65 72 69 65 73 2e 20 49 66 20 73 75 63 68  queries. If such
1af30 20 61 20 71 75 65 72 79 20 69 73 20 6f 75 74 2d   a query is out-
1af40 6f 66 2d 64 61 74 65 2c 20 77 65 20 64 6f 20 6e  of-date, we do n
1af50 6f 74 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 2a  ot want to.    *
1af60 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64 61  * discard the da
1af70 74 61 62 61 73 65 20 73 63 68 65 6d 61 2c 20 61  tabase schema, a
1af80 73 20 74 68 65 20 75 73 65 72 20 63 6f 64 65 20  s the user code 
1af90 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
1afa0 0a 20 20 20 20 2a 2a 20 76 2d 74 61 62 6c 65 20  .    ** v-table 
1afb0 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 62 65  would have to be
1afc0 20 72 65 61 64 79 20 66 6f 72 20 74 68 65 20 73   ready for the s
1afd0 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72 75  qlite3_vtab stru
1afe0 63 74 75 72 65 20 69 74 73 65 6c 66 0a 20 20 20  cture itself.   
1aff0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
1b000 64 61 74 65 64 20 77 68 65 6e 65 76 65 72 20 73  dated whenever s
1b010 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 69 73  qlite3_step() is
1b020 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
1b030 68 69 6e 20 0a 20 20 20 20 2a 2a 20 61 20 76 2d  hin .    ** a v-
1b040 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 20 20  table method..  
1b050 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
1b060 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e 70 53  >aDb[pOp->p1].pS
1b070 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1b080 6f 6b 69 65 21 3d 69 4d 65 74 61 20 29 7b 0a 20  okie!=iMeta ){. 
1b090 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
1b0a0 74 4f 6e 65 53 63 68 65 6d 61 28 64 62 2c 20 70  tOneSchema(db, p
1b0b0 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 7d 0a 20  Op->p1);.    }. 
1b0c0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
1b0d0 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  1;.    rc = SQLI
1b0e0 54 45 5f 53 43 48 45 4d 41 3b 0a 20 20 7d 0a 20  TE_SCHEMA;.  }. 
1b0f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
1b100 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1b110 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
1b120 2a 20 4f 70 63 6f 64 65 3a 20 52 65 61 64 43 6f  * Opcode: ReadCo
1b130 6f 6b 69 65 20 50 31 20 50 32 20 50 33 20 2a 20  okie P1 P2 P3 * 
1b140 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 63 6f 6f  *.**.** Read coo
1b150 6b 69 65 20 6e 75 6d 62 65 72 20 50 33 20 66 72  kie number P3 fr
1b160 6f 6d 20 64 61 74 61 62 61 73 65 20 50 31 20 61  om database P1 a
1b170 6e 64 20 77 72 69 74 65 20 69 74 20 69 6e 74 6f  nd write it into
1b180 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
1b190 20 50 33 3d 3d 31 20 69 73 20 74 68 65 20 73 63   P3==1 is the sc
1b1a0 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50  hema version.  P
1b1b0 33 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61  3==2 is the data
1b1c0 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  base format..** 
1b1d0 50 33 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63  P3==3 is the rec
1b1e0 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63  ommended pager c
1b1f0 61 63 68 65 20 73 69 7a 65 2c 20 61 6e 64 20 73  ache size, and s
1b200 6f 20 66 6f 72 74 68 2e 20 20 50 31 3d 3d 30 20  o forth.  P1==0 
1b210 69 73 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64  is.** the main d
1b220 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1b230 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20 64 61   P1==1 is the da
1b240 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
1b250 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
1b260 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 2a  porary tables..*
1b270 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1b280 62 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  be a read-lock o
1b290 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1b2a0 65 69 74 68 65 72 20 61 20 74 72 61 6e 73 61 63  either a transac
1b2b0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
1b2c0 73 74 61 72 74 65 64 20 6f 72 20 74 68 65 72 65  started or there
1b2d0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1b2e0 20 63 75 72 73 6f 72 29 20 62 65 66 6f 72 65 0a   cursor) before.
1b2f0 2a 2a 20 65 78 65 63 75 74 69 6e 67 20 74 68 69  ** executing thi
1b300 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
1b310 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 64 43 6f  /.case OP_ReadCo
1b320 6f 6b 69 65 3a 20 7b 20 20 20 20 20 20 20 20 20  okie: {         
1b330 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
1b340 0a 20 20 69 6e 74 20 69 4d 65 74 61 3b 0a 20 20  .  int iMeta;.  
1b350 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69  int iDb;.  int i
1b360 43 6f 6f 6b 69 65 3b 0a 0a 20 20 61 73 73 65 72  Cookie;..  asser
1b370 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
1b380 29 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e  );.  iDb = pOp->
1b390 70 31 3b 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20  p1;.  iCookie = 
1b3a0 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
1b3b0 74 28 20 70 4f 70 2d 3e 70 33 3c 53 51 4c 49 54  t( pOp->p3<SQLIT
1b3c0 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 20 29  E_N_BTREE_META )
1b3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
1b3e0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
1b3f0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
1b400 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
1b410 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b420 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
1b430 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29 3b  reeMask, iDb) );
1b440 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1b450 47 65 74 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b  GetMeta(db->aDb[
1b460 69 44 62 5d 2e 70 42 74 2c 20 69 43 6f 6f 6b 69  iDb].pBt, iCooki
1b470 65 2c 20 28 75 33 32 20 2a 29 26 69 4d 65 74 61  e, (u32 *)&iMeta
1b480 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
1b490 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
1b4a0 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
1b4b0 3d 20 69 4d 65 74 61 3b 0a 20 20 62 72 65 61 6b  = iMeta;.  break
1b4c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1b4d0 53 65 74 43 6f 6f 6b 69 65 20 50 31 20 50 32 20  SetCookie P1 P2 
1b4e0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69  P3 * *.**.** Wri
1b4f0 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  te the integer v
1b500 61 6c 75 65 20 50 33 20 69 6e 74 6f 20 63 6f 6f  alue P3 into coo
1b510 6b 69 65 20 6e 75 6d 62 65 72 20 50 32 20 6f 66  kie number P2 of
1b520 20 64 61 74 61 62 61 73 65 20 50 31 2e 0a 2a 2a   database P1..**
1b530 20 50 32 3d 3d 31 20 69 73 20 74 68 65 20 73 63   P2==1 is the sc
1b540 68 65 6d 61 20 76 65 72 73 69 6f 6e 2e 20 20 50  hema version.  P
1b550 32 3d 3d 32 20 69 73 20 74 68 65 20 64 61 74 61  2==2 is the data
1b560 62 61 73 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  base format..** 
1b570 50 32 3d 3d 33 20 69 73 20 74 68 65 20 72 65 63  P2==3 is the rec
1b580 6f 6d 6d 65 6e 64 65 64 20 70 61 67 65 72 20 63  ommended pager c
1b590 61 63 68 65 20 0a 2a 2a 20 73 69 7a 65 2c 20 61  ache .** size, a
1b5a0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
1b5b0 3d 3d 30 20 69 73 20 74 68 65 20 6d 61 69 6e 20  ==0 is the main 
1b5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1b5d0 64 20 50 31 3d 3d 31 20 69 73 20 74 68 65 20 0a  d P1==1 is the .
1b5e0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b5f0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1b600 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
1b610 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
1b620 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1b630 72 74 65 64 20 62 65 66 6f 72 65 20 65 78 65 63  rted before exec
1b640 75 74 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  uting this opcod
1b650 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  e..*/.case OP_Se
1b660 74 43 6f 6f 6b 69 65 3a 20 7b 0a 20 20 44 62 20  tCookie: {.  Db 
1b670 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *pDb;.  assert( 
1b680 70 4f 70 2d 3e 70 32 3c 53 51 4c 49 54 45 5f 4e  pOp->p2<SQLITE_N
1b690 5f 42 54 52 45 45 5f 4d 45 54 41 20 29 3b 0a 20  _BTREE_META );. 
1b6a0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1b6b0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64  >=0 && pOp->p1<d
1b6c0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
1b6d0 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
1b6e0 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70  ->btreeMask, pOp
1b6f0 2d 3e 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ->p1) );.  asser
1b700 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  t( p->readOnly==
1b710 30 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  0 );.  pDb = &db
1b720 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  ->aDb[pOp->p1];.
1b730 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
1b740 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
1b750 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1b760 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 70 4f  MutexHeld(db, pO
1b770 70 2d 3e 70 31 2c 20 30 29 20 29 3b 0a 23 69 66  p->p1, 0) );.#if
1b780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b790 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66  _CONCURRENT.  if
1b7a0 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e  ( db->bConcurren
1b7b0 74 20 0a 20 20 20 26 26 20 28 70 4f 70 2d 3e 70  t .   && (pOp->p
1b7c0 32 3d 3d 42 54 52 45 45 5f 55 53 45 52 5f 56 45  2==BTREE_USER_VE
1b7d0 52 53 49 4f 4e 20 7c 7c 20 70 4f 70 2d 3e 70 32  RSION || pOp->p2
1b7e0 3d 3d 42 54 52 45 45 5f 41 50 50 4c 49 43 41 54  ==BTREE_APPLICAT
1b7f0 49 4f 4e 5f 49 44 29 0a 20 20 29 7b 0a 20 20 20  ION_ID).  ){.   
1b800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b810 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
1b820 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e  dbeError(p, "can
1b830 6e 6f 74 20 6d 6f 64 69 66 79 20 25 73 20 77 69  not modify %s wi
1b840 74 68 69 6e 20 43 4f 4e 43 55 52 52 45 4e 54 20  thin CONCURRENT 
1b850 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20 20  transaction",.  
1b860 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 3d 3d 42        pOp->p2==B
1b870 54 52 45 45 5f 55 53 45 52 5f 56 45 52 53 49 4f  TREE_USER_VERSIO
1b880 4e 20 3f 20 22 75 73 65 72 5f 76 65 72 73 69 6f  N ? "user_versio
1b890 6e 22 20 3a 20 22 61 70 70 6c 69 63 61 74 69 6f  n" : "applicatio
1b8a0 6e 5f 69 64 22 0a 20 20 20 20 29 3b 0a 20 20 20  n_id".    );.   
1b8b0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
1b8c0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 23 65  to_error;.  }.#e
1b8d0 6e 64 69 66 0a 20 20 2f 2a 20 53 65 65 20 6e 6f  ndif.  /* See no
1b8e0 74 65 20 61 62 6f 75 74 20 69 6e 64 65 78 20 73  te about index s
1b8f0 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65  hifting on OP_Re
1b900 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63  adCookie */.  rc
1b910 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
1b920 70 64 61 74 65 4d 65 74 61 28 70 44 62 2d 3e 70  pdateMeta(pDb->p
1b930 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  Bt, pOp->p2, pOp
1b940 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20 70 4f 70  ->p3);.  if( pOp
1b950 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43 48 45  ->p2==BTREE_SCHE
1b960 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20  MA_VERSION ){.  
1b970 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 73 63    /* When the sc
1b980 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e  hema cookie chan
1b990 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ges, record the 
1b9a0 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72  new cookie inter
1b9b0 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73  nally */.    ass
1b9c0 65 72 74 28 20 64 62 2d 3e 62 43 6f 6e 63 75 72  ert( db->bConcur
1b9d0 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  rent==0 );.    p
1b9e0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db->pSchema->sch
1b9f0 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70 4f 70  ema_cookie = pOp
1ba00 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  ->p3;.    db->fl
1ba10 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
1ba20 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 7d  ternChanges;.  }
1ba30 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 32  else if( pOp->p2
1ba40 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  ==BTREE_FILE_FOR
1ba50 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  MAT ){.    /* Re
1ba60 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69 6e 20  cord changes in 
1ba70 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
1ba80 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53 63 68  */.    pDb->pSch
1ba90 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
1baa0 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d 0a   = pOp->p3;.  }.
1bab0 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 31    if( pOp->p1==1
1bac0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76 61 6c   ){.    /* Inval
1bad0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70 61 72  idate all prepar
1bae0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68  ed statements wh
1baf0 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d 50 20  enever the TEMP 
1bb00 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1bb10 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e 67 65  schema is change
1bb20 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36 34 34  d.  Ticket #1644
1bb30 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
1bb40 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
1bb50 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
1bb60 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
1bb70 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
1bb80 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
1bb90 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
1bba0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
1bbb0 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32 20 50  OpenRead P1 P2 P
1bbc0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
1bbd0 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62  sis: root=P2 iDb
1bbe0 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61  =P3.**.** Open a
1bbf0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1bc00 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  r for the databa
1bc10 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72  se table whose r
1bc20 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a 20 50  oot page is.** P
1bc30 32 20 69 6e 20 61 20 64 61 74 61 62 61 73 65 20  2 in a database 
1bc40 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74 61 62  file.  The datab
1bc50 61 73 65 20 66 69 6c 65 20 69 73 20 64 65 74 65  ase file is dete
1bc60 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20 0a 2a  rmined by P3. .*
1bc70 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20 74 68  * P3==0 means th
1bc80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
1bc90 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65   P3==1 means the
1bca0 20 64 61 74 61 62 61 73 65 20 75 73 65 64 20 66   database used f
1bcb0 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  or .** temporary
1bcc0 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50 33 3e   tables, and P3>
1bcd0 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74 68 65  1 means used the
1bce0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
1bcf0 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74 61 62  ttached.** datab
1bd00 61 73 65 2e 20 20 47 69 76 65 20 74 68 65 20 6e  ase.  Give the n
1bd10 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69 64 65  ew cursor an ide
1bd20 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e 20 20  ntifier of P1.  
1bd30 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75 65 73  The P1.** values
1bd40 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63 6f 6e   need not be con
1bd50 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c 6c 20  tiguous but all 
1bd60 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75 6c 64  P1 values should
1bd70 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67 65   be small intege
1bd80 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  rs..** It is an 
1bd90 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74 6f 20  error for P1 to 
1bda0 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  be negative..**.
1bdb0 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68 65 6e  ** If P5!=0 then
1bdc0 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   use the content
1bdd0 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20   of register P2 
1bde0 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  as the root page
1bdf0 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76 61 6c  , not.** the val
1be00 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c 66 2e  ue of P2 itself.
1be10 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77 69 6c  .**.** There wil
1be20 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  l be a read lock
1be30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1be40 20 77 68 65 6e 65 76 65 72 20 74 68 65 72 65 20   whenever there 
1be50 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 63 75  is an.** open cu
1be60 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20 64 61  rsor.  If the da
1be70 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c 6f 63  tabase was unloc
1be80 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ked prior to thi
1be90 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
1bea0 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   then a read loc
1beb0 6b 20 69 73 20 61 63 71 75 69 72 65 64 20 61 73  k is acquired as
1bec0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 69 6e   part of this in
1bed0 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20 72 65  struction.  A re
1bee0 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c 6f 77  ad.** lock allow
1bef0 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  s other processe
1bf00 73 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61  s to read the da
1bf10 74 61 62 61 73 65 20 62 75 74 20 70 72 6f 68 69  tabase but prohi
1bf20 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74 68 65  bits.** any othe
1bf30 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20 6d  r process from m
1bf40 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64 61 74  odifying the dat
1bf50 61 62 61 73 65 2e 20 20 54 68 65 20 72 65 61 64  abase.  The read
1bf60 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65 6c 65   lock is.** rele
1bf70 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20 63 75  ased when all cu
1bf80 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64  rsors are closed
1bf90 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73 74 72  .  If this instr
1bfa0 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 0a  uction attempts.
1bfb0 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65 61 64  ** to get a read
1bfc0 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c 73 2c   lock but fails,
1bfd0 20 74 68 65 20 73 63 72 69 70 74 20 74 65 72 6d   the script term
1bfe0 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e 0a 2a  inates with an.*
1bff0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  * SQLITE_BUSY er
1c000 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1c010 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d 61 79  The P4 value may
1c020 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 69 6e   be either an in
1c030 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33 32 29  teger (P4_INT32)
1c040 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
1c050 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  .** a KeyInfo st
1c060 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45 59 49  ructure (P4_KEYI
1c070 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73 20 61  NFO). If it is a
1c080 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
1c090 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
1c0a0 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64 20 73  ure, then said s
1c0b0 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73  tructure defines
1c0c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64   the content and
1c0d0 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a 20 73   collating .** s
1c0e0 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65 20 69  equence of the i
1c0f0 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65 6e 65  ndex being opene
1c100 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1c110 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65 67 65   P4 is an intege
1c120 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69 74 20  r .** value, it 
1c130 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1c140 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1c150 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1c160 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4f 70  .** See also: Op
1c170 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65 6e 49  enWrite, ReopenI
1c180 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  dx.*/./* Opcode:
1c190 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20 50 32   ReopenIdx P1 P2
1c1a0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1c1b0 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1c1c0 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Db=P3.**.** The 
1c1d0 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64 65  ReopenIdx opcode
1c1e0 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c   works exactly l
1c1f0 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65 78 63  ike ReadOpen exc
1c200 65 70 74 20 74 68 61 74 20 69 74 20 66 69 72 73  ept that it firs
1c210 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73  t.** checks to s
1c220 65 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ee if the cursor
1c230 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65 61 64   on P1 is alread
1c240 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20 72 6f  y open with a ro
1c250 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  ot page.** numbe
1c260 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66 20 69  r of P2 and if i
1c270 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f 64 65  t is this opcode
1c280 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d 6f 70   becomes a no-op
1c290 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c2a0 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  s,.** if the cur
1c2b0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
1c2c0 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65 6f 70  pen, do not reop
1c2d0 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  en it..**.** The
1c2e0 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f 64   ReopenIdx opcod
1c2f0 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
1c300 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20 61 6e  ed with P5==0 an
1c310 64 20 77 69 74 68 20 50 34 20 62 65 69 6e 67 0a  d with P4 being.
1c320 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46 4f 20  ** a P4_KEYINFO 
1c330 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68 65 72  object.  Further
1c340 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76 61 6c  more, the P3 val
1c350 75 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ue must be the s
1c360 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72 79 20  ame as.** every 
1c370 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64 78 20  other ReopenIdx 
1c380 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f 72 20  or OpenRead for 
1c390 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
1c3a0 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 65  number..**.** Se
1c3b0 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64 20 6f  e the OpenRead o
1c3c0 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74 61 74  pcode documentat
1c3d0 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
1c3e0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1c3f0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70  */./* Opcode: Op
1c400 65 6e 57 72 69 74 65 20 50 31 20 50 32 20 50 33  enWrite P1 P2 P3
1c410 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
1c420 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d  is: root=P2 iDb=
1c430 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  P3.**.** Open a 
1c440 72 65 61 64 2f 77 72 69 74 65 20 63 75 72 73 6f  read/write curso
1c450 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20 74 68  r named P1 on th
1c460 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1c470 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a 20 70   whose root.** p
1c480 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72 20 69  age is P2.  Or i
1c490 66 20 50 35 21 3d 30 20 75 73 65 20 74 68 65 20  f P5!=0 use the 
1c4a0 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
1c4b0 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64 20 74  ter P2 to find t
1c4c0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  he.** root page.
1c4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 76 61  .**.** The P4 va
1c4e0 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  lue may be eithe
1c4f0 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28 50 34  r an integer (P4
1c500 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70 6f 69  _INT32) or a poi
1c510 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b 65 79  nter to.** a Key
1c520 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 28  Info structure (
1c530 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49 66 20  P4_KEYINFO). If 
1c540 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  it is a pointer 
1c550 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  to a KeyInfo .**
1c560 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
1c570 20 73 61 69 64 20 73 74 72 75 63 74 75 72 65 20   said structure 
1c580 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f 6e 74  defines the cont
1c590 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ent and collatin
1c5a0 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  g .** sequence o
1c5b0 66 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  f the index bein
1c5c0 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65 72 77  g opened. Otherw
1c5d0 69 73 65 2c 20 69 66 20 50 34 20 69 73 20 61 6e  ise, if P4 is an
1c5e0 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76 61 6c   integer .** val
1c5f0 75 65 2c 20 69 74 20 69 73 20 73 65 74 20 74 6f  ue, it is set to
1c600 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1c610 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
1c620 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65 0a 2a  ble, or to the.*
1c630 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65 78 20  * largest index 
1c640 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66  of any column of
1c650 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
1c660 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  is actually used
1c670 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ..**.** This ins
1c680 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6a  truction works j
1c690 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52 65 61  ust like OpenRea
1c6a0 64 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  d except that it
1c6b0 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72 73 6f   opens the curso
1c6c0 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77 72 69  r.** in read/wri
1c6d0 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20 61 20  te mode.  For a 
1c6e0 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74 68 65  given table, the
1c6f0 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72  re can be one or
1c700 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   more read-only.
1c710 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20 61 20  ** cursors or a 
1c720 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72 69 74  single read/writ
1c730 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e 6f 74  e cursor but not
1c740 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   both..**.** See
1c750 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64 2e 0a   also OpenRead..
1c760 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f 70 65  */.case OP_Reope
1c770 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20 6e 46  nIdx: {.  int nF
1c780 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ield;.  KeyInfo 
1c790 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 6e 74  *pKeyInfo;.  int
1c7a0 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a   p2;.  int iDb;.
1c7b0 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a 20 20    int wrFlag;.  
1c7c0 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56 64 62  Btree *pX;.  Vdb
1c7d0 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  eCursor *pCur;. 
1c7e0 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
1c7f0 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
1c800 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c  || pOp->p5==OPFL
1c810 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61  AG_SEEKEQ );.  a
1c820 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79  ssert( pOp->p4ty
1c830 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29  pe==P4_KEYINFO )
1c840 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e 61 70  ;.  pCur = p->ap
1c850 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
1c860 69 66 28 20 70 43 75 72 20 26 26 20 70 43 75 72  if( pCur && pCur
1c870 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75 33 32  ->pgnoRoot==(u32
1c880 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20 20 20  )pOp->p2 ){.    
1c890 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 44  assert( pCur->iD
1c8a0 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20 20 20  b==pOp->p3 );   
1c8b0 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65 65 64     /* Guaranteed
1c8c0 20 62 79 20 74 68 65 20 63 6f 64 65 20 67 65 6e   by the code gen
1c8d0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 67 6f  erator */.    go
1c8e0 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73  to open_cursor_s
1c8f0 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a 20 20  et_hints;.  }.  
1c900 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1c910 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1c920 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f 70 65  y open or is ope
1c930 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n on a different
1c940 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
1c950 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  n fall through i
1c960 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  nto OP_OpenRead 
1c970 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f 70 65  to force a reope
1c980 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  n */.case OP_Ope
1c990 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50 5f 4f  nRead:.case OP_O
1c9a0 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61 73 73  penWrite:..  ass
1c9b0 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ert( pOp->opcode
1c9c0 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 7c  ==OP_OpenWrite |
1c9d0 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20  | pOp->p5==0 || 
1c9e0 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f  pOp->p5==OPFLAG_
1c9f0 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65  SEEKEQ );.  asse
1ca00 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
1ca10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1ca20 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70  p->opcode==OP_Op
1ca30 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d 3e 6f  enRead || pOp->o
1ca40 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70 65 6e  pcode==OP_Reopen
1ca50 49 64 78 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  Idx.          ||
1ca60 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
1ca70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  );..  if( p->exp
1ca80 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  ired ){.    rc =
1ca90 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
1caa0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f 74 6f  LLBACK;.    goto
1cab0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1cac0 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46 69 65  ror;.  }..  nFie
1cad0 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79 49 6e  ld = 0;.  pKeyIn
1cae0 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d 20 70  fo = 0;.  p2 = p
1caf0 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20 3d 20  Op->p2;.  iDb = 
1cb00 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72  pOp->p3;.  asser
1cb10 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
1cb20 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
1cb30 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
1cb40 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
1cb50 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26  Db) );.  pDb = &
1cb60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
1cb70 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b 0a 20  pX = pDb->pBt;. 
1cb80 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29   assert( pX!=0 )
1cb90 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
1cba0 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74  ode==OP_OpenWrit
1cbb0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1cbc0 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
1cbd0 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  E==BTREE_FORDELE
1cbe0 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c 61 67  TE );.    wrFlag
1cbf0 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52 20 7c   = BTREE_WRCSR |
1cc00 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c   (pOp->p5 & OPFL
1cc10 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b 0a 20  AG_FORDELETE);. 
1cc20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
1cc30 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1cc40 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
1cc50 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
1cc60 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1cc70 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69 74 65  at < p->minWrite
1cc80 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a 20 20  FileFormat ){.  
1cc90 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46      p->minWriteF
1cca0 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44 62 2d  ileFormat = pDb-
1ccb0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1ccc0 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  ormat;.    }.  }
1ccd0 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c 61 67  else{.    wrFlag
1cce0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1ccf0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
1cd00 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20 20 20  _P2ISREG ){.    
1cd10 61 73 73 65 72 74 28 20 70 32 3e 30 20 29 3b 0a  assert( p2>0 );.
1cd20 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3c 3d      assert( p2<=
1cd30 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
1cd40 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
1cd50 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 32 5d  pIn2 = &aMem[p2]
1cd60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1cd70 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29 20 29  mIsValid(pIn2) )
1cd80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
1cd90 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
1cda0 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20 20 20  _Int)!=0 );.    
1cdb0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1cdc0 74 65 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a  tegerify(pIn2);.
1cdd0 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29 70 49      p2 = (int)pI
1cde0 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f 2a 20  n2->u.i;.    /* 
1cdf0 54 68 65 20 70 32 20 76 61 6c 75 65 20 61 6c 77  The p2 value alw
1ce00 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  ays comes from a
1ce10 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61 74 65   prior OP_Create
1ce20 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 61 6e 64  Table opcode and
1ce30 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 70 63  .    ** that opc
1ce40 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ode will always 
1ce50 73 65 74 20 74 68 65 20 70 32 20 76 61 6c 75 65  set the p2 value
1ce60 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20 6f 72   to 2 or more or
1ce70 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20 20 20   else fail..    
1ce80 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  ** If there were
1ce90 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20   a failure, the 
1cea0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1ceb0 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20 68 61  nt would have ha
1cec0 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lted.    ** befo
1ced0 72 65 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  re reaching this
1cee0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 2a 2f   instruction. */
1cef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32 3e  .    assert( p2>
1cf00 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =2 );.  }.  if( 
1cf10 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1cf20 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
1cf30 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1cf40 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
1cf50 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1cf60 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29  ->enc==ENC(db) )
1cf70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b  ;.    assert( pK
1cf80 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29  eyInfo->db==db )
1cf90 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70  ;.    nField = p
1cfa0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1cfb0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1cfc0 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  d;.  }else if( p
1cfd0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
1cfe0 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e 46 69 65  NT32 ){.    nFie
1cff0 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  ld = pOp->p4.i;.
1d000 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4f    }.  assert( pO
1d010 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73  p->p1>=0 );.  as
1d020 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 3d 30 20  sert( nField>=0 
1d030 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
1d040 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20 2f 2a 20  Field==0 );  /* 
1d050 54 61 62 6c 65 20 77 69 74 68 20 49 4e 54 45 47  Table with INTEG
1d060 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  ER PRIMARY KEY a
1d070 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 20  nd nothing else 
1d080 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f  */.  pCur = allo
1d090 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1d0a0 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64 2c 20 69  p->p1, nField, i
1d0b0 44 62 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45  Db, CURTYPE_BTRE
1d0c0 45 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d  E);.  if( pCur==
1d0d0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1d0e0 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77  .  pCur->nullRow
1d0f0 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e 69 73   = 1;.  pCur->is
1d100 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 70  Ordered = 1;.  p
1d110 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
1d120 70 32 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p2;.#ifdef SQLIT
1d130 45 5f 44 45 42 55 47 0a 20 20 70 43 75 72 2d 3e  E_DEBUG.  pCur->
1d140 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
1d150 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 73  .#endif.  rc = s
1d160 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d170 72 28 70 58 2c 20 70 32 2c 20 77 72 46 6c 61 67  r(pX, p2, wrFlag
1d180 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
1d190 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1d1a0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1d1b0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 2f 2a  = pKeyInfo;.  /*
1d1c0 20 53 65 74 20 74 68 65 20 56 64 62 65 43 75 72   Set the VdbeCur
1d1d0 73 6f 72 2e 69 73 54 61 62 6c 65 20 76 61 72 69  sor.isTable vari
1d1e0 61 62 6c 65 2e 20 50 72 65 76 69 6f 75 73 20 76  able. Previous v
1d1f0 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20 2a 2a 20  ersions of.  ** 
1d200 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 63  SQLite used to c
1d210 68 65 63 6b 20 69 66 20 74 68 65 20 72 6f 6f 74  heck if the root
1d220 2d 70 61 67 65 20 66 6c 61 67 73 20 77 65 72 65  -page flags were
1d230 20 73 61 6e 65 20 61 74 20 74 68 69 73 20 70 6f   sane at this po
1d240 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 72 65 70  int.  ** and rep
1d250 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
1d260 72 75 70 74 69 6f 6e 20 69 66 20 74 68 65 79 20  ruption if they 
1d270 77 65 72 65 20 6e 6f 74 2c 20 62 75 74 20 74 68  were not, but th
1d280 69 73 20 63 68 65 63 6b 20 68 61 73 0a 20 20 2a  is check has.  *
1d290 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64 20 69 6e  * since moved in
1d2a0 74 6f 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  to the btree lay
1d2b0 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70 43 75 72  er.  */  .  pCur
1d2c0 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70 4f 70 2d  ->isTable = pOp-
1d2d0 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b 45 59 49  >p4type!=P4_KEYI
1d2e0 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75 72 73 6f  NFO;..open_curso
1d2f0 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a 20 20 61  r_set_hints:.  a
1d300 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 42 55  ssert( OPFLAG_BU
1d310 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f 42 55 4c  LKCSR==BTREE_BUL
1d320 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73 73 65 72  KLOAD );.  asser
1d330 74 28 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  t( OPFLAG_SEEKEQ
1d340 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
1d350 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
1d360 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
1d370 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69 66 64 65  BULKCSR );.#ifde
1d380 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d390 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 74  CURSOR_HINTS.  t
1d3a0 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
1d3b0 20 26 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51   & OPFLAG_SEEKEQ
1d3c0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c   );.#endif.  sql
1d3d0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
1d3e0 69 6e 74 46 6c 61 67 73 28 70 43 75 72 2d 3e 75  intFlags(pCur->u
1d3f0 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20  c.pCursor,.     
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 20 20 20 20 20 20 28 70 4f 70 2d 3e            (pOp->
1d420 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 42 55 4c  p5 & (OPFLAG_BUL
1d430 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53 45 45 4b  KCSR|OPFLAG_SEEK
1d440 45 51 29 29 29 3b 0a 20 20 69 66 28 20 72 63 20  EQ)));.  if( rc 
1d450 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1d460 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1d470 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1d480 3a 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  : OpenEphemeral 
1d490 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a 2a 2a  P1 P2 * P4 P5.**
1d4a0 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75   Synopsis: nColu
1d4b0 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  mn=P2.**.** Open
1d4c0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 50 31   a new cursor P1
1d4d0 20 74 6f 20 61 20 74 72 61 6e 73 69 65 6e 74 20   to a transient 
1d4e0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 63 75  table..** The cu
1d4f0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 20 6f  rsor is always o
1d500 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65  pened read/write
1d510 20 65 76 65 6e 20 69 66 20 0a 2a 2a 20 74 68 65   even if .** the
1d520 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
1d530 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 54 68  s read-only.  Th
1d540 65 20 65 70 68 65 6d 65 72 61 6c 0a 2a 2a 20 74  e ephemeral.** t
1d550 61 62 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  able is deleted 
1d560 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1d570 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1d580 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 50   closed..**.** P
1d590 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  2 is the number 
1d5a0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1d5b0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
1d5c0 65 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  e..** The cursor
1d5d0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 42 54 72   points to a BTr
1d5e0 65 65 20 74 61 62 6c 65 20 69 66 20 50 34 3d 3d  ee table if P4==
1d5f0 30 20 61 6e 64 20 74 6f 20 61 20 42 54 72 65 65  0 and to a BTree
1d600 20 69 6e 64 65 78 0a 2a 2a 20 69 66 20 50 34 20   index.** if P4 
1d610 69 73 20 6e 6f 74 20 30 2e 20 20 49 66 20 50 34  is not 0.  If P4
1d620 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
1d630 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79   points to a Key
1d640 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
1d650 2a 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  * that defines t
1d660 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 6b 65 79  he format of key
1d670 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1d680 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 70 61 72  **.** The P5 par
1d690 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 61 20  ameter can be a 
1d6a0 6d 61 73 6b 20 6f 66 20 74 68 65 20 42 54 52 45  mask of the BTRE
1d6b0 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
1d6c0 64 0a 2a 2a 20 69 6e 20 62 74 72 65 65 2e 68 2e  d.** in btree.h.
1d6d0 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 63 6f    These flags co
1d6e0 6e 74 72 6f 6c 20 61 73 70 65 63 74 73 20 6f 66  ntrol aspects of
1d6f0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
1d700 66 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 2e 20  f.** the btree. 
1d710 20 54 68 65 20 42 54 52 45 45 5f 4f 4d 49 54 5f   The BTREE_OMIT_
1d720 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 42 54 52 45  JOURNAL and BTRE
1d730 45 5f 53 49 4e 47 4c 45 20 66 6c 61 67 73 20 61  E_SINGLE flags a
1d740 72 65 0a 2a 2a 20 61 64 64 65 64 20 61 75 74 6f  re.** added auto
1d750 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a  matically..*/./*
1d760 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 41 75 74   Opcode: OpenAut
1d770 6f 69 6e 64 65 78 20 50 31 20 50 32 20 2a 20 50  oindex P1 P2 * P
1d780 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1d790 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a   nColumn=P2.**.*
1d7a0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
1d7b0 72 6b 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  rks the same as 
1d7c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1d7d0 2e 20 20 49 74 20 68 61 73 20 61 0a 2a 2a 20 64  .  It has a.** d
1d7e0 69 66 66 65 72 65 6e 74 20 6e 61 6d 65 20 74 6f  ifferent name to
1d7f0 20 64 69 73 74 69 6e 67 75 69 73 68 20 69 74 73   distinguish its
1d800 20 75 73 65 2e 20 20 54 61 62 6c 65 73 20 63 72   use.  Tables cr
1d810 65 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 62  eated using.** b
1d820 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 77 69  y this opcode wi
1d830 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  ll be used for a
1d840 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
1d850 61 74 65 64 20 74 72 61 6e 73 69 65 6e 74 0a 2a  ated transient.*
1d860 2a 20 69 6e 64 69 63 65 73 20 69 6e 20 6a 6f 69  * indices in joi
1d870 6e 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  ns..*/.case OP_O
1d880 70 65 6e 41 75 74 6f 69 6e 64 65 78 3a 20 0a 63  penAutoindex: .c
1d890 61 73 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ase OP_OpenEphem
1d8a0 65 72 61 6c 3a 20 7b 0a 20 20 56 64 62 65 43 75  eral: {.  VdbeCu
1d8b0 72 73 6f 72 20 2a 70 43 78 3b 0a 20 20 4b 65 79  rsor *pCx;.  Key
1d8c0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1d8d0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1d8e0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 3d 20 0a  int vfsFlags = .
1d8f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1d900 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
1d910 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1d920 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 53  CREATE |.      S
1d930 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1d940 53 49 56 45 20 7c 0a 20 20 20 20 20 20 53 51 4c  SIVE |.      SQL
1d950 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1d960 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 53  NCLOSE |.      S
1d970 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1d980 49 45 4e 54 5f 44 42 3b 0a 20 20 61 73 73 65 72  IENT_DB;.  asser
1d990 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b  t( pOp->p1>=0 );
1d9a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1d9b0 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20 3d  p2>=0 );.  pCx =
1d9c0 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
1d9d0 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  p, pOp->p1, pOp-
1d9e0 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59 50 45  >p2, -1, CURTYPE
1d9f0 5f 42 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70  _BTREE);.  if( p
1da00 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  Cx==0 ) goto no_
1da10 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c  mem;.  pCx->null
1da20 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 78 2d 3e  Row = 1;.  pCx->
1da30 69 73 45 70 68 65 6d 65 72 61 6c 20 3d 20 31 3b  isEphemeral = 1;
1da40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1da50 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1da60 73 2c 20 30 2c 20 64 62 2c 20 26 70 43 78 2d 3e  s, 0, db, &pCx->
1da70 70 42 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pBtx, .         
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 42                 B
1da90 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
1daa0 4c 20 7c 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  L | BTREE_SINGLE
1dab0 20 7c 20 70 4f 70 2d 3e 70 35 2c 20 76 66 73 46   | pOp->p5, vfsF
1dac0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  lags);.  if( rc=
1dad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1daf0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 43  reeBeginTrans(pC
1db00 78 2d 3e 70 42 74 78 2c 20 31 29 3b 0a 20 20 7d  x->pBtx, 1);.  }
1db10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1db20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
1db30 66 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  f a transient in
1db40 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2c  dex is required,
1db50 20 63 72 65 61 74 65 20 69 74 20 62 79 20 63 61   create it by ca
1db60 6c 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 73 71 6c  lling.    ** sql
1db70 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1db80 61 62 6c 65 28 29 20 77 69 74 68 20 74 68 65 20  able() with the 
1db90 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 66 6c  BTREE_BLOBKEY fl
1dba0 61 67 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ag before.    **
1dbb0 20 6f 70 65 6e 69 6e 67 20 69 74 2e 20 49 66 20   opening it. If 
1dbc0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
1dbd0 65 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 6a  e is required, j
1dbe0 75 73 74 20 75 73 65 20 74 68 65 0a 20 20 20 20  ust use the.    
1dbf0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1dc00 20 63 72 65 61 74 65 64 20 74 61 62 6c 65 20 77   created table w
1dc10 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 31 20  ith root-page 1 
1dc20 28 61 6e 20 42 4c 4f 42 5f 49 4e 54 4b 45 59 20  (an BLOB_INTKEY 
1dc30 74 61 62 6c 65 29 2e 0a 20 20 20 20 2a 2f 0a 20  table)..    */. 
1dc40 20 20 20 69 66 28 20 28 70 43 78 2d 3e 70 4b 65     if( (pCx->pKe
1dc50 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1dc60 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
1dc70 6e 66 6f 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  nfo)!=0 ){.     
1dc80 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
1dc90 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1dca0 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1dcb0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
1dcc0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1dcd0 65 54 61 62 6c 65 28 70 43 78 2d 3e 70 42 74 78  eTable(pCx->pBtx
1dce0 2c 20 26 70 67 6e 6f 2c 20 42 54 52 45 45 5f 42  , &pgno, BTREE_B
1dcf0 4c 4f 42 4b 45 59 20 7c 20 70 4f 70 2d 3e 70 35  LOBKEY | pOp->p5
1dd00 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ); .      if( rc
1dd10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dd20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1dd30 67 6e 6f 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  gno==MASTER_ROOT
1dd40 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +1 );.        as
1dd50 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1dd60 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20 20 20 20  db==db );.      
1dd70 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1dd80 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
1dd90 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1dda0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ddb0 73 6f 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 70  sor(pCx->pBtx, p
1ddc0 67 6e 6f 2c 20 42 54 52 45 45 5f 57 52 43 53 52  gno, BTREE_WRCSR
1ddd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 78 2d    pKeyInfo, pCx-
1de00 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
1de10 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 78 2d      }.      pCx-
1de20 3e 69 73 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  >isTable = 0;.  
1de30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1de40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1de50 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 42 74 78  Cursor(pCx->pBtx
1de60 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 42  , MASTER_ROOT, B
1de70 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20 20  TREE_WRCSR,.    
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 78            0, pCx
1dea0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
1deb0 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c       pCx->isTabl
1dec0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
1ded0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1dee0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
1def0 72 6f 72 3b 0a 20 20 70 43 78 2d 3e 69 73 4f 72  ror;.  pCx->isOr
1df00 64 65 72 65 64 20 3d 20 28 70 4f 70 2d 3e 70 35  dered = (pOp->p5
1df10 21 3d 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  !=BTREE_UNORDERE
1df20 44 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  D);.  break;.}..
1df30 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
1df40 72 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20 50  rOpen P1 P2 P3 P
1df50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  4 *.**.** This o
1df60 70 63 6f 64 65 20 77 6f 72 6b 73 20 6c 69 6b 65  pcode works like
1df70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1df80 6c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  l except that it
1df90 20 6f 70 65 6e 73 0a 2a 2a 20 61 20 74 72 61 6e   opens.** a tran
1dfa0 73 69 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74  sient index that
1dfb0 20 69 73 20 73 70 65 63 69 66 69 63 61 6c 6c 79   is specifically
1dfc0 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 6f 72   designed to sor
1dfd0 74 20 6c 61 72 67 65 0a 2a 2a 20 74 61 62 6c 65  t large.** table
1dfe0 73 20 75 73 69 6e 67 20 61 6e 20 65 78 74 65 72  s using an exter
1dff0 6e 61 6c 20 6d 65 72 67 65 2d 73 6f 72 74 20 61  nal merge-sort a
1e000 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20  lgorithm..**.** 
1e010 49 66 20 61 72 67 75 6d 65 6e 74 20 50 33 20 69  If argument P3 i
1e020 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1e030 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68   it indicates th
1e040 61 74 20 74 68 65 20 73 6f 72 74 65 72 20 6d 61  at the sorter ma
1e050 79 0a 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74  y.** assume that
1e060 20 61 20 73 74 61 62 6c 65 20 73 6f 72 74 20 63   a stable sort c
1e070 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 66  onsidering the f
1e080 69 72 73 74 20 50 33 20 66 69 65 6c 64 73 20 6f  irst P3 fields o
1e090 66 20 65 61 63 68 0a 2a 2a 20 6b 65 79 20 69 73  f each.** key is
1e0a0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70   sufficient to p
1e0b0 72 6f 64 75 63 65 20 74 68 65 20 72 65 71 75 69  roduce the requi
1e0c0 72 65 64 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  red results..*/.
1e0d0 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70  case OP_SorterOp
1e0e0 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  en: {.  VdbeCurs
1e0f0 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73 65  or *pCx;..  asse
1e100 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29  rt( pOp->p1>=0 )
1e110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
1e120 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 70 43 78 20  >p2>=0 );.  pCx 
1e130 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  = allocateCursor
1e140 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70  (p, pOp->p1, pOp
1e150 2d 3e 70 32 2c 20 2d 31 2c 20 43 55 52 54 59 50  ->p2, -1, CURTYP
1e160 45 5f 53 4f 52 54 45 52 29 3b 0a 20 20 69 66 28  E_SORTER);.  if(
1e170 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20 6e   pCx==0 ) goto n
1e180 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 70 4b  o_mem;.  pCx->pK
1e190 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
1e1a0 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73  .pKeyInfo;.  ass
1e1b0 65 72 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 6e  ert( pCx->pKeyIn
1e1c0 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  fo->db==db );.  
1e1d0 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 4b 65  assert( pCx->pKe
1e1e0 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28  yInfo->enc==ENC(
1e1f0 64 62 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  db) );.  rc = sq
1e200 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 49  lite3VdbeSorterI
1e210 6e 69 74 28 64 62 2c 20 70 4f 70 2d 3e 70 33 2c  nit(db, pOp->p3,
1e220 20 70 43 78 29 3b 0a 20 20 69 66 28 20 72 63 20   pCx);.  if( rc 
1e230 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1e240 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1e250 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1e260 3a 20 53 65 71 75 65 6e 63 65 54 65 73 74 20 50  : SequenceTest P
1e270 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
1e280 6e 6f 70 73 69 73 3a 20 69 66 28 20 63 75 72 73  nopsis: if( curs
1e290 6f 72 5b 50 31 5d 2e 63 74 72 2b 2b 20 29 20 70  or[P1].ctr++ ) p
1e2a0 63 20 3d 20 50 32 0a 2a 2a 0a 2a 2a 20 50 31 20  c = P2.**.** P1 
1e2b0 69 73 20 61 20 73 6f 72 74 65 72 20 63 75 72 73  is a sorter curs
1e2c0 6f 72 2e 20 49 66 20 74 68 65 20 73 65 71 75 65  or. If the seque
1e2d0 6e 63 65 20 63 6f 75 6e 74 65 72 20 69 73 20 63  nce counter is c
1e2e0 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f 2c 20 6a  urrently zero, j
1e2f0 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 52 65  ump.** to P2. Re
1e300 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1e310 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
1e320 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 69 6e  ump is taken, in
1e330 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 74  crement the.** t
1e340 68 65 20 73 65 71 75 65 6e 63 65 20 76 61 6c 75  he sequence valu
1e350 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65  e..*/.case OP_Se
1e360 71 75 65 6e 63 65 54 65 73 74 3a 20 7b 0a 20 20  quenceTest: {.  
1e370 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
1e380 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1e390 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1e3a0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1e3b0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
1e3c0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
1e3d0 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29  ( isSorter(pC) )
1e3e0 3b 0a 20 20 69 66 28 20 28 70 43 2d 3e 73 65 71  ;.  if( (pC->seq
1e3f0 43 6f 75 6e 74 2b 2b 29 3d 3d 30 20 29 7b 0a 20  Count++)==0 ){. 
1e400 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
1e410 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
1e420 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f  .}../* Opcode: O
1e430 70 65 6e 50 73 65 75 64 6f 20 50 31 20 50 32 20  penPseudo P1 P2 
1e440 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
1e450 69 73 3a 20 50 33 20 63 6f 6c 75 6d 6e 73 20 69  is: P3 columns i
1e460 6e 20 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 4f 70  n r[P2].**.** Op
1e470 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  en a new cursor 
1e480 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  that points to a
1e490 20 66 61 6b 65 20 74 61 62 6c 65 20 74 68 61 74   fake table that
1e4a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
1e4b0 6c 65 0a 2a 2a 20 72 6f 77 20 6f 66 20 64 61 74  le.** row of dat
1e4c0 61 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  a.  The content 
1e4d0 6f 66 20 74 68 61 74 20 6f 6e 65 20 72 6f 77 20  of that one row 
1e4e0 69 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  is the content o
1e4f0 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  f memory.** regi
1e500 73 74 65 72 20 50 32 2e 20 20 49 6e 20 6f 74 68  ster P2.  In oth
1e510 65 72 20 77 6f 72 64 73 2c 20 63 75 72 73 6f 72  er words, cursor
1e520 20 50 31 20 62 65 63 6f 6d 65 73 20 61 6e 20 61   P1 becomes an a
1e530 6c 69 61 73 20 66 6f 72 20 74 68 65 20 0a 2a 2a  lias for the .**
1e540 20 4d 45 4d 5f 42 6c 6f 62 20 63 6f 6e 74 65 6e   MEM_Blob conten
1e550 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 72  t contained in r
1e560 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
1e570 2a 20 41 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  * A pseudo-table
1e580 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
1e590 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
1e5a0 74 6f 20 68 6f 6c 64 20 61 20 73 69 6e 67 6c 65  to hold a single
1e5b0 0a 2a 2a 20 72 6f 77 20 6f 75 74 70 75 74 20 66  .** row output f
1e5c0 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 73  rom the sorter s
1e5d0 6f 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 63  o that the row c
1e5e0 61 6e 20 62 65 20 64 65 63 6f 6d 70 6f 73 65 64  an be decomposed
1e5f0 20 69 6e 74 6f 0a 2a 2a 20 69 6e 64 69 76 69 64   into.** individ
1e600 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 75 73 69 6e  ual columns usin
1e610 67 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  g the OP_Column 
1e620 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 4f 50 5f  opcode.  The OP_
1e630 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 0a 2a 2a  Column opcode.**
1e640 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 75 72   is the only cur
1e650 73 6f 72 20 6f 70 63 6f 64 65 20 74 68 61 74 20  sor opcode that 
1e660 77 6f 72 6b 73 20 77 69 74 68 20 61 20 70 73 65  works with a pse
1e670 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  udo-table..**.**
1e680 20 50 33 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P3 is the numbe
1e690 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74  r of fields in t
1e6a0 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  he records that 
1e6b0 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 62  will be stored b
1e6c0 79 0a 2a 2a 20 74 68 65 20 70 73 65 75 64 6f 2d  y.** the pseudo-
1e6d0 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  table..*/.case O
1e6e0 50 5f 4f 70 65 6e 50 73 65 75 64 6f 3a 20 7b 0a  P_OpenPseudo: {.
1e6f0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1e700 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  x;..  assert( pO
1e710 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73  p->p1>=0 );.  as
1e720 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30  sert( pOp->p3>=0
1e730 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f   );.  pCx = allo
1e740 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1e750 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p1, pOp->p3, 
1e760 2d 31 2c 20 43 55 52 54 59 50 45 5f 50 53 45 55  -1, CURTYPE_PSEU
1e770 44 4f 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d  DO);.  if( pCx==
1e780 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
1e790 0a 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20  .  pCx->nullRow 
1e7a0 3d 20 31 3b 0a 20 20 70 43 78 2d 3e 75 63 2e 70  = 1;.  pCx->uc.p
1e7b0 73 65 75 64 6f 54 61 62 6c 65 52 65 67 20 3d 20  seudoTableReg = 
1e7c0 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d 3e  pOp->p2;.  pCx->
1e7d0 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 61  isTable = 1;.  a
1e7e0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1e7f0 30 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  0 );.  break;.}.
1e800 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 6f 73  ./* Opcode: Clos
1e810 65 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  e P1 * * * *.**.
1e820 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1e830 72 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  r previously ope
1e840 6e 65 64 20 61 73 20 50 31 2e 20 20 49 66 20 50  ned as P1.  If P
1e850 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 75 72 72  1 is not.** curr
1e860 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 74 68 69 73  ently open, this
1e870 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
1e880 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 63 61 73 65  a no-op..*/.case
1e890 20 4f 50 5f 43 6c 6f 73 65 3a 20 7b 0a 20 20 61   OP_Close: {.  a
1e8a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
1e8b0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
1e8c0 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71 6c  nCursor );.  sql
1e8d0 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
1e8e0 6f 72 28 70 2c 20 70 2d 3e 61 70 43 73 72 5b 70  or(p, p->apCsr[p
1e8f0 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20 70 2d 3e 61  Op->p1]);.  p->a
1e900 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 20 3d 20  pCsr[pOp->p1] = 
1e910 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  0;.  break;.}..#
1e920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1e930 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f  BLE_COLUMN_USED_
1e940 4d 41 53 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  MASK./* Opcode: 
1e950 43 6f 6c 75 6d 6e 73 55 73 65 64 20 50 31 20 2a  ColumnsUsed P1 *
1e960 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 54 68   * P4 *.**.** Th
1e970 69 73 20 6f 70 63 6f 64 65 20 28 77 68 69 63 68  is opcode (which
1e980 20 6f 6e 6c 79 20 65 78 69 73 74 73 20 69 66 20   only exists if 
1e990 53 51 4c 69 74 65 20 77 61 73 20 63 6f 6d 70 69  SQLite was compi
1e9a0 6c 65 64 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49  led with.** SQLI
1e9b0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1e9c0 5f 55 53 45 44 5f 4d 41 53 4b 29 20 69 64 65 6e  _USED_MASK) iden
1e9d0 74 69 66 69 65 73 20 77 68 69 63 68 20 63 6f 6c  tifies which col
1e9e0 75 6d 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  umns of the.** t
1e9f0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 66 6f  able or index fo
1ea00 72 20 63 75 72 73 6f 72 20 50 31 20 61 72 65 20  r cursor P1 are 
1ea10 75 73 65 64 2e 20 20 50 34 20 69 73 20 61 20 36  used.  P4 is a 6
1ea20 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
1ea30 20 28 50 34 5f 49 4e 54 36 34 29 20 69 6e 20 77   (P4_INT64) in w
1ea40 68 69 63 68 20 74 68 65 20 66 69 72 73 74 20 36  hich the first 6
1ea50 33 20 62 69 74 73 20 61 72 65 20 6f 6e 65 20 66  3 bits are one f
1ea60 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
1ea70 2a 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d  * first 63 colum
1ea80 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
1ea90 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 61 72  or index that ar
1eaa0 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a  e actually used.
1eab0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 73 6f 72  ** by the cursor
1eac0 2e 20 20 54 68 65 20 68 69 67 68 2d 6f 72 64 65  .  The high-orde
1ead0 72 20 62 69 74 20 69 73 20 73 65 74 20 69 66 20  r bit is set if 
1eae0 61 6e 79 20 63 6f 6c 75 6d 6e 20 61 66 74 65 72  any column after
1eaf0 0a 2a 2a 20 74 68 65 20 36 34 74 68 20 69 73 20  .** the 64th is 
1eb00 75 73 65 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  used..*/.case OP
1eb10 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 3a 20 7b 0a  _ColumnsUsed: {.
1eb20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1eb30 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
1eb40 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
1eb50 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
1eb60 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
1eb70 45 20 29 3b 0a 20 20 70 43 2d 3e 6d 61 73 6b 55  E );.  pC->maskU
1eb80 73 65 64 20 3d 20 2a 28 75 36 34 2a 29 70 4f 70  sed = *(u64*)pOp
1eb90 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62 72 65  ->p4.pI64;.  bre
1eba0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
1ebb0 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 47 45 20   Opcode: SeekGE 
1ebc0 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
1ebd0 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72   Synopsis: key=r
1ebe0 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66  [P3@P4].**.** If
1ebf0 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65 72   cursor P1 refer
1ec00 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c  s to an SQL tabl
1ec10 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20 75  e (B-Tree that u
1ec20 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ses integer keys
1ec30 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76  ), .** use the v
1ec40 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
1ec50 20 50 33 20 61 73 20 74 68 65 20 6b 65 79 2e 20   P3 as the key. 
1ec60 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1ec70 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
1ec80 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
1ec90 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
1eca0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
1ecb0 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
1ecc0 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
1ecd0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1ece0 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
1ecf0 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
1ed00 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
1ed10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
1ed20 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  llest entry that
1ed30 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20   .** is greater 
1ed40 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1ed50 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
1ed60 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1ed70 72 65 63 6f 72 64 73 20 0a 2a 2a 20 67 72 65 61  records .** grea
1ed80 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1ed90 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64  l to the key and
1eda0 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
1edb0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1edc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1edd0 75 72 73 6f 72 20 50 31 20 77 61 73 20 6f 70 65  ursor P1 was ope
1ede0 6e 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ned using the OP
1edf0 46 4c 41 47 5f 53 45 45 4b 45 51 20 66 6c 61 67  FLAG_SEEKEQ flag
1ee00 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f  , then this.** o
1ee10 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1ee20 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72 65 63 6f  s land on a reco
1ee30 72 64 20 74 68 61 74 20 65 71 75 61 6c 6c 79 20  rd that equally 
1ee40 65 71 75 61 6c 73 20 74 68 65 20 6b 65 79 2c 20  equals the key, 
1ee50 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d 70 20  or.** else jump 
1ee60 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
1ee70 32 2e 20 20 57 68 65 6e 20 74 68 65 20 63 75 72  2.  When the cur
1ee80 73 6f 72 20 69 73 20 4f 50 46 4c 41 47 5f 53 45  sor is OPFLAG_SE
1ee90 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a 20 6f 70  EKEQ, this.** op
1eea0 63 6f 64 65 20 6d 75 73 74 20 62 65 20 66 6f 6c  code must be fol
1eeb0 6c 6f 77 65 64 20 62 79 20 61 6e 20 49 64 78 4c  lowed by an IdxL
1eec0 45 20 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68  E opcode with th
1eed0 65 20 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 73  e same arguments
1eee0 2e 0a 2a 2a 20 54 68 65 20 49 64 78 4c 45 20 6f  ..** The IdxLE o
1eef0 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 6b  pcode will be sk
1ef00 69 70 70 65 64 20 69 66 20 74 68 69 73 20 6f 70  ipped if this op
1ef10 63 6f 64 65 20 73 75 63 63 65 65 64 73 2c 20 62  code succeeds, b
1ef20 75 74 20 74 68 65 0a 2a 2a 20 49 64 78 4c 45 20  ut the.** IdxLE 
1ef30 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75  opcode will be u
1ef40 73 65 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  sed on subsequen
1ef50 74 20 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e  t loop iteration
1ef60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  s..**.** This op
1ef70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
1ef80 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65  cursor configure
1ef90 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72  d to move in for
1efa0 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66  ward order,.** f
1efb0 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1efc0 67 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64  g toward the end
1efd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1efe0 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  s, the cursor is
1eff0 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74  .** configured t
1f000 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20  o use Next, not 
1f010 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  Prev..**.** See 
1f020 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1f030 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53  Found, SeekLt, S
1f040 65 65 6b 47 74 2c 20 53 65 65 6b 4c 65 0a 2a 2f  eekGt, SeekLe.*/
1f050 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b  ./* Opcode: Seek
1f060 47 54 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  GT P1 P2 P3 P4 *
1f070 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
1f080 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
1f090 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1f0a0 66 65 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74  fers to an SQL t
1f0b0 61 62 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61  able (B-Tree tha
1f0c0 74 20 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b  t uses integer k
1f0d0 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68  eys), .** use th
1f0e0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
1f0f0 74 65 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e  ter P3 as a key.
1f100 20 49 66 20 63 75 72 73 6f 72 20 50 31 20 72 65   If cursor P1 re
1f110 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53  fers .** to an S
1f120 51 4c 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50  QL index, then P
1f130 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  3 is the first i
1f140 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34  n an array of P4
1f150 20 72 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74   registers .** t
1f160 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
1f170 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
1f180 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65  x key. .**.** Re
1f190 70 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  position cursor 
1f1a0 50 31 20 73 6f 20 74 68 61 74 20 20 69 74 20 70  P1 so that  it p
1f1b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
1f1c0 6c 6c 65 73 74 20 65 6e 74 72 79 20 74 68 61 74  llest entry that
1f1d0 20 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20   .** is greater 
1f1e0 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c  than the key val
1f1f0 75 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ue. If there are
1f200 20 6e 6f 20 72 65 63 6f 72 64 73 20 67 72 65 61   no records grea
1f210 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 74 68 65  ter than .** the
1f220 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e   key and P2 is n
1f230 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75  ot zero, then ju
1f240 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  mp to P2..**.** 
1f250 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
1f260 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
1f270 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
1f280 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65   in forward orde
1f290 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62  r,.** from the b
1f2a0 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20  eginning toward 
1f2b0 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68  the end.  In oth
1f2c0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
1f2d0 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
1f2e0 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78  gured to use Nex
1f2f0 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a  t, not Prev..**.
1f300 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75  ** See also: Fou
1f310 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65  nd, NotFound, Se
1f320 65 6b 4c 74 2c 20 53 65 65 6b 47 65 2c 20 53 65  ekLt, SeekGe, Se
1f330 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ekLe.*/./* Opcod
1f340 65 3a 20 53 65 65 6b 4c 54 20 50 31 20 50 32 20  e: SeekLT P1 P2 
1f350 50 33 20 50 34 20 2a 20 0a 2a 2a 20 53 79 6e 6f  P3 P4 * .** Syno
1f360 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
1f370 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
1f380 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1f390 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1f3a0 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1f3b0 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1f3c0 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1f3d0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1f3e0 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
1f3f0 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1f400 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1f410 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1f420 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1f430 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1f440 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1f450 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1f460 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1f470 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1f480 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1f490 61 74 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  at  it points to
1f4a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
1f4b0 72 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c  ry that .** is l
1f4c0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79  ess than the key
1f4d0 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65   value. If there
1f4e0 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20   are no records 
1f4f0 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 74 68  less than .** th
1f500 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69 73 20  e key and P2 is 
1f510 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a  not zero, then j
1f520 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ump to P2..**.**
1f530 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
1f540 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
1f550 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
1f560 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
1f570 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
1f580 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62  end toward the b
1f590 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74  eginning.  In ot
1f5a0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1f5b0 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
1f5c0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72  igured to use Pr
1f5d0 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a  ev, not Next..**
1f5e0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
1f5f0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53  und, NotFound, S
1f600 65 65 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53  eekGt, SeekGe, S
1f610 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  eekLe.*/./* Opco
1f620 64 65 3a 20 53 65 65 6b 4c 45 20 50 31 20 50 32  de: SeekLE P1 P2
1f630 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
1f640 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
1f650 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
1f660 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1f670 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1f680 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1f690 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1f6a0 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1f6b0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1f6c0 73 20 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73  s a key. If curs
1f6d0 6f 72 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a  or P1 refers .**
1f6e0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
1f6f0 2c 20 74 68 65 6e 20 50 33 20 69 73 20 74 68 65  , then P3 is the
1f700 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
1f710 61 79 20 6f 66 20 50 34 20 72 65 67 69 73 74 65  ay of P4 registe
1f720 72 73 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  rs .** that are 
1f730 75 73 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63  used as an unpac
1f740 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a  ked index key. .
1f750 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e  **.** Reposition
1f760 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68   cursor P1 so th
1f770 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1f780 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72  the largest entr
1f790 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 6c 65  y that .** is le
1f7a0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1f7b0 20 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75   to the key valu
1f7c0 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  e. If there are 
1f7d0 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 6c  no records .** l
1f7e0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1f7f0 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 61 6e 64  l to the key and
1f800 20 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   P2 is not zero,
1f810 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
1f820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
1f830 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
1f840 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
1f850 20 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65   to move in reve
1f860 72 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  rse order,.** fr
1f870 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72  om the end towar
1f880 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e  d the beginning.
1f890 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f8a0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
1f8b0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
1f8c0 20 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e   use Prev, not N
1f8d0 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ext..**.** If th
1f8e0 65 20 63 75 72 73 6f 72 20 50 31 20 77 61 73 20  e cursor P1 was 
1f8f0 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
1f900 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 20 66   OPFLAG_SEEKEQ f
1f910 6c 61 67 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  lag, then this.*
1f920 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c  * opcode will al
1f930 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20 61 20 72  ways land on a r
1f940 65 63 6f 72 64 20 74 68 61 74 20 65 71 75 61 6c  ecord that equal
1f950 6c 79 20 65 71 75 61 6c 73 20 74 68 65 20 6b 65  ly equals the ke
1f960 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65 20 6a 75  y, or.** else ju
1f970 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
1f980 6f 20 50 32 2e 20 20 57 68 65 6e 20 74 68 65 20  o P2.  When the 
1f990 63 75 72 73 6f 72 20 69 73 20 4f 50 46 4c 41 47  cursor is OPFLAG
1f9a0 5f 53 45 45 4b 45 51 2c 20 74 68 69 73 0a 2a 2a  _SEEKEQ, this.**
1f9b0 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 62 65 20   opcode must be 
1f9c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 49  followed by an I
1f9d0 64 78 47 45 20 6f 70 63 6f 64 65 20 77 69 74 68  dxGE opcode with
1f9e0 20 74 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65   the same argume
1f9f0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49 64 78 47  nts..** The IdxG
1fa00 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  E opcode will be
1fa10 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 69 73   skipped if this
1fa20 20 6f 70 63 6f 64 65 20 73 75 63 63 65 65 64 73   opcode succeeds
1fa30 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20 49 64 78  , but the.** Idx
1fa40 47 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62  GE opcode will b
1fa50 65 20 75 73 65 64 20 6f 6e 20 73 75 62 73 65 71  e used on subseq
1fa60 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65 72 61 74  uent loop iterat
1fa70 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ions..**.** See 
1fa80 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74  also: Found, Not
1fa90 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53  Found, SeekGt, S
1faa0 65 65 6b 47 65 2c 20 53 65 65 6b 4c 74 0a 2a 2f  eekGe, SeekLt.*/
1fab0 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 4c 54 3a  .case OP_SeekLT:
1fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1fad0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1fae0 5f 53 65 65 6b 4c 45 3a 20 20 20 20 20 20 20 20  _SeekLE:        
1faf0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1fb00 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b 47 45 3a  .case OP_SeekGE:
1fb10 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
1fb20 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
1fb30 5f 53 65 65 6b 47 54 3a 20 7b 20 20 20 20 20 20  _SeekGT: {      
1fb40 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
1fb50 0a 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20  .  int res;     
1fb60 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
1fb70 73 6f 6e 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  son result */.  
1fb80 69 6e 74 20 6f 63 3b 20 20 20 20 20 20 20 20 20  int oc;         
1fb90 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a     /* Opcode */.
1fba0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1fbb0 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73  ;    /* The curs
1fbc0 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20  or to seek */.  
1fbd0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72  UnpackedRecord r
1fbe0 3b 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 74 6f  ;  /* The key to
1fbf0 20 73 65 65 6b 20 66 6f 72 20 2a 2f 0a 20 20 69   seek for */.  i
1fc00 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
1fc10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1fc20 6f 6c 75 6d 6e 73 20 6f 72 20 66 69 65 6c 64 73  olumns or fields
1fc30 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
1fc40 20 69 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   i64 iKey;      
1fc50 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
1fc60 20 77 65 20 61 72 65 20 74 6f 20 73 65 65 6b 20   we are to seek 
1fc70 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 71 4f 6e  to */.  int eqOn
1fc80 6c 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ly;        /* On
1fc90 6c 79 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e  ly interested in
1fca0 20 3d 3d 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a   == results */..
1fcb0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1fcc0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
1fcd0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
1fce0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 21  assert( pOp->p2!
1fcf0 3d 30 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  =0 );.  pC = p->
1fd00 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1fd10 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
1fd20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
1fd30 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
1fd40 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
1fd50 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 20  sert( OP_SeekLE 
1fd60 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 31 20 29  == OP_SeekLT+1 )
1fd70 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
1fd80 65 65 6b 47 45 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekGE == OP_Seek
1fd90 4c 54 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  LT+2 );.  assert
1fda0 28 20 4f 50 5f 53 65 65 6b 47 54 20 3d 3d 20 4f  ( OP_SeekGT == O
1fdb0 50 5f 53 65 65 6b 4c 54 2b 33 20 29 3b 0a 20 20  P_SeekLT+3 );.  
1fdc0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 4f 72  assert( pC->isOr
1fdd0 64 65 72 65 64 20 29 3b 0a 20 20 61 73 73 65 72  dered );.  asser
1fde0 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  t( pC->uc.pCurso
1fdf0 72 21 3d 30 20 29 3b 0a 20 20 6f 63 20 3d 20 70  r!=0 );.  oc = p
1fe00 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 65 71  Op->opcode;.  eq
1fe10 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  Only = 0;.  pC->
1fe20 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 23 69 66  nullRow = 0;.#if
1fe30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1fe40 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20  .  pC->seekOp = 
1fe50 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e  pOp->opcode;.#en
1fe60 64 69 66 0a 0a 20 20 69 66 28 20 70 43 2d 3e 69  dif..  if( pC->i
1fe70 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  sTable ){.    /*
1fe80 20 54 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f   The BTREE_SEEK_
1fe90 45 51 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20  EQ flag is only 
1fea0 73 65 74 20 6f 6e 20 69 6e 64 65 78 20 63 75 72  set on index cur
1feb0 73 6f 72 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  sors */.    asse
1fec0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1fed0 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70 43  CursorHasHint(pC
1fee0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42 54  ->uc.pCursor, BT
1fef0 52 45 45 5f 53 45 45 4b 5f 45 51 29 3d 3d 30 0a  REE_SEEK_EQ)==0.
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
1ff10 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
1ff20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75 74      /* The input
1ff30 20 76 61 6c 75 65 20 69 6e 20 50 33 20 6d 69 67   value in P3 mig
1ff40 68 74 20 62 65 20 6f 66 20 61 6e 79 20 74 79 70  ht be of any typ
1ff50 65 3a 20 69 6e 74 65 67 65 72 2c 20 72 65 61 6c  e: integer, real
1ff60 2c 20 73 74 72 69 6e 67 2c 0a 20 20 20 20 2a 2a  , string,.    **
1ff70 20 62 6c 6f 62 2c 20 6f 72 20 4e 55 4c 4c 2e 20   blob, or NULL. 
1ff80 20 42 75 74 20 69 74 20 6e 65 65 64 73 20 74 6f   But it needs to
1ff90 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 62   be an integer b
1ffa0 65 66 6f 72 65 20 77 65 20 63 61 6e 20 64 6f 0a  efore we can do.
1ffb0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 65 6b 2c      ** the seek,
1ffc0 20 73 6f 20 63 6f 6e 76 65 72 74 20 69 74 2e 20   so convert it. 
1ffd0 2a 2f 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61  */.    pIn3 = &a
1ffe0 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
1fff0 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61    if( (pIn3->fla
20000 67 73 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45  gs & (MEM_Int|ME
20010 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29  M_Real|MEM_Str))
20020 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  ==MEM_Str ){.   
20030 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41     applyNumericA
20040 66 66 69 6e 69 74 79 28 70 49 6e 33 2c 20 30 29  ffinity(pIn3, 0)
20050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4b 65 79  ;.    }.    iKey
20060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e   = sqlite3VdbeIn
20070 74 56 61 6c 75 65 28 70 49 6e 33 29 3b 0a 0a 20  tValue(pIn3);.. 
20080 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20     /* If the P3 
20090 76 61 6c 75 65 20 63 6f 75 6c 64 20 6e 6f 74 20  value could not 
200a0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
200b0 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 77 69 74  o an integer wit
200c0 68 6f 75 74 0a 20 20 20 20 2a 2a 20 6c 6f 73 73  hout.    ** loss
200d0 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c   of information,
200e0 20 74 68 65 6e 20 73 70 65 63 69 61 6c 20 70 72   then special pr
200f0 6f 63 65 73 73 69 6e 67 20 69 73 20 72 65 71 75  ocessing is requ
20100 69 72 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69  ired... */.    i
20110 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20  f( (pIn3->flags 
20120 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b  & MEM_Int)==0 ){
20130 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 6e 33  .      if( (pIn3
20140 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
20150 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)==0 ){.      
20160 20 20 2f 2a 20 49 66 20 74 68 65 20 50 33 20 76    /* If the P3 v
20170 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  alue cannot be c
20180 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e  onverted into an
20190 79 20 6b 69 6e 64 20 6f 66 20 61 20 6e 75 6d 62  y kind of a numb
201a0 65 72 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  er,.        ** t
201b0 68 65 6e 20 74 68 65 20 73 65 65 6b 20 69 73 20  hen the seek is 
201c0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 73 6f  not possible, so
201d0 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a 20   jump to P2 */. 
201e0 20 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63         VdbeBranc
201f0 68 54 61 6b 65 6e 28 31 2c 32 29 3b 20 67 6f 74  hTaken(1,2); got
20200 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
20210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20220 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
20230 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  f the approximat
20240 69 6f 6e 20 69 4b 65 79 20 69 73 20 6c 61 72 67  ion iKey is larg
20250 65 72 20 74 68 61 6e 20 74 68 65 20 61 63 74 75  er than the actu
20260 61 6c 20 72 65 61 6c 20 73 65 61 72 63 68 0a 20  al real search. 
20270 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75       ** term, su
20280 62 73 74 69 74 75 74 65 20 3e 3d 20 66 6f 72 20  bstitute >= for 
20290 3e 20 61 6e 64 20 3c 20 66 6f 72 20 3c 3d 2e 20  > and < for <=. 
202a0 65 2e 67 2e 20 69 66 20 74 68 65 20 73 65 61 72  e.g. if the sear
202b0 63 68 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a  ch term.      **
202c0 20 69 73 20 34 2e 39 20 61 6e 64 20 74 68 65 20   is 4.9 and the 
202d0 69 6e 74 65 67 65 72 20 61 70 70 72 6f 78 69 6d  integer approxim
202e0 61 74 69 6f 6e 20 35 3a 0a 20 20 20 20 20 20 2a  ation 5:.      *
202f0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
20300 20 20 28 78 20 3e 20 20 34 2e 39 29 20 20 20 20    (x >  4.9)    
20310 2d 3e 20 20 20 20 20 28 78 20 3e 3d 20 35 29 0a  ->     (x >= 5).
20320 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
20330 28 78 20 3c 3d 20 34 2e 39 29 20 20 20 20 2d 3e  (x <= 4.9)    ->
20340 20 20 20 20 20 28 78 20 3c 20 20 35 29 0a 20 20       (x <  5).  
20350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20360 20 70 49 6e 33 2d 3e 75 2e 72 3c 28 64 6f 75 62   pIn3->u.r<(doub
20370 6c 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20  le)iKey ){.     
20380 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65     assert( OP_Se
20390 65 6b 47 45 3d 3d 28 4f 50 5f 53 65 65 6b 47 54  ekGE==(OP_SeekGT
203a0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  -1) );.        a
203b0 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 54  ssert( OP_SeekLT
203c0 3d 3d 28 4f 50 5f 53 65 65 6b 4c 45 2d 31 29 20  ==(OP_SeekLE-1) 
203d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
203e0 74 28 20 28 4f 50 5f 53 65 65 6b 4c 45 20 26 20  t( (OP_SeekLE & 
203f0 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65  0x0001)==(OP_See
20400 6b 47 54 20 26 20 30 78 30 30 30 31 29 20 29 3b  kGT & 0x0001) );
20410 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63  .        if( (oc
20420 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f   & 0x0001)==(OP_
20430 53 65 65 6b 47 54 20 26 20 30 78 30 30 30 31 29  SeekGT & 0x0001)
20440 20 29 20 6f 63 2d 2d 3b 0a 20 20 20 20 20 20 7d   ) oc--;.      }
20450 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
20460 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  e approximation 
20470 69 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20  iKey is smaller 
20480 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20  than the actual 
20490 72 65 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20  real search.    
204a0 20 20 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74    ** term, subst
204b0 69 74 75 74 65 20 3c 3d 20 66 6f 72 20 3c 20 61  itute <= for < a
204c0 6e 64 20 3e 20 66 6f 72 20 3e 3d 2e 20 20 2a 2f  nd > for >=.  */
204d0 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
204e0 70 49 6e 33 2d 3e 75 2e 72 3e 28 64 6f 75 62 6c  pIn3->u.r>(doubl
204f0 65 29 69 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  e)iKey ){.      
20500 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65    assert( OP_See
20510 6b 4c 45 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54 2b  kLE==(OP_SeekLT+
20520 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  1) );.        as
20530 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 54 3d  sert( OP_SeekGT=
20540 3d 28 4f 50 5f 53 65 65 6b 47 45 2b 31 29 20 29  =(OP_SeekGE+1) )
20550 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20560 28 20 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30  ( (OP_SeekLT & 0
20570 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b  x0001)==(OP_Seek
20580 47 45 20 26 20 30 78 30 30 30 31 29 20 29 3b 0a  GE & 0x0001) );.
20590 20 20 20 20 20 20 20 20 69 66 28 20 28 6f 63 20          if( (oc 
205a0 26 20 30 78 30 30 30 31 29 3d 3d 28 4f 50 5f 53  & 0x0001)==(OP_S
205b0 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31 29 20  eekLT & 0x0001) 
205c0 29 20 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) oc++;.      }.
205d0 20 20 20 20 7d 20 0a 20 20 20 20 72 63 20 3d 20      } .    rc = 
205e0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
205f0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75  toUnpacked(pC->u
20600 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  c.pCursor, 0, (u
20610 36 34 29 69 4b 65 79 2c 20 30 2c 20 26 72 65 73  64)iKey, 0, &res
20620 29 3b 0a 20 20 20 20 70 43 2d 3e 6d 6f 76 65 74  );.    pC->movet
20630 6f 54 61 72 67 65 74 20 3d 20 69 4b 65 79 3b 20  oTarget = iKey; 
20640 20 2f 2a 20 55 73 65 64 20 62 79 20 4f 50 5f 44   /* Used by OP_D
20650 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 69 66 28  elete */.    if(
20660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20670 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
20680 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
20690 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
206a0 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 75 72      /* For a cur
206b0 73 6f 72 20 77 69 74 68 20 74 68 65 20 42 54 52  sor with the BTR
206c0 45 45 5f 53 45 45 4b 5f 45 51 20 68 69 6e 74 2c  EE_SEEK_EQ hint,
206d0 20 6f 6e 6c 79 20 74 68 65 20 4f 50 5f 53 65 65   only the OP_See
206e0 6b 47 45 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4f  kGE and.    ** O
206f0 50 5f 53 65 65 6b 4c 45 20 6f 70 63 6f 64 65 73  P_SeekLE opcodes
20700 20 61 72 65 20 61 6c 6c 6f 77 65 64 2c 20 61 6e   are allowed, an
20710 64 20 74 68 65 73 65 20 6d 75 73 74 20 62 65 20  d these must be 
20720 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
20730 6f 77 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 61  owed.    ** by a
20740 6e 20 4f 50 5f 49 64 78 47 54 20 6f 72 20 4f 50  n OP_IdxGT or OP
20750 5f 49 64 78 4c 54 20 6f 70 63 6f 64 65 2c 20 72  _IdxLT opcode, r
20760 65 73 70 65 63 74 69 76 65 6c 79 2c 20 77 69 74  espectively, wit
20770 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 2e 0a  h the same key..
20780 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
20790 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
207a0 72 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e  rHasHint(pC->uc.
207b0 70 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53  pCursor, BTREE_S
207c0 45 45 4b 5f 45 51 29 20 29 7b 0a 20 20 20 20 20  EEK_EQ) ){.     
207d0 20 65 71 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20   eqOnly = 1;.   
207e0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
207f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 47  opcode==OP_SeekG
20800 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  E || pOp->opcode
20810 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a 20  ==OP_SeekLE );. 
20820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20830 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  [1].opcode==OP_I
20840 64 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f  dxLT || pOp[1].o
20850 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20  pcode==OP_IdxGT 
20860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20870 20 70 4f 70 5b 31 5d 2e 70 31 3d 3d 70 4f 70 5b   pOp[1].p1==pOp[
20880 30 5d 2e 70 31 20 29 3b 0a 20 20 20 20 20 20 61  0].p1 );.      a
20890 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 32  ssert( pOp[1].p2
208a0 3d 3d 70 4f 70 5b 30 5d 2e 70 32 20 29 3b 0a 20  ==pOp[0].p2 );. 
208b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
208c0 5b 31 5d 2e 70 33 3d 3d 70 4f 70 5b 30 5d 2e 70  [1].p3==pOp[0].p
208d0 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
208e0 74 28 20 70 4f 70 5b 31 5d 2e 70 34 2e 69 3d 3d  t( pOp[1].p4.i==
208f0 70 4f 70 5b 30 5d 2e 70 34 2e 69 20 29 3b 0a 20  pOp[0].p4.i );. 
20900 20 20 20 7d 0a 0a 20 20 20 20 6e 46 69 65 6c 64     }..    nField
20910 20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20   = pOp->p4.i;.  
20920 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
20930 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
20940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
20950 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 20 20 72  Field>0 );.    r
20960 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e  .pKeyInfo = pC->
20970 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 72 2e  pKeyInfo;.    r.
20980 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 46  nField = (u16)nF
20990 69 65 6c 64 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ield;..    /* Th
209a0 65 20 6e 65 78 74 20 6c 69 6e 65 20 6f 66 20 63  e next line of c
209b0 6f 64 65 20 63 6f 6d 70 75 74 65 73 20 61 73 20  ode computes as 
209c0 66 6f 6c 6c 6f 77 73 2c 20 6f 6e 6c 79 20 66 61  follows, only fa
209d0 73 74 65 72 3a 0a 20 20 20 20 2a 2a 20 20 20 69  ster:.    **   i
209e0 66 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54  f( oc==OP_SeekGT
209f0 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 4c   || oc==OP_SeekL
20a00 45 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  E ){.    **     
20a10 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2d  r.default_rc = -
20a20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 7d 65 6c 73  1;.    **   }els
20a30 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 72 2e  e{.    **     r.
20a40 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 2b 31 3b  default_rc = +1;
20a50 0a 20 20 20 20 2a 2a 20 20 20 7d 0a 20 20 20 20  .    **   }.    
20a60 2a 2f 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  */.    r.default
20a70 5f 72 63 20 3d 20 28 28 31 20 26 20 28 6f 63 20  _rc = ((1 & (oc 
20a80 2d 20 4f 50 5f 53 65 65 6b 4c 54 29 29 20 3f 20  - OP_SeekLT)) ? 
20a90 2d 31 20 3a 20 2b 31 29 3b 0a 20 20 20 20 61 73  -1 : +1);.    as
20aa0 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65  sert( oc!=OP_See
20ab0 6b 47 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74  kGT || r.default
20ac0 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  _rc==-1 );.    a
20ad0 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65  ssert( oc!=OP_Se
20ae0 65 6b 4c 45 20 7c 7c 20 72 2e 64 65 66 61 75 6c  ekLE || r.defaul
20af0 74 5f 72 63 3d 3d 2d 31 20 29 3b 0a 20 20 20 20  t_rc==-1 );.    
20b00 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f 53  assert( oc!=OP_S
20b10 65 65 6b 47 45 20 7c 7c 20 72 2e 64 65 66 61 75  eekGE || r.defau
20b20 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 20 20 20  lt_rc==+1 );.   
20b30 20 61 73 73 65 72 74 28 20 6f 63 21 3d 4f 50 5f   assert( oc!=OP_
20b40 53 65 65 6b 4c 54 20 7c 7c 20 72 2e 64 65 66 61  SeekLT || r.defa
20b50 75 6c 74 5f 72 63 3d 3d 2b 31 20 29 3b 0a 0a 20  ult_rc==+1 );.. 
20b60 20 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d 65     r.aMem = &aMe
20b70 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64  m[pOp->p3];.#ifd
20b80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
20b90 20 20 20 20 7b 20 69 6e 74 20 69 3b 20 66 6f 72      { int i; for
20ba0 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65 6c 64  (i=0; i<r.nField
20bb0 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6d  ; i++) assert( m
20bc0 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61 4d 65  emIsValid(&r.aMe
20bd0 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e 64 69  m[i]) ); }.#endi
20be0 66 0a 20 20 20 20 72 2e 65 71 53 65 65 6e 20 3d  f.    r.eqSeen =
20bf0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
20c00 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
20c10 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70  npacked(pC->uc.p
20c20 43 75 72 73 6f 72 2c 20 26 72 2c 20 30 2c 20 30  Cursor, &r, 0, 0
20c30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
20c40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20c50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f  {.      goto abo
20c60 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
20c70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
20c80 71 4f 6e 6c 79 20 26 26 20 72 2e 65 71 53 65 65  qOnly && r.eqSee
20c90 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  n==0 ){.      as
20ca0 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
20cb0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 65 6b 5f        goto seek_
20cc0 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d  not_found;.    }
20cd0 0a 20 20 7d 0a 20 20 70 43 2d 3e 64 65 66 65 72  .  }.  pC->defer
20ce0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
20cf0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
20d00 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
20d10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
20d20 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
20d30 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
20d40 64 69 66 0a 20 20 69 66 28 20 6f 63 3e 3d 4f 50  dif.  if( oc>=OP
20d50 5f 53 65 65 6b 47 45 20 29 7b 20 20 61 73 73 65  _SeekGE ){  asse
20d60 72 74 28 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47  rt( oc==OP_SeekG
20d70 45 20 7c 7c 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b  E || oc==OP_Seek
20d80 47 54 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  GT );.    if( re
20d90 73 3c 30 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26  s<0 || (res==0 &
20da0 26 20 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  & oc==OP_SeekGT)
20db0 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
20dc0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
20dd0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
20de0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
20df0 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
20e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20e10 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
20e20 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c  o_error;.    }el
20e30 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
20e40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
20e50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63  {.    assert( oc
20e60 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 6f  ==OP_SeekLT || o
20e70 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 3b 0a  c==OP_SeekLE );.
20e80 20 20 20 20 69 66 28 20 72 65 73 3e 30 20 7c 7c      if( res>0 ||
20e90 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d 3d   (res==0 && oc==
20ea0 4f 50 5f 53 65 65 6b 4c 54 29 20 29 7b 0a 20 20  OP_SeekLT) ){.  
20eb0 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
20ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20ed0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 2d  treePrevious(pC-
20ee0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 65  >uc.pCursor, &re
20ef0 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
20f00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20f10 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
20f20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  error;.    }else
20f30 7b 0a 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d  {.      /* res m
20f40 69 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65  ight be negative
20f50 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
20f60 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68  le is empty.  Ch
20f70 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
20f80 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 74  see if this is t
20f90 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a  he case..      *
20fa0 2f 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 71  /.      res = sq
20fb0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43  lite3BtreeEof(pC
20fc0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
20fd0 20 20 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f     }.  }.seek_no
20fe0 74 5f 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72  t_found:.  asser
20ff0 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
21000 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
21010 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
21020 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  f( res ){.    go
21030 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
21040 20 7d 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c   }else if( eqOnl
21050 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
21060 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
21070 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b  OP_IdxLT || pOp[
21080 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
21090 78 47 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b  xGT );.    pOp++
210a0 3b 20 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50  ; /* Skip the OP
210b0 5f 49 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78  _IdxLt or OP_Idx
210c0 47 54 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  GT that follows 
210d0 2a 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  */.  }.  break;.
210e0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f  }../* Opcode: Fo
210f0 75 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20  und P1 P2 P3 P4 
21100 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
21110 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
21120 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
21130 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
21140 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
21150 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
21160 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
21170 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
21180 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
21190 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
211a0 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
211b0 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
211c0 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69  *.** Cursor P1 i
211d0 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
211e0 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
211f0 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21200 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21210 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
21220 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
21230 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
21240 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50  e to P2 and.** P
21250 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
21260 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69  ng at the matchi
21270 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
21280 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c  This operation l
21290 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
212a0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
212b0 65 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61  e it can be.** a
212c0 64 76 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66  dvanced in the f
212d0 6f 72 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e  orward direction
212e0 2e 20 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74  .  The Next inst
212f0 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72  ruction will wor
21300 6b 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68  k,.** but not th
21310 65 20 50 72 65 76 20 69 6e 73 74 72 75 63 74 69  e Prev instructi
21320 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21330 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  so: NotFound, No
21340 43 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69  Conflict, NotExi
21350 73 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f  sts. SeekGe.*/./
21360 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75  * Opcode: NotFou
21370 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  nd P1 P2 P3 P4 *
21380 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
21390 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
213a0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
213b0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
213c0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
213d0 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
213e0 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
213f0 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21400 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
21410 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
21420 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
21430 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
21440 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
21450 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
21460 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
21470 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21480 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21490 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78  s not the prefix
214a0 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e   of any entry in
214b0 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20   P1 then a jump 
214c0 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20  is made to P2.  
214d0 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63  If P1 .** does c
214e0 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20  ontain an entry 
214f0 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74  whose prefix mat
21500 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72  ches the P3/P4 r
21510 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72  ecord then contr
21520 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f  ol.** falls thro
21530 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
21540 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
21550 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
21560 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61  ing at the.** ma
21570 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a  tching entry..**
21580 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
21590 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  on leaves the cu
215a0 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
215b0 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
215c0 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69  be.** advanced i
215d0 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
215e0 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
215f0 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
21600 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65  d Prev.** opcode
21610 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66  s do not work af
21620 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  ter this operati
21630 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21640 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78  so: Found, NotEx
21650 69 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74  ists, NoConflict
21660 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
21670 6f 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20  oConflict P1 P2 
21680 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
21690 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
216a0 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30  ].**.** If P4==0
216b0 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
216c0 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63  3 holds a blob c
216d0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61  onstructed by Ma
216e0 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a  keRecord.  If.**
216f0 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73   P4>0 then regis
21700 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69  ter P3 is the fi
21710 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74  rst of P4 regist
21720 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e  ers that form an
21730 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63   unpacked.** rec
21740 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73  ord..** .** Curs
21750 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69  or P1 is on an i
21760 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66 20  ndex btree.  If 
21770 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74  the record ident
21780 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64 20  ified by P3 and 
21790 50 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  P4.** contains a
217a0 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a  ny NULL value, j
217b0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
217c0 74 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74  to P2.  If all t
217d0 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72  erms of the.** r
217e0 65 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55  ecord are not-NU
217f0 4c 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20  LL then a check 
21800 69 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72  is done to deter
21810 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20  mine if any row 
21820 69 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64  in the.** P1 ind
21830 65 78 20 62 74 72 65 65 20 68 61 73 20 61 20 6d  ex btree has a m
21840 61 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66  atching key pref
21850 69 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ix.  If there ar
21860 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75  e no matches, ju
21870 6d 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  mp.** immediatel
21880 79 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  y to P2.  If the
21890 72 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66  re is a match, f
218a0 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20  all through and 
218b0 6c 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20  leave the P1.** 
218c0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
218d0 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
218e0 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
218f0 6f 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61  opcode is simila
21900 72 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  r to OP_NotFound
21910 20 77 69 74 68 20 74 68 65 20 65 78 63 65 70 74   with the except
21920 69 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  ions that the.**
21930 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79   branch is alway
21940 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70  s taken if any p
21950 61 72 74 20 6f 66 20 74 68 65 20 73 65 61 72 63  art of the searc
21960 68 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e  h key input is N
21970 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
21980 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73  operation leaves
21990 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
219a0 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
219b0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76  cannot be.** adv
219c0 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72 20  anced in either 
219d0 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
219e0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
219f0 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a  Next and Prev.**
21a00 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20   opcodes do not 
21a10 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73 20  work after this 
21a20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
21a30 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
21a40 75 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45  und, Found, NotE
21a50 78 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50  xists.*/.case OP
21a60 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20  _NoConflict:    
21a70 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
21a80 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e  .case OP_NotFoun
21a90 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  d:       /* jump
21aa0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
21ab0 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20  _Found: {       
21ac0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
21ad0 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78  .  int alreadyEx
21ae0 69 73 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65  ists;.  int take
21af0 4a 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  Jump;.  int ii;.
21b00 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
21b10 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55  ;.  int res;.  U
21b20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
21b30 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64  Free;.  Unpacked
21b40 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
21b50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21b60 64 20 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d r;..#ifdef SQL
21b70 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
21b80 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e  Op->opcode!=OP_N
21b90 6f 43 6f 6e 66 6c 69 63 74 20 29 20 73 71 6c 69  oConflict ) sqli
21ba0 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b  te3_found_count+
21bb0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  +;.#endif..  ass
21bc0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
21bd0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
21be0 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
21bf0 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
21c00 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43  P4_INT32 );.  pC
21c10 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
21c20 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
21c30 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  pC!=0 );.#ifdef 
21c40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
21c50 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d  C->seekOp = pOp-
21c60 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  >opcode;.#endif.
21c70 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
21c80 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72  Op->p3];.  asser
21c90 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
21ca0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
21cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
21cc0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
21cd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
21ce0 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 69  sTable==0 );.  i
21cf0 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29  f( pOp->p4.i>0 )
21d00 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  {.    r.pKeyInfo
21d10 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
21d20 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
21d30 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a  (u16)pOp->p4.i;.
21d40 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e      r.aMem = pIn
21d50 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  3;.#ifdef SQLITE
21d60 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69  _DEBUG.    for(i
21d70 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65 6c 64  i=0; ii<r.nField
21d80 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
21d90 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
21da0 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 20 29  d(&r.aMem[ii]) )
21db0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21dc0 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67  (r.aMem[ii].flag
21dd0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
21de0 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e   || r.aMem[ii].n
21df0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
21e00 20 69 69 20 29 20 52 45 47 49 53 54 45 52 5f 54   ii ) REGISTER_T
21e10 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69 69 2c  RACE(pOp->p3+ii,
21e20 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20   &r.aMem[ii]);. 
21e30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21e40 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20  pIdxKey = &r;.  
21e50 20 20 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d    pFree = 0;.  }
21e60 65 6c 73 65 7b 0a 20 20 20 20 70 46 72 65 65 20  else{.    pFree 
21e70 3d 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69  = pIdxKey = sqli
21e80 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
21e90 63 6b 65 64 52 65 63 6f 72 64 28 70 43 2d 3e 70  ckedRecord(pC->p
21ea0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
21eb0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 67  ( pIdxKey==0 ) g
21ec0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
21ed0 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c  assert( pIn3->fl
21ee0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
21ef0 3b 0a 20 20 20 20 28 76 6f 69 64 29 45 78 70 61  ;.    (void)Expa
21f00 6e 64 42 6c 6f 62 28 70 49 6e 33 29 3b 0a 20 20  ndBlob(pIn3);.  
21f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
21f20 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b  ordUnpack(pC->pK
21f30 65 79 49 6e 66 6f 2c 20 70 49 6e 33 2d 3e 6e 2c  eyInfo, pIn3->n,
21f40 20 70 49 6e 33 2d 3e 7a 2c 20 70 49 64 78 4b 65   pIn3->z, pIdxKe
21f50 79 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 4b 65  y);.  }.  pIdxKe
21f60 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  y->default_rc = 
21f70 30 3b 0a 20 20 74 61 6b 65 4a 75 6d 70 20 3d 20  0;.  takeJump = 
21f80 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  0;.  if( pOp->op
21f90 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c  code==OP_NoConfl
21fa0 69 63 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 6f  ict ){.    /* Fo
21fb0 72 20 74 68 65 20 4f 50 5f 4e 6f 43 6f 6e 66 6c  r the OP_NoConfl
21fc0 69 63 74 20 6f 70 63 6f 64 65 2c 20 74 61 6b 65  ict opcode, take
21fd0 20 74 68 65 20 6a 75 6d 70 20 69 66 20 61 6e 79   the jump if any
21fe0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69   of the.    ** i
21ff0 6e 70 75 74 20 66 69 65 6c 64 73 20 61 72 65 20  nput fields are 
22000 4e 55 4c 4c 2c 20 73 69 6e 63 65 20 61 6e 79 20  NULL, since any 
22010 6b 65 79 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  key with a NULL 
22020 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  will not.    ** 
22030 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20  conflict */.    
22040 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64  for(ii=0; ii<pId
22050 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3b 20 69 69  xKey->nField; ii
22060 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
22070 49 64 78 4b 65 79 2d 3e 61 4d 65 6d 5b 69 69 5d  IdxKey->aMem[ii]
22080 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  .flags & MEM_Nul
22090 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 61 6b  l ){.        tak
220a0 65 4a 75 6d 70 20 3d 20 31 3b 0a 20 20 20 20 20  eJump = 1;.     
220b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
220c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  }.    }.  }.  rc
220d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
220e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
220f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 49  ->uc.pCursor, pI
22100 64 78 4b 65 79 2c 20 30 2c 20 30 2c 20 26 72 65  dxKey, 0, 0, &re
22110 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
22120 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
22130 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 69 66  db, pFree);.  if
22140 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22150 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  ){.    goto abor
22160 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
22170 20 20 7d 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65    }.  pC->seekRe
22180 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20 20 61 6c  sult = res;.  al
22190 72 65 61 64 79 45 78 69 73 74 73 20 3d 20 28 72  readyExists = (r
221a0 65 73 3d 3d 30 29 3b 0a 20 20 70 43 2d 3e 6e 75  es==0);.  pC->nu
221b0 6c 6c 52 6f 77 20 3d 20 31 2d 61 6c 72 65 61 64  llRow = 1-alread
221c0 79 45 78 69 73 74 73 3b 0a 20 20 70 43 2d 3e 64  yExists;.  pC->d
221d0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
221e0 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
221f0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
22200 4c 45 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  LE;.  if( pOp->o
22210 70 63 6f 64 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20  pcode==OP_Found 
22220 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  ){.    VdbeBranc
22230 68 54 61 6b 65 6e 28 61 6c 72 65 61 64 79 45 78  hTaken(alreadyEx
22240 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  ists!=0,2);.    
22250 69 66 28 20 61 6c 72 65 61 64 79 45 78 69 73 74  if( alreadyExist
22260 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  s ) goto jump_to
22270 5f 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _p2;.  }else{.  
22280 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
22290 6e 28 74 61 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65  n(takeJump||alre
222a0 61 64 79 45 78 69 73 74 73 3d 3d 30 2c 32 29 3b  adyExists==0,2);
222b0 0a 20 20 20 20 69 66 28 20 74 61 6b 65 4a 75 6d  .    if( takeJum
222c0 70 20 7c 7c 20 21 61 6c 72 65 61 64 79 45 78 69  p || !alreadyExi
222d0 73 74 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  sts ) goto jump_
222e0 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
222f0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
22300 3a 20 53 65 65 6b 52 6f 77 69 64 20 50 31 20 50  : SeekRowid P1 P
22310 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
22320 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50  psis: intkey=r[P
22330 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  3].**.** P1 is t
22340 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 75  he index of a cu
22350 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  rsor open on an 
22360 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65 20  SQL table btree 
22370 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a  (with integer.**
22380 20 6b 65 79 73 29 2e 20 20 49 66 20 72 65 67 69   keys).  If regi
22390 73 74 65 72 20 50 33 20 64 6f 65 73 20 6e 6f 74  ster P3 does not
223a0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
223b0 67 65 72 20 6f 72 20 69 66 20 50 31 20 64 6f 65  ger or if P1 doe
223c0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  s not.** contain
223d0 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20 72   a record with r
223e0 6f 77 69 64 20 50 33 20 74 68 65 6e 20 6a 75 6d  owid P3 then jum
223f0 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
22400 20 50 32 2e 20 20 0a 2a 2a 20 4f 72 2c 20 69 66   P2.  .** Or, if
22410 20 50 32 20 69 73 20 30 2c 20 72 61 69 73 65 20   P2 is 0, raise 
22420 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
22430 54 20 65 72 72 6f 72 2e 20 49 66 20 50 31 20 64  T error. If P1 d
22440 6f 65 73 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61  oes contain.** a
22450 20 72 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77   record with row
22460 69 64 20 50 33 20 74 68 65 6e 20 0a 2a 2a 20 6c  id P3 then .** l
22470 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  eave the cursor 
22480 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 61 74  pointing at that
22490 20 72 65 63 6f 72 64 20 61 6e 64 20 66 61 6c 6c   record and fall
224a0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
224b0 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74  next.** instruct
224c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ion..**.** The O
224d0 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 70 63 6f  P_NotExists opco
224e0 64 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  de performs the 
224f0 73 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  same operation, 
22500 62 75 74 20 77 69 74 68 20 4f 50 5f 4e 6f 74 45  but with OP_NotE
22510 78 69 73 74 73 0a 2a 2a 20 74 68 65 20 50 33 20  xists.** the P3 
22520 72 65 67 69 73 74 65 72 20 6d 75 73 74 20 62 65  register must be
22530 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 63   guaranteed to c
22540 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
22550 72 20 76 61 6c 75 65 2e 20 20 57 69 74 68 20 74  r value.  With t
22560 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 2c 20 72  his.** opcode, r
22570 65 67 69 73 74 65 72 20 50 33 20 6d 69 67 68 74  egister P3 might
22580 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
22590 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
225a0 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f  he OP_NotFound o
225b0 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
225c0 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
225d0 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n on index btree
225e0 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74  s.** (with arbit
225f0 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65  rary multi-value
22600 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   keys)..**.** Th
22610 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
22620 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
22630 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
22640 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63  cannot be advanc
22650 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20  ed.** in either 
22660 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
22670 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
22680 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70  Next and Prev op
22690 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  codes will.** no
226a0 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67  t work following
226b0 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
226c0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
226d0 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  und, NotFound, N
226e0 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52  oConflict, SeekR
226f0 6f 77 69 64 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  owid.*/./* Opcod
22700 65 3a 20 4e 6f 74 45 78 69 73 74 73 20 50 31 20  e: NotExists P1 
22710 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
22720 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b  opsis: intkey=r[
22730 50 33 5d 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P3].**.** P1 is 
22740 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
22750 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 61 6e  ursor open on an
22760 20 53 51 4c 20 74 61 62 6c 65 20 62 74 72 65 65   SQL table btree
22770 20 28 77 69 74 68 20 69 6e 74 65 67 65 72 0a 2a   (with integer.*
22780 2a 20 6b 65 79 73 29 2e 20 20 50 33 20 69 73 20  * keys).  P3 is 
22790 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
227a0 2e 20 20 49 66 20 50 31 20 64 6f 65 73 20 6e 6f  .  If P1 does no
227b0 74 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f  t contain a reco
227c0 72 64 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  rd with.** rowid
227d0 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
227e0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
227f0 20 20 4f 72 2c 20 69 66 20 50 32 20 69 73 20 30    Or, if P2 is 0
22800 2c 20 72 61 69 73 65 20 61 6e 0a 2a 2a 20 53 51  , raise an.** SQ
22810 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
22820 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63  or. If P1 does c
22830 6f 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20  ontain a record 
22840 77 69 74 68 20 72 6f 77 69 64 20 50 33 20 74 68  with rowid P3 th
22850 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20 74 68 65  en .** leave the
22860 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
22870 20 61 74 20 74 68 61 74 20 72 65 63 6f 72 64 20   at that record 
22880 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  and fall through
22890 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   to the next.** 
228a0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
228b0 2a 2a 20 54 68 65 20 4f 50 5f 53 65 65 6b 52 6f  ** The OP_SeekRo
228c0 77 69 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  wid opcode perfo
228d0 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
228e0 72 61 74 69 6f 6e 20 62 75 74 20 61 6c 73 6f 20  ration but also 
228f0 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 50 33  allows the.** P3
22900 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
22910 74 61 69 6e 20 61 20 6e 6f 6e 2d 69 6e 74 65 67  tain a non-integ
22920 65 72 20 76 61 6c 75 65 2c 20 69 6e 20 77 68 69  er value, in whi
22930 63 68 20 63 61 73 65 20 74 68 65 20 6a 75 6d 70  ch case the jump
22940 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74 61   is.** always ta
22950 6b 65 6e 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ken.  This opcod
22960 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
22970 50 33 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69  P3 always contai
22980 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  n an integer..**
22990 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74 46 6f  .** The OP_NotFo
229a0 75 6e 64 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  und opcode perfo
229b0 72 6d 73 20 74 68 65 20 73 61 6d 65 20 6f 70 65  rms the same ope
229c0 72 61 74 69 6f 6e 20 6f 6e 20 69 6e 64 65 78 20  ration on index 
229d0 62 74 72 65 65 73 0a 2a 2a 20 28 77 69 74 68 20  btrees.** (with 
229e0 61 72 62 69 74 72 61 72 79 20 6d 75 6c 74 69 2d  arbitrary multi-
229f0 76 61 6c 75 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a  value keys)..**.
22a00 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
22a10 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
22a20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
22a30 65 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 61  e it cannot be a
22a40 64 76 61 6e 63 65 64 0a 2a 2a 20 69 6e 20 65 69  dvanced.** in ei
22a50 74 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20  ther direction. 
22a60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
22a70 20 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72   the Next and Pr
22a80 65 76 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 0a  ev opcodes will.
22a90 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c  ** not work foll
22aa0 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64  owing this opcod
22ab0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
22ac0 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
22ad0 6e 64 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20  nd, NoConflict, 
22ae0 53 65 65 6b 52 6f 77 69 64 0a 2a 2f 0a 63 61 73  SeekRowid.*/.cas
22af0 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 3a 20  e OP_SeekRowid: 
22b00 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
22b10 2c 20 69 6e 33 20 2a 2f 0a 20 20 56 64 62 65 43  , in3 */.  VdbeC
22b20 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
22b30 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
22b40 69 6e 74 20 72 65 73 3b 0a 20 20 75 36 34 20 69  int res;.  u64 i
22b50 4b 65 79 3b 0a 0a 20 20 70 49 6e 33 20 3d 20 26  Key;..  pIn3 = &
22b60 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
22b70 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67   if( (pIn3->flag
22b80 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20  s & MEM_Int)==0 
22b90 29 7b 0a 20 20 20 20 61 70 70 6c 79 41 66 66 69  ){.    applyAffi
22ba0 6e 69 74 79 28 70 49 6e 33 2c 20 53 51 4c 49 54  nity(pIn3, SQLIT
22bb0 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65  E_AFF_NUMERIC, e
22bc0 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 69 66  ncoding);.    if
22bd0 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  ( (pIn3->flags &
22be0 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 20 67   MEM_Int)==0 ) g
22bf0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
22c00 20 20 7d 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68    }.  /* Fall th
22c10 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 4e 6f  rough into OP_No
22c20 74 45 78 69 73 74 73 20 2a 2f 0a 63 61 73 65 20  tExists */.case 
22c30 4f 50 5f 4e 6f 74 45 78 69 73 74 73 3a 20 20 20  OP_NotExists:   
22c40 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
22c50 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d 20  in3 */.  pIn3 = 
22c60 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
22c70 20 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e    assert( pIn3->
22c80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
22c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
22ca0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
22cb0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
22cc0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
22cd0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
22ce0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 23 69  ert( pC!=0 );.#i
22cf0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22d00 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d  G.  pC->seekOp =
22d10 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   0;.#endif.  ass
22d20 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65  ert( pC->isTable
22d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22d40 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
22d50 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70  YPE_BTREE );.  p
22d60 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  Crsr = pC->uc.pC
22d70 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22d80 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20 72   pCrsr!=0 );.  r
22d90 65 73 20 3d 20 30 3b 0a 20 20 69 4b 65 79 20 3d  es = 0;.  iKey =
22da0 20 70 49 6e 33 2d 3e 75 2e 69 3b 0a 20 20 72 63   pIn3->u.i;.  rc
22db0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
22dc0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
22dd0 72 73 72 2c 20 30 2c 20 69 4b 65 79 2c 20 30 2c  rsr, 0, iKey, 0,
22de0 20 26 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74   &res);.  assert
22df0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22e00 7c 7c 20 72 65 73 3d 3d 30 20 29 3b 0a 20 20 70  || res==0 );.  p
22e10 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20  C->movetoTarget 
22e20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65 64  = iKey;  /* Used
22e30 20 62 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a 2f   by OP_Delete */
22e40 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
22e50 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53   0;.  pC->cacheS
22e60 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
22e70 41 4c 45 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  ALE;.  pC->defer
22e80 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
22e90 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
22ea0 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 70 43  (res!=0,2);.  pC
22eb0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 72  ->seekResult = r
22ec0 65 73 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30  es;.  if( res!=0
22ed0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22ef0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
22f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
22f10 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
22f20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
22f30 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d  {.      goto jum
22f40 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d 0a 20  p_to_p2;.    }. 
22f50 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
22f60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
22f70 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
22f80 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
22f90 71 75 65 6e 63 65 20 50 31 20 50 32 20 2a 20 2a  quence P1 P2 * *
22fa0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
22fb0 72 5b 50 32 5d 3d 63 75 72 73 6f 72 5b 50 31 5d  r[P2]=cursor[P1]
22fc0 2e 63 74 72 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e  .ctr++.**.** Fin
22fd0 64 20 74 68 65 20 6e 65 78 74 20 61 76 61 69 6c  d the next avail
22fe0 61 62 6c 65 20 73 65 71 75 65 6e 63 65 20 6e 75  able sequence nu
22ff0 6d 62 65 72 20 66 6f 72 20 63 75 72 73 6f 72 20  mber for cursor 
23000 50 31 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  P1..** Write the
23010 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
23020 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
23030 32 2e 0a 2a 2a 20 54 68 65 20 73 65 71 75 65 6e  2..** The sequen
23040 63 65 20 6e 75 6d 62 65 72 20 6f 6e 20 74 68 65  ce number on the
23050 20 63 75 72 73 6f 72 20 69 73 20 69 6e 63 72 65   cursor is incre
23060 6d 65 6e 74 65 64 20 61 66 74 65 72 20 74 68 69  mented after thi
23070 73 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  s.** instruction
23080 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  .  .*/.case OP_S
23090 65 71 75 65 6e 63 65 3a 20 7b 20 20 20 20 20 20  equence: {      
230a0 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
230b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
230c0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
230d0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
230e0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
230f0 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a  [pOp->p1]!=0 );.
23100 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
23110 73 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75  sr[pOp->p1]->eCu
23120 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56  rType!=CURTYPE_V
23130 54 41 42 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  TAB );.  pOut = 
23140 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
23150 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
23160 75 2e 69 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  u.i = p->apCsr[p
23170 4f 70 2d 3e 70 31 5d 2d 3e 73 65 71 43 6f 75 6e  Op->p1]->seqCoun
23180 74 2b 2b 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  t++;.  break;.}.
23190 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 77  ../* Opcode: New
231a0 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20 2a  Rowid P1 P2 P3 *
231b0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
231c0 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a  r[P2]=rowid.**.*
231d0 2a 20 47 65 74 20 61 20 6e 65 77 20 69 6e 74 65  * Get a new inte
231e0 67 65 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  ger record numbe
231f0 72 20 28 61 2e 6b 2e 61 20 22 72 6f 77 69 64 22  r (a.k.a "rowid"
23200 29 20 75 73 65 64 20 61 73 20 74 68 65 20 6b 65  ) used as the ke
23210 79 20 74 6f 20 61 20 74 61 62 6c 65 2e 0a 2a 2a  y to a table..**
23220 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
23230 65 72 20 69 73 20 6e 6f 74 20 70 72 65 76 69 6f  er is not previo
23240 75 73 6c 79 20 75 73 65 64 20 61 73 20 61 20 6b  usly used as a k
23250 65 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ey in the databa
23260 73 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74  se.** table that
23270 20 63 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74   cursor P1 point
23280 73 20 74 6f 2e 20 20 54 68 65 20 6e 65 77 20 72  s to.  The new r
23290 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73 20  ecord number is 
232a0 77 72 69 74 74 65 6e 0a 2a 2a 20 77 72 69 74 74  written.** writt
232b0 65 6e 20 74 6f 20 72 65 67 69 73 74 65 72 20 50  en to register P
232c0 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 33 3e 30  2..**.** If P3>0
232d0 20 74 68 65 6e 20 50 33 20 69 73 20 61 20 72 65   then P3 is a re
232e0 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f  gister in the ro
232f0 6f 74 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73  ot frame of this
23300 20 56 44 42 45 20 74 68 61 74 20 68 6f 6c 64 73   VDBE that holds
23310 20 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74   .** the largest
23320 20 70 72 65 76 69 6f 75 73 6c 79 20 67 65 6e 65   previously gene
23330 72 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75 6d  rated record num
23340 62 65 72 2e 20 4e 6f 20 6e 65 77 20 72 65 63 6f  ber. No new reco
23350 72 64 20 6e 75 6d 62 65 72 73 20 61 72 65 0a 2a  rd numbers are.*
23360 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  * allowed to be 
23370 6c 65 73 73 20 74 68 61 6e 20 74 68 69 73 20 76  less than this v
23380 61 6c 75 65 2e 20 57 68 65 6e 20 74 68 69 73 20  alue. When this 
23390 76 61 6c 75 65 20 72 65 61 63 68 65 73 20 69 74  value reaches it
233a0 73 20 6d 61 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61  s maximum, .** a
233b0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
233c0 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64  ror is generated
233d0 2e 20 54 68 65 20 50 33 20 72 65 67 69 73 74 65  . The P3 registe
233e0 72 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  r is updated wit
233f0 68 20 74 68 65 20 27 0a 2a 2a 20 67 65 6e 65 72  h the '.** gener
23400 61 74 65 64 20 72 65 63 6f 72 64 20 6e 75 6d 62  ated record numb
23410 65 72 2e 20 54 68 69 73 20 50 33 20 6d 65 63 68  er. This P3 mech
23420 61 6e 69 73 6d 20 69 73 20 75 73 65 64 20 74 6f  anism is used to
23430 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e 74 20   help implement 
23440 74 68 65 0a 2a 2a 20 41 55 54 4f 49 4e 43 52 45  the.** AUTOINCRE
23450 4d 45 4e 54 20 66 65 61 74 75 72 65 2e 0a 2a 2f  MENT feature..*/
23460 0a 63 61 73 65 20 4f 50 5f 4e 65 77 52 6f 77 69  .case OP_NewRowi
23470 64 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  d: {           /
23480 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 36 34 20  * out2 */.  i64 
23490 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
234a0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
234b0 77 69 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  wid */.  VdbeCur
234c0 73 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20 20  sor *pC;        
234d0 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 61 62  /* Cursor of tab
234e0 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65  le to get the ne
234f0 77 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74  w rowid */.  int
23500 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
23510 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
23520 20 61 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   an sqlite3Btree
23530 4c 61 73 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Last() */.  int 
23540 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
23550 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 74 6f     /* Counter to
23560 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65   limit the numbe
23570 72 20 6f 66 20 73 65 61 72 63 68 65 73 20 2a 2f  r of searches */
23580 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20 20  .  Mem *pMem;   
23590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
235a0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6c 61  ister holding la
235b0 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20  rgest rowid for 
235c0 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 2a 2f  AUTOINCREMENT */
235d0 0a 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46  .  VdbeFrame *pF
235e0 72 61 6d 65 3b 20 20 20 20 20 2f 2a 20 52 6f 6f  rame;     /* Roo
235f0 74 20 66 72 61 6d 65 20 6f 66 20 56 44 42 45 20  t frame of VDBE 
23600 2a 2f 0a 0a 20 20 76 20 3d 20 30 3b 0a 20 20 72  */..  v = 0;.  r
23610 65 73 20 3d 20 30 3b 0a 20 20 70 4f 75 74 20 3d  es = 0;.  pOut =
23620 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
23630 70 2c 20 70 4f 70 29 3b 0a 20 20 61 73 73 65 72  p, pOp);.  asser
23640 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
23650 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
23660 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
23670 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
23680 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
23690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
236a0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
236b0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
236c0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
236d0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 7b 0a  ursor!=0 );.  {.
236e0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
236f0 72 6f 77 69 64 20 6f 72 20 72 65 63 6f 72 64 20  rowid or record 
23700 6e 75 6d 62 65 72 20 28 64 69 66 66 65 72 65 6e  number (differen
23710 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68 65 20  t terms for the 
23720 73 61 6d 65 0a 20 20 20 20 2a 2a 20 74 68 69 6e  same.    ** thin
23730 67 29 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  g) is obtained i
23740 6e 20 61 20 74 77 6f 2d 73 74 65 70 20 61 6c 67  n a two-step alg
23750 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a 0a 20  orithm..    **. 
23760 20 20 20 2a 2a 20 46 69 72 73 74 20 77 65 20 61     ** First we a
23770 74 74 65 6d 70 74 20 74 6f 20 66 69 6e 64 20 74  ttempt to find t
23780 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
23790 69 6e 67 20 72 6f 77 69 64 20 61 6e 64 20 61 64  ing rowid and ad
237a0 64 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 74 6f 20  d one.    ** to 
237b0 74 68 61 74 2e 20 20 42 75 74 20 69 66 20 74 68  that.  But if th
237c0 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
237d0 6e 67 20 72 6f 77 69 64 20 69 73 20 61 6c 72 65  ng rowid is alre
237e0 61 64 79 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  ady the maximum.
237f0 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 76 65 20      ** positive 
23800 69 6e 74 65 67 65 72 2c 20 77 65 20 68 61 76 65  integer, we have
23810 20 74 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   to fall through
23820 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 0a 20   to the second. 
23830 20 20 20 2a 2a 20 70 72 6f 62 61 62 69 6c 69 73     ** probabilis
23840 74 69 63 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  tic algorithm.  
23850 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23860 73 65 63 6f 6e 64 20 61 6c 67 6f 72 69 74 68 6d  second algorithm
23870 20 69 73 20 74 6f 20 73 65 6c 65 63 74 20 61 20   is to select a 
23880 72 6f 77 69 64 20 61 74 20 72 61 6e 64 6f 6d 20  rowid at random 
23890 61 6e 64 20 73 65 65 20 69 66 0a 20 20 20 20 2a  and see if.    *
238a0 2a 20 69 74 20 61 6c 72 65 61 64 79 20 65 78 69  * it already exi
238b0 73 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  sts in the table
238c0 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
238d0 74 20 65 78 69 73 74 2c 20 77 65 20 68 61 76 65  t exist, we have
238e0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 65 64 65  .    ** succeede
238f0 64 2e 20 20 49 66 20 74 68 65 20 72 61 6e 64 6f  d.  If the rando
23900 6d 20 72 6f 77 69 64 20 64 6f 65 73 20 65 78 69  m rowid does exi
23910 73 74 2c 20 77 65 20 73 65 6c 65 63 74 20 61 20  st, we select a 
23920 6e 65 77 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  new one.    ** a
23930 6e 64 20 74 72 79 20 61 67 61 69 6e 2c 20 75 70  nd try again, up
23940 20 74 6f 20 31 30 30 20 74 69 6d 65 73 2e 0a 20   to 100 times.. 
23950 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
23960 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b  ( pC->isTable );
23970 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23980 33 32 42 49 54 5f 52 4f 57 49 44 0a 23 20 20 20  32BIT_ROWID.#   
23990 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49 44  define MAX_ROWID
239a0 20 30 78 37 66 66 66 66 66 66 66 0a 23 65 6c 73   0x7fffffff.#els
239b0 65 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 20 63 6f  e.    /* Some co
239c0 6d 70 69 6c 65 72 73 20 63 6f 6d 70 6c 61 69 6e  mpilers complain
239d0 20 61 62 6f 75 74 20 63 6f 6e 73 74 61 6e 74 73   about constants
239e0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 30 78 37   of the form 0x7
239f0 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 2e  fffffffffffffff.
23a00 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 73 20 63  .    ** Others c
23a10 6f 6d 70 6c 61 69 6e 20 61 62 6f 75 74 20 30 78  omplain about 0x
23a20 37 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66  7fffffffffffffff
23a30 66 4c 4c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  fLL.  The follow
23a40 69 6e 67 20 6d 61 63 72 6f 20 73 65 65 6d 73 0a  ing macro seems.
23a50 20 20 20 20 2a 2a 20 74 6f 20 70 72 6f 76 69 64      ** to provid
23a60 65 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 77  e the constant w
23a70 68 69 6c 65 20 6d 61 6b 69 6e 67 20 61 6c 6c 20  hile making all 
23a80 63 6f 6d 70 69 6c 65 72 73 20 68 61 70 70 79 2e  compilers happy.
23a90 0a 20 20 20 20 2a 2f 0a 23 20 20 20 64 65 66 69  .    */.#   defi
23aa0 6e 65 20 4d 41 58 5f 52 4f 57 49 44 20 20 28 69  ne MAX_ROWID  (i
23ab0 36 34 29 28 20 28 28 28 75 36 34 29 30 78 37 66  64)( (((u64)0x7f
23ac0 66 66 66 66 66 66 29 3c 3c 33 32 29 20 7c 20 28  ffffff)<<32) | (
23ad0 75 36 34 29 30 78 66 66 66 66 66 66 66 66 20 29  u64)0xffffffff )
23ae0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
23af0 20 21 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52   !pC->useRandomR
23b00 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 72 63  owid ){.      rc
23b10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c   = sqlite3BtreeL
23b20 61 73 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ast(pC->uc.pCurs
23b30 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
23b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23b50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
23b60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
23b70 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20  error;.      }. 
23b80 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
23b90 20 20 20 20 20 20 20 20 76 20 3d 20 31 3b 20 20          v = 1;  
23ba0 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 31 34   /* IMP: R-61914
23bb0 2d 34 38 30 37 34 20 2a 2f 0a 20 20 20 20 20 20  -48074 */.      
23bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
23bd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23be0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
23bf0 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
23c00 20 29 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20   );.        v = 
23c10 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
23c20 67 65 72 4b 65 79 28 70 43 2d 3e 75 63 2e 70 43  gerKey(pC->uc.pC
23c30 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
23c40 69 66 28 20 76 3e 3d 4d 41 58 5f 52 4f 57 49 44  if( v>=MAX_ROWID
23c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
23c60 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64  ->useRandomRowid
23c70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
23c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 76  lse{.          v
23c90 2b 2b 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  ++;   /* IMP: R-
23ca0 32 39 35 33 38 2d 33 34 39 38 37 20 2a 2f 0a 20  29538-34987 */. 
23cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23cc0 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
23cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23ce0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 69 66  INCREMENT.    if
23cf0 28 20 70 4f 70 2d 3e 70 33 20 29 7b 0a 20 20 20  ( pOp->p3 ){.   
23d00 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61     /* Assert tha
23d10 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20  t P3 is a valid 
23d20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a  memory cell. */.
23d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
23d40 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20 20  p->p3>0 );.     
23d50 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
23d60 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 46  {.        for(pF
23d70 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
23d80 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
23d90 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
23da0 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  pParent);.      
23db0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
23dc0 20 50 33 20 69 73 20 61 20 76 61 6c 69 64 20 6d   P3 is a valid m
23dd0 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20  emory cell. */. 
23de0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23df0 4f 70 2d 3e 70 33 3c 3d 70 46 72 61 6d 65 2d 3e  Op->p3<=pFrame->
23e00 6e 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  nMem );.        
23e10 70 4d 65 6d 20 3d 20 26 70 46 72 61 6d 65 2d 3e  pMem = &pFrame->
23e20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
23e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23e40 20 20 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68      /* Assert th
23e50 61 74 20 50 33 20 69 73 20 61 20 76 61 6c 69 64  at P3 is a valid
23e60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 2a 2f   memory cell. */
23e70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23e80 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
23e90 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
23ea0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  r) );.        pM
23eb0 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  em = &aMem[pOp->
23ec0 70 33 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  p3];.        mem
23ed0 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c  AboutToChange(p,
23ee0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a   pMem);.      }.
23ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
23f00 6d 49 73 56 61 6c 69 64 28 70 4d 65 6d 29 20 29  mIsValid(pMem) )
23f10 3b 0a 0a 20 20 20 20 20 20 52 45 47 49 53 54 45  ;..      REGISTE
23f20 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
23f30 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   pMem);.      sq
23f40 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
23f50 67 65 72 69 66 79 28 70 4d 65 6d 29 3b 0a 20 20  gerify(pMem);.  
23f60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
23f70 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
23f80 6e 74 29 21 3d 30 20 29 3b 20 20 2f 2a 20 6d 65  nt)!=0 );  /* me
23f90 6d 28 50 33 29 20 68 6f 6c 64 73 20 61 6e 20 69  m(P3) holds an i
23fa0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
23fb0 69 66 28 20 70 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d  if( pMem->u.i==M
23fc0 41 58 5f 52 4f 57 49 44 20 7c 7c 20 70 43 2d 3e  AX_ROWID || pC->
23fd0 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20 29  useRandomRowid )
23fe0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
23ff0 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a  QLITE_FULL;   /*
24000 20 49 4d 50 3a 20 52 2d 31 37 38 31 37 2d 30 30   IMP: R-17817-00
24010 36 33 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  630 */.        g
24020 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
24030 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
24040 20 20 20 20 20 20 69 66 28 20 76 3c 70 4d 65 6d        if( v<pMem
24050 2d 3e 75 2e 69 2b 31 20 29 7b 0a 20 20 20 20 20  ->u.i+1 ){.     
24060 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
24070 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   + 1;.      }.  
24080 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
24090 76 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  v;.    }.#endif.
240a0 20 20 20 20 69 66 28 20 70 43 2d 3e 75 73 65 52      if( pC->useR
240b0 61 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20  andomRowid ){.  
240c0 20 20 20 20 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54      /* IMPLEMENT
240d0 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 37 36 37  ATION-OF: R-0767
240e0 37 2d 34 31 38 38 31 20 49 66 20 74 68 65 20 6c  7-41881 If the l
240f0 61 72 67 65 73 74 20 52 4f 57 49 44 20 69 73 20  argest ROWID is 
24100 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 20 20 20  equal to the.   
24110 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f     ** largest po
24120 73 73 69 62 6c 65 20 69 6e 74 65 67 65 72 20 28  ssible integer (
24130 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
24140 38 30 37 29 20 74 68 65 6e 20 74 68 65 20 64 61  807) then the da
24150 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
24160 65 6e 67 69 6e 65 20 73 74 61 72 74 73 20 70 69  engine starts pi
24170 63 6b 69 6e 67 20 70 6f 73 69 74 69 76 65 20 63  cking positive c
24180 61 6e 64 69 64 61 74 65 20 52 4f 57 49 44 73 20  andidate ROWIDs 
24190 61 74 20 72 61 6e 64 6f 6d 20 75 6e 74 69 6c 0a  at random until.
241a0 20 20 20 20 20 20 2a 2a 20 69 74 20 66 69 6e 64        ** it find
241b0 73 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  s one that is no
241c0 74 20 70 72 65 76 69 6f 75 73 6c 79 20 75 73 65  t previously use
241d0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  d. */.      asse
241e0 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29  rt( pOp->p3==0 )
241f0 3b 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20  ;  /* We cannot 
24200 62 65 20 69 6e 20 72 61 6e 64 6f 6d 20 72 6f 77  be in random row
24210 69 64 20 6d 6f 64 65 20 69 66 20 74 68 69 73 20  id mode if this 
24220 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 2a 2a 20 61 6e 20 41 55 54 4f 49 4e 43 52 45 4d  ** an AUTOINCREM
24250 45 4e 54 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ENT table. */.  
24260 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
24270 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 73     do{.        s
24280 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
24290 73 28 73 69 7a 65 6f 66 28 76 29 2c 20 26 76 29  s(sizeof(v), &v)
242a0 3b 0a 20 20 20 20 20 20 20 20 76 20 26 3d 20 28  ;.        v &= (
242b0 4d 41 58 5f 52 4f 57 49 44 3e 3e 31 29 3b 20 76  MAX_ROWID>>1); v
242c0 2b 2b 3b 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ++;  /* Ensure t
242d0 68 61 74 20 76 20 69 73 20 67 72 65 61 74 65 72  hat v is greater
242e0 20 74 68 61 6e 20 7a 65 72 6f 20 2a 2f 0a 20 20   than zero */.  
242f0 20 20 20 20 7d 77 68 69 6c 65 28 20 20 28 28 72      }while(  ((r
24300 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
24310 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
24320 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30  C->uc.pCursor, 0
24330 2c 20 28 75 36 34 29 76 2c 0a 20 20 20 20 20 20  , (u64)v,.      
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24360 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26 72             0, &r
24370 65 73 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  es))==SQLITE_OK)
24380 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
24390 28 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20  (res==0).       
243a0 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 3c 31       && (++cnt<1
243b0 30 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  00));.      if( 
243c0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
243d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
243e0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
243f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24400 51 4c 49 54 45 5f 46 55 4c 4c 3b 20 20 20 2f 2a  QLITE_FULL;   /*
24410 20 49 4d 50 3a 20 52 2d 33 38 32 31 39 2d 35 33   IMP: R-38219-53
24420 30 30 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  002 */.        g
24430 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
24440 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a  _error;.      }.
24450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 3e        assert( v>
24460 30 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 34  0 );  /* EV: R-4
24470 30 38 31 32 2d 30 33 35 37 30 20 2a 2f 0a 20 20  0812-03570 */.  
24480 20 20 7d 0a 20 20 20 20 70 43 2d 3e 64 65 66 65    }.    pC->defe
24490 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
244a0 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61      pC->cacheSta
244b0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
244c0 45 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75  E;.  }.  pOut->u
244d0 2e 69 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b  .i = v;.  break;
244e0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
244f0 6e 73 65 72 74 20 50 31 20 50 32 20 50 33 20 50  nsert P1 P2 P3 P
24500 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
24510 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 20 64  : intkey=r[P3] d
24520 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20  ata=r[P2].**.** 
24530 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
24540 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66  nto the table of
24550 20 63 75 72 73 6f 72 20 50 31 2e 20 20 41 20 6e   cursor P1.  A n
24560 65 77 20 65 6e 74 72 79 20 69 73 0a 2a 2a 20 63  ew entry is.** c
24570 72 65 61 74 65 64 20 69 66 20 69 74 20 64 6f 65  reated if it doe
24580 73 6e 27 74 20 61 6c 72 65 61 64 79 20 65 78 69  sn't already exi
24590 73 74 20 6f 72 20 74 68 65 20 64 61 74 61 20 66  st or the data f
245a0 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  or an existing.*
245b0 2a 20 65 6e 74 72 79 20 69 73 20 6f 76 65 72 77  * entry is overw
245c0 72 69 74 74 65 6e 2e 20 20 54 68 65 20 64 61 74  ritten.  The dat
245d0 61 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 4d  a is the value M
245e0 45 4d 5f 42 6c 6f 62 20 73 74 6f 72 65 64 20 69  EM_Blob stored i
245f0 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6e 75  n register.** nu
24600 6d 62 65 72 20 50 32 2e 20 54 68 65 20 6b 65 79  mber P2. The key
24610 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
24620 67 69 73 74 65 72 20 50 33 2e 20 54 68 65 20 6b  gister P3. The k
24630 65 79 20 6d 75 73 74 0a 2a 2a 20 62 65 20 61 20  ey must.** be a 
24640 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  MEM_Int..**.** I
24650 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48  f the OPFLAG_NCH
24660 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 35 20  ANGE flag of P5 
24670 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
24680 20 72 6f 77 20 63 68 61 6e 67 65 20 63 6f 75 6e   row change coun
24690 74 20 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  t is.** incremen
246a0 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20 6e  ted (otherwise n
246b0 6f 74 29 2e 20 20 49 66 20 74 68 65 20 4f 50 46  ot).  If the OPF
246c0 4c 41 47 5f 4c 41 53 54 52 4f 57 49 44 20 66 6c  LAG_LASTROWID fl
246d0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
246e0 0a 2a 2a 20 74 68 65 6e 20 72 6f 77 69 64 20 69  .** then rowid i
246f0 73 20 73 74 6f 72 65 64 20 66 6f 72 20 73 75 62  s stored for sub
24700 73 65 71 75 65 6e 74 20 72 65 74 75 72 6e 20 62  sequent return b
24710 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  y the.** sqlite3
24720 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
24730 69 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 6f  id() function (o
24740 74 68 65 72 77 69 73 65 20 69 74 20 69 73 20 75  therwise it is u
24750 6e 6d 6f 64 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  nmodified)..**.*
24760 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
24770 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
24780 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
24790 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
247a0 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e  ion might.** run
247b0 20 66 61 73 74 65 72 20 62 79 20 61 76 6f 69 64   faster by avoid
247c0 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  ing an unnecessa
247d0 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f  ry seek on curso
247e0 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a  r P1.  However,.
247f0 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  ** the OPFLAG_US
24800 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
24810 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65   must only be se
24820 74 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  t if there have 
24830 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a  been no prior.**
24840 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75   seeks on the cu
24850 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d  rsor or if the m
24860 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20  ost recent seek 
24870 75 73 65 64 20 61 20 6b 65 79 20 65 71 75 61 6c  used a key equal
24880 20 74 6f 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49 66   to P3..**.** If
24890 20 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50   the OPFLAG_ISUP
248a0 44 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  DATE flag is set
248b0 2c 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  , then this opco
248c0 64 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  de is part of an
248d0 0a 2a 2a 20 55 50 44 41 54 45 20 6f 70 65 72 61  .** UPDATE opera
248e0 74 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65  tion.  Otherwise
248f0 20 28 69 66 20 74 68 65 20 66 6c 61 67 20 69 73   (if the flag is
24900 20 63 6c 65 61 72 29 20 74 68 65 6e 20 74 68 69   clear) then thi
24910 73 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 70  s opcode.** is p
24920 61 72 74 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  art of an INSERT
24930 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 54 68 65   operation.  The
24940 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 6f   difference is o
24950 6e 6c 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  nly important to
24960 0a 2a 2a 20 74 68 65 20 75 70 64 61 74 65 20 68  .** the update h
24970 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ook..**.** Param
24980 65 74 65 72 20 50 34 20 6d 61 79 20 70 6f 69 6e  eter P4 may poin
24990 74 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  t to a Table str
249a0 75 63 74 75 72 65 2c 20 6f 72 20 6d 61 79 20 62  ucture, or may b
249b0 65 20 4e 55 4c 4c 2e 20 49 66 20 69 74 20 69 73  e NULL. If it is
249c0 20 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74   .** not NULL, t
249d0 68 65 6e 20 74 68 65 20 75 70 64 61 74 65 2d 68  hen the update-h
249e0 6f 6f 6b 20 28 73 71 6c 69 74 65 33 2e 78 55 70  ook (sqlite3.xUp
249f0 64 61 74 65 43 61 6c 6c 62 61 63 6b 29 20 69 73  dateCallback) is
24a00 20 69 6e 76 6f 6b 65 64 20 0a 2a 2a 20 66 6f 6c   invoked .** fol
24a10 6c 6f 77 69 6e 67 20 61 20 73 75 63 63 65 73 73  lowing a success
24a20 66 75 6c 20 69 6e 73 65 72 74 2e 0a 2a 2a 0a 2a  ful insert..**.*
24a30 2a 20 28 57 41 52 4e 49 4e 47 2f 54 4f 44 4f 3a  * (WARNING/TODO:
24a40 20 49 66 20 50 31 20 69 73 20 61 20 70 73 65 75   If P1 is a pseu
24a50 64 6f 2d 63 75 72 73 6f 72 20 61 6e 64 20 50 32  do-cursor and P2
24a60 20 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   is dynamically.
24a70 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68  ** allocated, th
24a80 65 6e 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  en ownership of 
24a90 50 32 20 69 73 20 74 72 61 6e 73 66 65 72 72 65  P2 is transferre
24aa0 64 20 74 6f 20 74 68 65 20 70 73 65 75 64 6f 2d  d to the pseudo-
24ab0 63 75 72 73 6f 72 0a 2a 2a 20 61 6e 64 20 72 65  cursor.** and re
24ac0 67 69 73 74 65 72 20 50 32 20 62 65 63 6f 6d 65  gister P2 become
24ad0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 49 66  s ephemeral.  If
24ae0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63   the cursor is c
24af0 68 61 6e 67 65 64 2c 20 74 68 65 0a 2a 2a 20 76  hanged, the.** v
24b00 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
24b10 20 50 32 20 77 69 6c 6c 20 74 68 65 6e 20 63 68   P2 will then ch
24b20 61 6e 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ange.  Make sure
24b30 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 2a   this does not.*
24b40 2a 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  * cause any prob
24b50 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  lems.).**.** Thi
24b60 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6f 6e  s instruction on
24b70 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 74 61 62 6c  ly works on tabl
24b80 65 73 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c  es.  The equival
24b90 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ent instruction.
24ba0 2a 2a 20 66 6f 72 20 69 6e 64 69 63 65 73 20 69  ** for indices i
24bb0 73 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2e 0a  s OP_IdxInsert..
24bc0 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e  */./* Opcode: In
24bd0 73 65 72 74 49 6e 74 20 50 31 20 50 32 20 50 33  sertInt P1 P2 P3
24be0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
24bf0 69 73 3a 20 69 6e 74 6b 65 79 3d 50 33 20 64 61  is: intkey=P3 da
24c00 74 61 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  ta=r[P2].**.** T
24c10 68 69 73 20 77 6f 72 6b 73 20 65 78 61 63 74 6c  his works exactl
24c20 79 20 6c 69 6b 65 20 4f 50 5f 49 6e 73 65 72 74  y like OP_Insert
24c30 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
24c40 20 6b 65 79 20 69 73 20 74 68 65 0a 2a 2a 20 69   key is the.** i
24c50 6e 74 65 67 65 72 20 76 61 6c 75 65 20 50 33 2c  nteger value P3,
24c60 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f   not the value o
24c70 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 74  f the integer st
24c80 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
24c90 20 50 33 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P3..*/.case OP_
24ca0 49 6e 73 65 72 74 3a 20 0a 63 61 73 65 20 4f 50  Insert: .case OP
24cb0 5f 49 6e 73 65 72 74 49 6e 74 3a 20 7b 0a 20 20  _InsertInt: {.  
24cc0 4d 65 6d 20 2a 70 44 61 74 61 3b 20 20 20 20 20  Mem *pData;     
24cd0 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f    /* MEM cell ho
24ce0 6c 64 69 6e 67 20 64 61 74 61 20 66 6f 72 20 74  lding data for t
24cf0 68 65 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20  he record to be 
24d00 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 4d 65  inserted */.  Me
24d10 6d 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  m *pKey;        
24d20 2f 2a 20 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64  /* MEM cell hold
24d30 69 6e 67 20 6b 65 79 20 20 66 6f 72 20 74 68 65  ing key  for the
24d40 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 56 64 62   record */.  Vdb
24d50 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 2f  eCursor *pC;   /
24d60 2a 20 43 75 72 73 6f 72 20 74 6f 20 74 61 62 6c  * Cursor to tabl
24d70 65 20 69 6e 74 6f 20 77 68 69 63 68 20 69 6e 73  e into which ins
24d80 65 72 74 20 69 73 20 77 72 69 74 74 65 6e 20 2a  ert is written *
24d90 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75  /.  int seekResu
24da0 6c 74 3b 20 20 20 2f 2a 20 52 65 73 75 6c 74 20  lt;   /* Result 
24db0 6f 66 20 70 72 69 6f 72 20 73 65 65 6b 20 6f 72  of prior seek or
24dc0 20 30 20 69 66 20 6e 6f 20 55 53 45 53 45 45 4b   0 if no USESEEK
24dd0 52 45 53 55 4c 54 20 66 6c 61 67 20 2a 2f 0a 20  RESULT flag */. 
24de0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24df0 3b 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6e  ;  /* database n
24e00 61 6d 65 20 2d 20 75 73 65 64 20 62 79 20 74 68  ame - used by th
24e10 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 2a 2f  e update hook */
24e20 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
24e30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74       /* Table st
24e40 72 75 63 74 75 72 65 20 2d 20 75 73 65 64 20 62  ructure - used b
24e50 79 20 75 70 64 61 74 65 20 61 6e 64 20 70 72 65  y update and pre
24e60 2d 75 70 64 61 74 65 20 68 6f 6f 6b 73 20 2a 2f  -update hooks */
24e70 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
24e80 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 66       /* Opcode f
24e90 6f 72 20 75 70 64 61 74 65 20 68 6f 6f 6b 3a 20  or update hook: 
24ea0 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 6f 72  SQLITE_UPDATE or
24eb0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 20 2a   SQLITE_INSERT *
24ec0 2f 0a 20 20 42 74 72 65 65 50 61 79 6c 6f 61 64  /.  BtreePayload
24ed0 20 78 3b 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64   x;   /* Payload
24ee0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
24ef0 2a 2f 0a 0a 20 20 6f 70 20 3d 20 30 3b 0a 20 20  */..  op = 0;.  
24f00 70 44 61 74 61 20 3d 20 26 61 4d 65 6d 5b 70 4f  pData = &aMem[pO
24f10 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72 74  p->p2];.  assert
24f20 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
24f30 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
24f40 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
24f50 6d 65 6d 49 73 56 61 6c 69 64 28 70 44 61 74 61  memIsValid(pData
24f60 29 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  ) );.  pC = p->a
24f70 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
24f80 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
24f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
24fa0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
24fb0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73  E_BTREE );.  ass
24fc0 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
24fd0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
24fe0 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f  rt( (pOp->p5 & O
24ff0 50 46 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c  PFLAG_ISNOOP) ||
25000 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
25010 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
25020 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20  4type==P4_TABLE 
25030 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3e 3d  || pOp->p4type>=
25040 50 34 5f 53 54 41 54 49 43 20 29 3b 0a 20 20 52  P4_STATIC );.  R
25050 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
25060 70 2d 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 0a  p->p2, pData);..
25070 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
25080 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a  e==OP_Insert ){.
25090 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d      pKey = &aMem
250a0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61  [pOp->p3];.    a
250b0 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61  ssert( pKey->fla
250c0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
250d0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
250e0 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a  sValid(pKey) );.
250f0 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
25100 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79  CE(pOp->p3, pKey
25110 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20  );.    x.nKey = 
25120 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c  pKey->u.i;.  }el
25130 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
25140 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
25150 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20  InsertInt );.   
25160 20 78 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d 3e 70   x.nKey = pOp->p
25170 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f  3;.  }..  if( pO
25180 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
25190 42 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41 54  BLE && HAS_UPDAT
251a0 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20  E_HOOK(db) ){.  
251b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44    assert( pC->iD
251c0 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20  b>=0 );.    zDb 
251d0 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
251e0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
251f0 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e   pTab = pOp->p4.
25200 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
25210 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
25220 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 48  LAG_ISNOOP) || H
25230 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b  asRowid(pTab) );
25240 0a 20 20 20 20 6f 70 20 3d 20 28 28 70 4f 70 2d  .    op = ((pOp-
25250 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  >p5 & OPFLAG_ISU
25260 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f  PDATE) ? SQLITE_
25270 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f  UPDATE : SQLITE_
25280 49 4e 53 45 52 54 29 3b 0a 20 20 7d 65 6c 73 65  INSERT);.  }else
25290 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 20  {.    pTab = 0; 
252a0 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
252b0 53 69 6c 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c  Silence a compil
252c0 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20  er warning. */. 
252d0 20 20 20 7a 44 62 20 3d 20 30 3b 20 20 2f 2a 20     zDb = 0;  /* 
252e0 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c  Not needed.  Sil
252f0 65 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20  ence a compiler 
25300 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a  warning. */.  }.
25310 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
25320 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
25330 48 4f 4f 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  HOOK.  /* Invoke
25340 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20   the pre-update 
25350 68 6f 6f 6b 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  hook, if any */.
25360 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70    if( db->xPreUp
25370 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 0a 20 20  dateCallback .  
25380 20 26 26 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   && pOp->p4type=
25390 3d 50 34 5f 54 41 42 4c 45 0a 20 20 20 26 26 20  =P4_TABLE.   && 
253a0 21 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  !(pOp->p5 & OPFL
253b0 41 47 5f 49 53 55 50 44 41 54 45 29 0a 20 20 29  AG_ISUPDATE).  )
253c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
253d0 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 70  ePreUpdateHook(p
253e0 2c 20 70 43 2c 20 53 51 4c 49 54 45 5f 49 4e 53  , pC, SQLITE_INS
253f0 45 52 54 2c 20 7a 44 62 2c 20 70 54 61 62 2c 20  ERT, zDb, pTab, 
25400 78 2e 6e 4b 65 79 2c 20 70 4f 70 2d 3e 70 32 29  x.nKey, pOp->p2)
25410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d  ;.  }.  if( pOp-
25420 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 4e  >p5 & OPFLAG_ISN
25430 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a 23 65 6e  OOP ) break;.#en
25440 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 70 2d 3e  dif..  if( pOp->
25450 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41  p5 & OPFLAG_NCHA
25460 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65  NGE ) p->nChange
25470 2b 2b 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  ++;.  if( pOp->p
25480 35 20 26 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52  5 & OPFLAG_LASTR
25490 4f 57 49 44 20 29 20 64 62 2d 3e 6c 61 73 74 52  OWID ) db->lastR
254a0 6f 77 69 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20  owid = x.nKey;. 
254b0 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67   if( pData->flag
254c0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
254d0 20 20 20 20 78 2e 70 44 61 74 61 20 3d 20 30 3b      x.pData = 0;
254e0 0a 20 20 20 20 78 2e 6e 44 61 74 61 20 3d 20 30  .    x.nData = 0
254f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
25500 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c  ssert( pData->fl
25510 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
25520 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 20 20  MEM_Str) );.    
25530 78 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d  x.pData = pData-
25540 3e 7a 3b 0a 20 20 20 20 78 2e 6e 44 61 74 61 20  >z;.    x.nData 
25550 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20 7d 0a  = pData->n;.  }.
25560 20 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28    seekResult = (
25570 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
25580 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
25590 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c   ? pC->seekResul
255a0 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44  t : 0);.  if( pD
255b0 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ata->flags & MEM
255c0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e  _Zero ){.    x.n
255d0 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e  Zero = pData->u.
255e0 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nZero;.  }else{.
255f0 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b      x.nZero = 0;
25600 0a 20 20 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20  .  }.  x.pKey = 
25610 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
25620 33 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d  3BtreeInsert(pC-
25630 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c  >uc.pCursor, &x,
25640 0a 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20  .      (pOp->p5 
25650 26 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  & (OPFLAG_APPEND
25660 7c 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49  |OPFLAG_SAVEPOSI
25670 54 49 4f 4e 29 29 2c 20 73 65 65 6b 52 65 73 75  TION)), seekResu
25680 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65  lt.  );.  pC->de
25690 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
256a0 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61  ;.  pC->cacheSta
256b0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
256c0 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  E;..  /* Invoke 
256d0 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
256e0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
256f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
25700 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
25710 6f 72 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78 55  or;.  if( db->xU
25720 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26  pdateCallback &&
25730 20 6f 70 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78   op ){.    db->x
25740 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
25750 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20 6f  b->pUpdateArg, o
25760 70 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e  p, zDb, pTab->zN
25770 61 6d 65 2c 20 78 2e 6e 4b 65 79 29 3b 0a 20 20  ame, x.nKey);.  
25780 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
25790 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74 65 20   Opcode: Delete 
257a0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
257b0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
257c0 72 65 63 6f 72 64 20 61 74 20 77 68 69 63 68 20  record at which 
257d0 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 69 73  the P1 cursor is
257e0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
257f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
25800 65 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  e OPFLAG_SAVEPOS
25810 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 74 68 65  ITION bit of the
25820 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 69 73   P5 parameter is
25830 20 73 65 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68   set, then.** th
25840 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  e cursor will be
25850 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25860 74 20 20 65 69 74 68 65 72 20 74 68 65 20 6e 65  t  either the ne
25870 78 74 20 6f 72 20 74 68 65 20 70 72 65 76 69 6f  xt or the previo
25880 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 20  us.** record in 
25890 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69 74  the table. If it
258a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
258b0 67 20 61 74 20 74 68 65 20 6e 65 78 74 20 72 65  g at the next re
258c0 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  cord, then.** th
258d0 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73 74  e next Next inst
258e0 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
258f0 61 20 6e 6f 2d 6f 70 2e 20 41 73 20 61 20 72 65  a no-op. As a re
25900 73 75 6c 74 2c 20 69 6e 20 74 68 69 73 20 63 61  sult, in this ca
25910 73 65 0a 2a 2a 20 69 74 20 69 73 20 6f 6b 20 74  se.** it is ok t
25920 6f 20 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72  o delete a recor
25930 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
25940 4e 65 78 74 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a  Next loop. If .*
25950 2a 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  * OPFLAG_SAVEPOS
25960 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 50 35 20  ITION bit of P5 
25970 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74  is clear, then t
25980 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62  he cursor will b
25990 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 61 6e 20  e.** left in an 
259a0 75 6e 64 65 66 69 6e 65 64 20 73 74 61 74 65 2e  undefined state.
259b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
259c0 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 20 62  FLAG_AUXDELETE b
259d0 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35 2c  it is set on P5,
259e0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
259f0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 64 65 6c  that this.** del
25a00 65 74 65 20 6f 6e 65 20 6f 66 20 73 65 76 65 72  ete one of sever
25a10 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  al associated wi
25a20 74 68 20 64 65 6c 65 74 69 6e 67 20 61 20 74 61  th deleting a ta
25a30 62 6c 65 20 72 6f 77 20 61 6e 64 20 61 6c 6c 20  ble row and all 
25a40 69 74 73 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  its.** associate
25a50 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
25a60 20 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66    Exactly one of
25a70 20 74 68 6f 73 65 20 64 65 6c 65 74 65 73 20 69   those deletes i
25a80 73 20 74 68 65 20 22 70 72 69 6d 61 72 79 22 0a  s the "primary".
25a90 2a 2a 20 64 65 6c 65 74 65 2e 20 20 54 68 65 20  ** delete.  The 
25aa0 6f 74 68 65 72 73 20 61 72 65 20 61 6c 6c 20 6f  others are all o
25ab0 6e 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45  n OPFLAG_FORDELE
25ac0 54 45 20 63 75 72 73 6f 72 73 20 6f 72 20 65 6c  TE cursors or el
25ad0 73 65 20 61 72 65 0a 2a 2a 20 6d 61 72 6b 65 64  se are.** marked
25ae0 20 77 69 74 68 20 74 68 65 20 41 55 58 44 45 4c   with the AUXDEL
25af0 45 54 45 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ETE flag..**.** 
25b00 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  If the OPFLAG_NC
25b10 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50 32  HANGE flag of P2
25b20 20 28 4e 42 3a 20 50 32 20 6e 6f 74 20 50 35 29   (NB: P2 not P5)
25b30 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
25b40 65 20 72 6f 77 0a 2a 2a 20 63 68 61 6e 67 65 20  e row.** change 
25b50 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d 65  count is increme
25b60 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65 20  nted (otherwise 
25b70 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d  not)..**.** P1 m
25b80 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75 64  ust not be pseud
25b90 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61 73  o-table.  It has
25ba0 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74 61   to be a real ta
25bb0 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c 74  ble with.** mult
25bc0 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a  iple rows..**.**
25bd0 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e 55   If P4 is not NU
25be0 4c 4c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74  LL then it point
25bf0 73 20 74 6f 20 61 20 54 61 62 6c 65 20 6f 62 6a  s to a Table obj
25c00 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
25c10 65 20 65 69 74 68 65 72 20 0a 2a 2a 20 74 68 65  e either .** the
25c20 20 75 70 64 61 74 65 20 6f 72 20 70 72 65 2d 75   update or pre-u
25c30 70 64 61 74 65 20 68 6f 6f 6b 2c 20 6f 72 20 62  pdate hook, or b
25c40 6f 74 68 2c 20 6d 61 79 20 62 65 20 69 6e 76 6f  oth, may be invo
25c50 6b 65 64 2e 20 54 68 65 20 50 31 20 63 75 72 73  ked. The P1 curs
25c60 6f 72 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20  or must.** have 
25c70 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64 20  been positioned 
25c80 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e  using OP_NotFoun
25c90 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  d prior to invok
25ca0 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ing this opcode 
25cb0 69 6e 20 0a 2a 2a 20 74 68 69 73 20 63 61 73 65  in .** this case
25cc0 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
25cd0 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69 67  if one is config
25ce0 75 72 65 64 2c 20 74 68 65 20 70 72 65 2d 75 70  ured, the pre-up
25cf0 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a  date hook is .**
25d00 20 69 6e 76 6f 6b 65 64 20 69 66 20 50 34 20 69   invoked if P4 i
25d10 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 54 68 65 20  s not NULL. The 
25d20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20 69  update-hook is i
25d30 6e 76 6f 6b 65 64 20 69 66 20 6f 6e 65 20 69 73  nvoked if one is
25d40 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 0a 2a 2a   configured, .**
25d50 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   P4 is not NULL,
25d60 20 61 6e 64 20 74 68 65 20 4f 50 46 4c 41 47 5f   and the OPFLAG_
25d70 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 69 73 20  NCHANGE flag is 
25d80 73 65 74 20 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a  set in P2..**.**
25d90 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 49   If the OPFLAG_I
25da0 53 55 50 44 41 54 45 20 66 6c 61 67 20 69 73 20  SUPDATE flag is 
25db0 73 65 74 20 69 6e 20 50 32 2c 20 74 68 65 6e 20  set in P2, then 
25dc0 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  P3 contains the 
25dd0 61 64 64 72 65 73 73 0a 2a 2a 20 6f 66 20 74 68  address.** of th
25de0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68  e memory cell th
25df0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
25e00 76 61 6c 75 65 20 74 68 61 74 20 74 68 65 20 72  value that the r
25e10 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20  owid of the row 
25e20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 65 74 20 74  will.** be set t
25e30 6f 20 62 79 20 74 68 65 20 75 70 64 61 74 65 2e  o by the update.
25e40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 6c 65  .*/.case OP_Dele
25e50 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  te: {.  VdbeCurs
25e60 6f 72 20 2a 70 43 3b 0a 20 20 63 6f 6e 73 74 20  or *pC;.  const 
25e70 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 61 62  char *zDb;.  Tab
25e80 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
25e90 6f 70 66 6c 61 67 73 3b 0a 0a 20 20 6f 70 66 6c  opflags;..  opfl
25ea0 61 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  ags = pOp->p2;. 
25eb0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
25ec0 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
25ed0 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
25ee0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
25ef0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
25f00 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
25f10 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
25f20 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
25f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
25f40 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
25f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
25f60 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
25f70 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
25f80 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
25f90 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
25fa0 54 41 42 4c 45 20 26 26 20 48 61 73 52 6f 77 69  TABLE && HasRowi
25fb0 64 28 70 4f 70 2d 3e 70 34 2e 70 54 61 62 29 20  d(pOp->p4.pTab) 
25fc0 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 7b  && pOp->p5==0 ){
25fd0 0a 20 20 20 20 2f 2a 20 49 66 20 70 35 20 69 73  .    /* If p5 is
25fe0 20 7a 65 72 6f 2c 20 74 68 65 20 73 65 65 6b 20   zero, the seek 
25ff0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 70  operation that p
26000 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63 75  ositioned the cu
26010 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 0a 20 20  rsor prior to.  
26020 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20 77    ** OP_Delete w
26030 69 6c 6c 20 68 61 76 65 20 61 6c 73 6f 20 73 65  ill have also se
26040 74 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65 74 6f  t the pC->moveto
26050 54 61 72 67 65 74 20 66 69 65 6c 64 20 74 6f 20  Target field to 
26060 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 20 20 20  the rowid of.   
26070 20 2a 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74   ** the row that
26080 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
26090 64 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 4b 65  d */.    i64 iKe
260a0 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
260b0 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75  IntegerKey(pC->u
260c0 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
260d0 61 73 73 65 72 74 28 20 70 43 2d 3e 6d 6f 76 65  assert( pC->move
260e0 74 6f 54 61 72 67 65 74 3d 3d 69 4b 65 79 20 29  toTarget==iKey )
260f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
26100 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65  /* If the update
26110 2d 68 6f 6f 6b 20 6f 72 20 70 72 65 2d 75 70 64  -hook or pre-upd
26120 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62 65  ate-hook will be
26130 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 7a 44   invoked, set zD
26140 62 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e 61  b to.  ** the na
26150 6d 65 20 6f 66 20 74 68 65 20 64 62 20 74 6f 20  me of the db to 
26160 70 61 73 73 20 61 73 20 74 6f 20 69 74 2e 20 41  pass as to it. A
26170 6c 73 6f 20 73 65 74 20 6c 6f 63 61 6c 20 70 54  lso set local pT
26180 61 62 20 74 6f 20 61 20 63 6f 70 79 0a 20 20 2a  ab to a copy.  *
26190 2a 20 6f 66 20 70 34 2e 70 54 61 62 2e 20 46 69  * of p4.pTab. Fi
261a0 6e 61 6c 6c 79 2c 20 69 66 20 70 35 20 69 73 20  nally, if p5 is 
261b0 74 72 75 65 2c 20 69 6e 64 69 63 61 74 69 6e 67  true, indicating
261c0 20 74 68 61 74 20 74 68 69 73 20 63 75 72 73 6f   that this curso
261d0 72 20 77 61 73 0a 20 20 2a 2a 20 6c 61 73 74 20  r was.  ** last 
261e0 6d 6f 76 65 64 20 77 69 74 68 20 4f 50 5f 4e 65  moved with OP_Ne
261f0 78 74 20 6f 72 20 4f 50 5f 50 72 65 76 2c 20 6e  xt or OP_Prev, n
26200 6f 74 20 53 65 65 6b 20 6f 72 20 4e 6f 74 46 6f  ot Seek or NotFo
26210 75 6e 64 2c 20 73 65 74 20 0a 20 20 2a 2a 20 56  und, set .  ** V
26220 64 62 65 43 75 72 73 6f 72 2e 6d 6f 76 65 74 6f  dbeCursor.moveto
26230 54 61 72 67 65 74 20 74 6f 20 74 68 65 20 63 75  Target to the cu
26240 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 20 2a 2f  rrent rowid.  */
26250 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79  .  if( pOp->p4ty
26260 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26 20  pe==P4_TABLE && 
26270 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b 28  HAS_UPDATE_HOOK(
26280 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  db) ){.    asser
26290 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b  t( pC->iDb>=0 );
262a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
262b0 2d 3e 70 34 2e 70 54 61 62 21 3d 30 20 29 3b 0a  ->p4.pTab!=0 );.
262c0 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44      zDb = db->aD
262d0 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53 4e  b[pC->iDb].zDbSN
262e0 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  ame;.    pTab = 
262f0 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20 20  pOp->p4.pTab;.  
26300 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20 26    if( (pOp->p5 &
26310 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49   OPFLAG_SAVEPOSI
26320 54 49 4f 4e 29 21 3d 30 20 26 26 20 70 43 2d 3e  TION)!=0 && pC->
26330 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  isTable ){.     
26340 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65   pC->movetoTarge
26350 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  t = sqlite3Btree
26360 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e 75  IntegerKey(pC->u
26370 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
26380 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  }.  }else{.    z
26390 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 6f 74  Db = 0;   /* Not
263a0 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63   needed.  Silenc
263b0 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
263c0 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 54 61  ning. */.    pTa
263d0 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e  b = 0;  /* Not n
263e0 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20  eeded.  Silence 
263f0 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  a compiler warni
26400 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64  ng. */.  }..#ifd
26410 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
26420 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
26430 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
26440 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b 20  pre-update-hook 
26450 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
26460 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55 70    if( db->xPreUp
26470 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26 20  dateCallback && 
26480 70 4f 70 2d 3e 70 34 2e 70 54 61 62 20 29 7b 0a  pOp->p4.pTab ){.
26490 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6f 70      assert( !(op
264a0 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49  flags & OPFLAG_I
264b0 53 55 50 44 41 54 45 29 20 0a 20 20 20 20 20 20  SUPDATE) .      
264c0 20 20 20 7c 7c 20 48 61 73 52 6f 77 69 64 28 70     || HasRowid(p
264d0 54 61 62 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  Tab)==0 .       
264e0 20 20 7c 7c 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e    || (aMem[pOp->
264f0 70 33 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  p3].flags & MEM_
26500 49 6e 74 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  Int) .    );.   
26510 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
26520 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c  pdateHook(p, pC,
26530 0a 20 20 20 20 20 20 20 20 28 6f 70 66 6c 61 67  .        (opflag
26540 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  s & OPFLAG_ISUPD
26550 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50  ATE) ? SQLITE_UP
26560 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f 44 45  DATE : SQLITE_DE
26570 4c 45 54 45 2c 20 0a 20 20 20 20 20 20 20 20 7a  LETE, .        z
26580 44 62 2c 20 70 54 61 62 2c 20 70 43 2d 3e 6d 6f  Db, pTab, pC->mo
26590 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20 20 20  vetoTarget,.    
265a0 20 20 20 20 70 4f 70 2d 3e 70 33 0a 20 20 20 20      pOp->p3.    
265b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 70 66  );.  }.  if( opf
265c0 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53  lags & OPFLAG_IS
265d0 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a 23 65  NOOP ) break;.#e
265e0 6e 64 69 66 0a 20 0a 20 20 2f 2a 20 4f 6e 6c 79  ndif. .  /* Only
265f0 20 66 6c 61 67 73 20 74 68 61 74 20 63 61 6e 20   flags that can 
26600 62 65 20 73 65 74 20 61 72 65 20 53 41 56 45 50  be set are SAVEP
26610 4f 49 53 54 49 4f 4e 20 61 6e 64 20 41 55 58 44  OISTION and AUXD
26620 45 4c 45 54 45 20 2a 2f 20 0a 20 20 61 73 73 65  ELETE */ .  asse
26630 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 7e  rt( (pOp->p5 & ~
26640 28 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49  (OPFLAG_SAVEPOSI
26650 54 49 4f 4e 7c 4f 50 46 4c 41 47 5f 41 55 58 44  TION|OPFLAG_AUXD
26660 45 4c 45 54 45 29 29 3d 3d 30 20 29 3b 0a 20 20  ELETE))==0 );.  
26670 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 53  assert( OPFLAG_S
26680 41 56 45 50 4f 53 49 54 49 4f 4e 3d 3d 42 54 52  AVEPOSITION==BTR
26690 45 45 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 20  EE_SAVEPOSITION 
266a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46  );.  assert( OPF
266b0 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 3d 3d 42  LAG_AUXDELETE==B
266c0 54 52 45 45 5f 41 55 58 44 45 4c 45 54 45 20 29  TREE_AUXDELETE )
266d0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
266e0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
266f0 70 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  pFrame==0 ){.   
26700 20 69 66 28 20 70 43 2d 3e 69 73 45 70 68 65 6d   if( pC->isEphem
26710 65 72 61 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20  eral==0.        
26720 26 26 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50  && (pOp->p5 & OP
26730 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 29 3d  FLAG_AUXDELETE)=
26740 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 28 70  =0.        && (p
26750 43 2d 3e 77 72 46 6c 61 67 20 26 20 4f 50 46 4c  C->wrFlag & OPFL
26760 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3d 3d 30  AG_FORDELETE)==0
26770 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
26780 6e 45 78 74 72 61 44 65 6c 65 74 65 2b 2b 3b 0a  nExtraDelete++;.
26790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f      }.    if( pO
267a0 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 4e  p->p2 & OPFLAG_N
267b0 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  CHANGE ){.      
267c0 6e 45 78 74 72 61 44 65 6c 65 74 65 2d 2d 3b 0a  nExtraDelete--;.
267d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
267e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
267f0 42 74 72 65 65 44 65 6c 65 74 65 28 70 43 2d 3e  BtreeDelete(pC->
26800 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f 70 2d  uc.pCursor, pOp-
26810 3e 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61 63 68  >p5);.  pC->cach
26820 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
26830 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65 65  STALE;.  pC->see
26840 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69  kResult = 0;.  i
26850 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
26860 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
26870 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  ..  /* Invoke th
26880 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 66  e update-hook if
26890 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
268a0 69 66 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50  if( opflags & OP
268b0 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b 0a  FLAG_NCHANGE ){.
268c0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b      p->nChange++
268d0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 55  ;.    if( db->xU
268e0 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26  pdateCallback &&
268f0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
26900 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78 55 70  ){.      db->xUp
26910 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
26920 3e 70 55 70 64 61 74 65 41 72 67 2c 20 53 51 4c  >pUpdateArg, SQL
26930 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44 62 2c  ITE_DELETE, zDb,
26940 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
26950 20 20 20 20 20 20 20 20 70 43 2d 3e 6d 6f 76 65          pC->move
26960 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20  toTarget);.     
26970 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44 62   assert( pC->iDb
26980 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >=0 );.    }.  }
26990 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f 2a 20  ..  break;.}./* 
269a0 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43 6f 75  Opcode: ResetCou
269b0 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  nt * * * * *.**.
269c0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
269d0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
269e0 65 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  er is copied to 
269f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
26a00 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f  dle.** change co
26a10 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65 64 20  unter (returned 
26a20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
26a30 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  lls to sqlite3_c
26a40 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20 54 68  hanges())..** Th
26a50 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74 65 72  en the VMs inter
26a60 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  nal change count
26a70 65 72 20 72 65 73 65 74 73 20 74 6f 20 30 2e 0a  er resets to 0..
26a80 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
26a90 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  by trigger progr
26aa0 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ams..*/.case OP_
26ab0 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a 20 20  ResetCount: {.  
26ac0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
26ad0 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
26ae0 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43 68 61  ange);.  p->nCha
26af0 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  nge = 0;.  break
26b00 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
26b10 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20 50 31  SorterCompare P1
26b20 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53 79 6e   P2 P3 P4.** Syn
26b30 6f 70 73 69 73 3a 20 69 66 20 6b 65 79 28 50 31  opsis: if key(P1
26b40 29 21 3d 74 72 69 6d 28 72 5b 50 33 5d 2c 50 34  )!=trim(r[P3],P4
26b50 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  ) goto P2.**.** 
26b60 50 31 20 69 73 20 61 20 73 6f 72 74 65 72 20 63  P1 is a sorter c
26b70 75 72 73 6f 72 2e 20 54 68 69 73 20 69 6e 73 74  ursor. This inst
26b80 72 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  ruction compares
26b90 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
26ba0 0a 2a 2a 20 72 65 63 6f 72 64 20 62 6c 6f 62 20  .** record blob 
26bb0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
26bc0 67 61 69 6e 73 74 20 61 20 70 72 65 66 69 78 20  gainst a prefix 
26bd0 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
26be0 74 20 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 72  t .** the sorter
26bf0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
26c00 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4f 6e  y points to.  On
26c10 6c 79 20 74 68 65 20 66 69 72 73 74 20 50 34 20  ly the first P4 
26c20 66 69 65 6c 64 73 0a 2a 2a 20 6f 66 20 72 5b 50  fields.** of r[P
26c30 33 5d 20 61 6e 64 20 74 68 65 20 73 6f 72 74 65  3] and the sorte
26c40 72 20 72 65 63 6f 72 64 20 61 72 65 20 63 6f 6d  r record are com
26c50 70 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pared..**.** If 
26c60 65 69 74 68 65 72 20 50 33 20 6f 72 20 74 68 65  either P3 or the
26c70 20 73 6f 72 74 65 72 20 63 6f 6e 74 61 69 6e 73   sorter contains
26c80 20 61 20 4e 55 4c 4c 20 69 6e 20 6f 6e 65 20 6f   a NULL in one o
26c90 66 20 74 68 65 69 72 20 73 69 67 6e 69 66 69 63  f their signific
26ca0 61 6e 74 0a 2a 2a 20 66 69 65 6c 64 73 20 28 6e  ant.** fields (n
26cb0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 20  ot counting the 
26cc0 50 34 20 66 69 65 6c 64 73 20 61 74 20 74 68 65  P4 fields at the
26cd0 20 65 6e 64 20 77 68 69 63 68 20 61 72 65 20 69   end which are i
26ce0 67 6e 6f 72 65 64 29 20 74 68 65 6e 0a 2a 2a 20  gnored) then.** 
26cf0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
26d00 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
26d10 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 46 61 6c  equal..**.** Fal
26d20 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 6e 65 78  l through to nex
26d30 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 66  t instruction if
26d40 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64 73   the two records
26d50 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
26d60 6f 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65 72 2e  o.** each other.
26d70 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20    Jump to P2 if 
26d80 74 68 65 79 20 61 72 65 20 64 69 66 66 65 72 65  they are differe
26d90 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  nt..*/.case OP_S
26da0 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20 7b 0a  orterCompare: {.
26db0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
26dc0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  ;.  int res;.  i
26dd0 6e 74 20 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 70  nt nKeyCol;..  p
26de0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
26df0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
26e00 20 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b   isSorter(pC) );
26e10 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
26e20 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32  p4type==P4_INT32
26e30 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d   );.  pIn3 = &aM
26e40 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6e  em[pOp->p3];.  n
26e50 4b 65 79 43 6f 6c 20 3d 20 70 4f 70 2d 3e 70 34  KeyCol = pOp->p4
26e60 2e 69 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20  .i;.  res = 0;. 
26e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
26e80 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 28 70  eSorterCompare(p
26e90 43 2c 20 70 49 6e 33 2c 20 6e 4b 65 79 43 6f 6c  C, pIn3, nKeyCol
26ea0 2c 20 26 72 65 73 29 3b 0a 20 20 56 64 62 65 42  , &res);.  VdbeB
26eb0 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
26ec0 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  0,2);.  if( rc )
26ed0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
26ee0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
26ef0 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  res ) goto jump_
26f00 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
26f10 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  };../* Opcode: S
26f20 6f 72 74 65 72 44 61 74 61 20 50 31 20 50 32 20  orterData P1 P2 
26f30 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
26f40 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a  is: r[P2]=data.*
26f50 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20  *.** Write into 
26f60 72 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20  register P2 the 
26f70 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72 20 64  current sorter d
26f80 61 74 61 20 66 6f 72 20 73 6f 72 74 65 72 20 63  ata for sorter c
26f90 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54 68 65  ursor P1..** The
26fa0 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  n clear the colu
26fb0 6d 6e 20 68 65 61 64 65 72 20 63 61 63 68 65 20  mn header cache 
26fc0 6f 6e 20 63 75 72 73 6f 72 20 50 33 2e 0a 2a 2a  on cursor P3..**
26fd0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
26fe0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 75 73 65 20  is normally use 
26ff0 74 6f 20 6d 6f 76 65 20 61 20 72 65 63 6f 72 64  to move a record
27000 20 6f 75 74 20 6f 66 20 74 68 65 20 73 6f 72 74   out of the sort
27010 65 72 20 61 6e 64 20 69 6e 74 6f 0a 2a 2a 20 61  er and into.** a
27020 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 69   register that i
27030 73 20 74 68 65 20 73 6f 75 72 63 65 20 66 6f 72  s the source for
27040 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20   a pseudo-table 
27050 63 75 72 73 6f 72 20 63 72 65 61 74 65 64 20 75  cursor created u
27060 73 69 6e 67 0a 2a 2a 20 4f 70 65 6e 50 73 65 75  sing.** OpenPseu
27070 64 6f 2e 20 20 54 68 61 74 20 70 73 65 75 64 6f  do.  That pseudo
27080 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 20 69 73  -table cursor is
27090 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 69 73   the one that is
270a0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
270b0 2a 20 70 61 72 61 6d 65 74 65 72 20 50 33 2e 20  * parameter P3. 
270c0 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20 50 33   Clearing the P3
270d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 73   column cache as
270e0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 6f 70   part of this op
270f0 63 6f 64 65 20 73 61 76 65 73 0a 2a 2a 20 75 73  code saves.** us
27100 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20   from having to 
27110 69 73 73 75 65 20 61 20 73 65 70 61 72 61 74 65  issue a separate
27120 20 4e 75 6c 6c 52 6f 77 20 69 6e 73 74 72 75 63   NullRow instruc
27130 74 69 6f 6e 20 74 6f 20 63 6c 65 61 72 20 74 68  tion to clear th
27140 61 74 20 63 61 63 68 65 2e 0a 2a 2f 0a 63 61 73  at cache..*/.cas
27150 65 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 3a  e OP_SorterData:
27160 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
27170 2a 70 43 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 26  *pC;..  pOut = &
27180 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
27190 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
271a0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
271b0 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  t( isSorter(pC) 
271c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
271d0 33 56 64 62 65 53 6f 72 74 65 72 52 6f 77 6b 65  3VdbeSorterRowke
271e0 79 28 70 43 2c 20 70 4f 75 74 29 3b 0a 20 20 61  y(pC, pOut);.  a
271f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
27200 45 5f 4f 4b 20 7c 7c 20 28 70 4f 75 74 2d 3e 66  E_OK || (pOut->f
27210 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 29  lags & MEM_Blob)
27220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
27230 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
27240 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
27250 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
27260 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
27270 72 72 6f 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72  rror;.  p->apCsr
27280 5b 70 4f 70 2d 3e 70 33 5d 2d 3e 63 61 63 68 65  [pOp->p3]->cache
27290 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
272a0 54 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  TALE;.  break;.}
272b0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77  ../* Opcode: Row
272c0 44 61 74 61 20 50 31 20 50 32 20 50 33 20 2a 20  Data P1 P2 P3 * 
272d0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
272e0 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a 2a 20  [P2]=data.**.** 
272f0 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67 69 73  Write into regis
27300 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d 70 6c  ter P2 the compl
27310 65 74 65 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20  ete row content 
27320 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 0a  for the row at .
27330 2a 2a 20 77 68 69 63 68 20 63 75 72 73 6f 72 20  ** which cursor 
27340 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  P1 is currently 
27350 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 20 54 68 65  pointing..** The
27360 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72 70 72  re is no interpr
27370 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  etation of the d
27380 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69 73 20  ata.  .** It is 
27390 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e 74 6f  just copied onto
273a0 20 74 68 65 20 50 32 20 72 65 67 69 73 74 65 72   the P2 register
273b0 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a 2a 20   exactly as .** 
273c0 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  it is found in t
273d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
273e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f  ..**.** If curso
273f0 72 20 50 31 20 69 73 20 61 6e 20 69 6e 64 65 78  r P1 is an index
27400 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27410 6e 74 20 69 73 20 74 68 65 20 6b 65 79 20 6f 66  nt is the key of
27420 20 74 68 65 20 72 6f 77 2e 0a 2a 2a 20 49 66 20   the row..** If 
27430 63 75 72 73 6f 72 20 50 32 20 69 73 20 61 20 74  cursor P2 is a t
27440 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 63  able, then the c
27450 6f 6e 74 65 6e 74 20 65 78 74 72 61 63 74 65 64  ontent extracted
27460 20 69 73 20 74 68 65 20 64 61 74 61 2e 0a 2a 2a   is the data..**
27470 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 63 75  .** If the P1 cu
27480 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70 6f 69  rsor must be poi
27490 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
274a0 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55 4c 4c   row (not a NULL
274b0 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20 72 65   row).** of a re
274c0 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  al table, not a 
274d0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2a  pseudo-table..**
274e0 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74 68 65  .** If P3!=0 the
274f0 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  n this opcode is
27500 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 6b 65   allowed to make
27510 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c 20 70   an ephermeral p
27520 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 74  ointer.** into t
27530 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
27540 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
27550 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
27560 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  f the output.** 
27570 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65  register will be
27580 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 73 20   invalidated as 
27590 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 75 72 73  soon as the curs
275a0 6f 72 20 6d 6f 76 65 73 20 2d 20 69 6e 63 6c 75  or moves - inclu
275b0 64 69 6e 67 0a 2a 2a 20 6d 6f 76 65 73 20 63 61  ding.** moves ca
275c0 75 73 65 64 20 62 79 20 6f 74 68 65 72 20 63 75  used by other cu
275d0 72 73 6f 72 73 20 74 68 61 74 20 22 73 61 76 65  rsors that "save
275e0 22 20 74 68 65 20 74 68 65 20 63 75 72 72 65 6e  " the the curren
275f0 74 20 63 75 72 73 6f 72 73 0a 2a 2a 20 70 6f 73  t cursors.** pos
27600 69 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74  ition in order t
27610 68 61 74 20 74 68 65 79 20 63 61 6e 20 77 72 69  hat they can wri
27620 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  te to the same t
27630 61 62 6c 65 2e 20 20 49 66 20 50 33 3d 3d 30 0a  able.  If P3==0.
27640 2a 2a 20 74 68 65 6e 20 61 20 63 6f 70 79 20 6f  ** then a copy o
27650 66 20 74 68 65 20 64 61 74 61 20 69 73 20 6d 61  f the data is ma
27660 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  de into memory. 
27670 20 50 33 21 3d 30 20 69 73 20 66 61 73 74 65 72   P3!=0 is faster
27680 2c 20 62 75 74 0a 2a 2a 20 50 33 3d 3d 30 20 69  , but.** P3==0 i
27690 73 20 73 61 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  s safer..**.** I
276a0 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74 68 65  f P3!=0 then the
276b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
276c0 50 32 20 72 65 67 69 73 74 65 72 20 69 73 20 75  P2 register is u
276d0 6e 73 75 69 74 61 62 6c 65 20 66 6f 72 20 75 73  nsuitable for us
276e0 65 0a 2a 2a 20 69 6e 20 4f 50 5f 52 65 73 75 6c  e.** in OP_Resul
276f0 74 20 61 6e 64 20 61 6e 79 20 4f 50 5f 52 65 73  t and any OP_Res
27700 75 6c 74 20 77 69 6c 6c 20 69 6e 76 61 6c 69 64  ult will invalid
27710 61 74 65 20 74 68 65 20 50 32 20 72 65 67 69 73  ate the P2 regis
27720 74 65 72 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 20  ter content..** 
27730 54 68 65 20 50 32 20 72 65 67 69 73 74 65 72 20  The P2 register 
27740 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 76 61 6c  content is inval
27750 69 64 61 74 65 64 20 62 79 20 6f 70 63 6f 64 65  idated by opcode
27760 73 20 6c 69 6b 65 20 4f 50 5f 46 75 6e 63 74 69  s like OP_Functi
27770 6f 6e 20 6f 72 0a 2a 2a 20 62 79 20 61 6e 79 20  on or.** by any 
27780 75 73 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 63  use of another c
27790 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
277a0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
277b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77  ..*/.case OP_Row
277c0 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65 43 75  Data: {.  VdbeCu
277d0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
277e0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75  rsor *pCrsr;.  u
277f0 33 32 20 6e 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  32 n;..  pOut = 
27800 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
27810 2c 20 70 4f 70 29 3b 0a 0a 20 20 61 73 73 65 72  , pOp);..  asser
27820 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
27830 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
27840 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  sor );.  pC = p-
27850 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
27860 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
27870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27880 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
27890 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
278a0 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28  ssert( isSorter(
278b0 70 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pC)==0 );.  asse
278c0 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 3d  rt( pC->nullRow=
278d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
278e0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
278f0 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d 20 70  0 );.  pCrsr = p
27900 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 0a  C->uc.pCursor;..
27910 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f 77 44    /* The OP_RowD
27920 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c 77 61  ata opcodes alwa
27930 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e 6f 74  ys follow OP_Not
27940 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a 20 4f  Exists or.  ** O
27950 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f 72 20 4f  P_SeekRowid or O
27960 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65 78 74  P_Rewind/Op_Next
27970 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72 76 65   with no interve
27980 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69 6f 6e  ning instruction
27990 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 69 67 68  s.  ** that migh
279a0 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
279b0 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2a 20 49 66   cursor..  ** If
279c0 20 74 68 69 73 20 77 68 65 72 65 20 6e 6f 74 20   this where not 
279d0 74 68 65 20 63 61 73 65 2c 20 6f 6e 20 6f 66 20  the case, on of 
279e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
279f0 73 65 72 74 28 29 73 0a 20 20 2a 2a 20 77 6f 75  sert()s.  ** wou
27a00 6c 64 20 66 61 69 6c 2e 20 20 53 68 6f 75 6c 64  ld fail.  Should
27a10 20 74 68 69 73 20 65 76 65 72 20 63 68 61 6e 67   this ever chang
27a20 65 20 28 62 65 63 61 75 73 65 20 6f 66 20 63 68  e (because of ch
27a30 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63 6f 64  anges in the cod
27a40 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 6f 72  e.  ** generator
27a50 29 20 74 68 65 6e 20 74 68 65 20 66 69 78 20 77  ) then the fix w
27a60 6f 75 6c 64 20 62 65 20 74 6f 20 69 6e 73 65 72  ould be to inser
27a70 74 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  t a call to.  **
27a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
27a90 6f 72 4d 6f 76 65 74 6f 28 29 2e 0a 20 20 2a 2f  orMoveto()..  */
27aa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64  .  assert( pC->d
27ab0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30  eferredMoveto==0
27ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27ad0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
27ae0 49 73 56 61 6c 69 64 28 70 43 72 73 72 29 20 29  IsValid(pCrsr) )
27af0 3b 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20  ;.#if 0  /* Not 
27b00 72 65 71 75 69 72 65 64 20 64 75 65 20 74 6f 20  required due to 
27b10 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 6f 20  the previous to 
27b20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
27b30 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  nts */.  rc = sq
27b40 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
27b50 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69 66 28  oveto(pC);.  if(
27b60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27b70 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
27b80 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64 69 66  to_error;.#endif
27b90 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ..  n = sqlite3B
27ba0 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
27bb0 70 43 72 73 72 29 3b 0a 20 20 69 66 28 20 6e 3e  pCrsr);.  if( n>
27bc0 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b  (u32)db->aLimit[
27bd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
27be0 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
27bf0 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
27c00 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 30 20 29  testcase( n==0 )
27c10 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27c20 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
27c30 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f  (pCrsr, 0, n, pO
27c40 75 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ut);.  if( rc ) 
27c50 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
27c60 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 21  o_error;.  if( !
27c70 70 4f 70 2d 3e 70 33 20 29 20 44 65 65 70 68 65  pOp->p3 ) Deephe
27c80 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29 3b 0a  meralize(pOut);.
27c90 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
27ca0 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 52  BSIZE(pOut);.  R
27cb0 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
27cc0 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20 20  p->p2, pOut);.  
27cd0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
27ce0 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20 50 32  ode: Rowid P1 P2
27cf0 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
27d00 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a  is: r[P2]=rowid.
27d10 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72  **.** Store in r
27d20 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
27d30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
27d40 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 61  he key of the ta
27d50 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74 0a 2a  ble entry that.*
27d60 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  * P1 is currentl
27d70 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a 0a 2a  y point to..**.*
27d80 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69 74 68  * P1 can be eith
27d90 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  er an ordinary t
27da0 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61  able or a virtua
27db0 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72 65 20  l table.  There 
27dc0 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20 61 20  used to.** be a 
27dd0 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52 6f 77  separate OP_VRow
27de0 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 75 73  id opcode for us
27df0 65 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 74  e with virtual t
27e00 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69 73 0a  ables, but this.
27e10 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20 6e 6f  ** one opcode no
27e20 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  w works for both
27e30 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a 2a 2f   table types..*/
27e40 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64 3a 20  .case OP_Rowid: 
27e50 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
27e60 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56    /* out2 */.  V
27e70 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
27e80 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69 74 65   i64 v;.  sqlite
27e90 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
27ea0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
27eb0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
27ec0 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
27ed0 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
27ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
27ef0 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
27f00 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
27f10 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
27f20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
27f30 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
27f40 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
27f50 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45  ype!=CURTYPE_PSE
27f60 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c 6c 52  UDO || pC->nullR
27f70 6f 77 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e  ow );.  if( pC->
27f80 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 70  nullRow ){.    p
27f90 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
27fa0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65 61 6b  _Null;.    break
27fb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
27fc0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
27fd0 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43 2d 3e   ){.    v = pC->
27fe0 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 23 69  movetoTarget;.#i
27ff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28000 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
28010 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d 3e 65   }else if( pC->e
28020 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
28030 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 61 73 73  _VTAB ){.    ass
28040 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 56 43 75  ert( pC->uc.pVCu
28050 72 21 3d 30 20 29 3b 0a 20 20 20 20 70 56 74 61  r!=0 );.    pVta
28060 62 20 3d 20 70 43 2d 3e 75 63 2e 70 56 43 75 72  b = pC->uc.pVCur
28070 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70 4d 6f  ->pVtab;.    pMo
28080 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d  dule = pVtab->pM
28090 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73 65 72  odule;.    asser
280a0 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77  t( pModule->xRow
280b0 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  id );.    rc = p
280c0 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64 28 70  Module->xRowid(p
280d0 43 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26 76 29  C->uc.pVCur, &v)
280e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ;.    sqlite3Vta
280f0 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c  bImportErrmsg(p,
28100 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69 66 28   pVtab);.    if(
28110 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
28120 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23  _due_to_error;.#
28130 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
28140 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
28150 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E */.  }else{.  
28160 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
28170 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
28180 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61 73 73  BTREE );.    ass
28190 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
281a0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  sor!=0 );.    rc
281b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
281c0 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43 29 3b  rsorRestore(pC);
281d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
281e0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
281f0 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  error;.    if( p
28200 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
28210 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20      pOut->flags 
28220 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
28230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
28240 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 42 74     v = sqlite3Bt
28250 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43  reeIntegerKey(pC
28260 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
28270 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d   }.  pOut->u.i =
28280 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   v;.  break;.}..
28290 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c 6c 52  /* Opcode: NullR
282a0 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ow P1 * * * *.**
282b0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
282c0 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75 6c 6c  sor P1 to a null
282d0 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f 43 6f   row.  Any OP_Co
282e0 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e 73 0a  lumn operations.
282f0 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20 77 68  ** that occur wh
28300 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72 20 69  ile the cursor i
28310 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20 72 6f  s on the null ro
28320 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a 2a 2a  w will always.**
28330 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e 0a 2a   write a NULL..*
28340 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c 52 6f  /.case OP_NullRo
28350 77 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  w: {.  VdbeCurso
28360 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65 72 74  r *pC;..  assert
28370 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
28380 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
28390 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e  or );.  pC = p->
283a0 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
283b0 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20    assert( pC!=0 
283c0 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  );.  pC->nullRow
283d0 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 63 61 63 68   = 1;.  pC->cach
283e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
283f0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70 43 2d  STALE;.  if( pC-
28400 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
28410 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
28420 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
28430 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
28440 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
28450 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 75 63 2e  arCursor(pC->uc.
28460 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  pCursor);.  }.  
28470 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
28480 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50 32 20  ode: Last P1 P2 
28490 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P3 * *.**.** The
284a0 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68 65   next use of the
284b0 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d 6e   Rowid or Column
284c0 20 6f 72 20 50 72 65 76 20 69 6e 73 74 72 75 63   or Prev instruc
284d0 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a 20  tion for P1 .** 
284e0 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74 68  will refer to th
284f0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
28500 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62  the database tab
28510 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20  le or index..** 
28520 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  If the table or 
28530 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 61  index is empty a
28540 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a 75  nd P2>0, then ju
28550 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
28560 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20 69  o P2..** If P2 i
28570 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74 61  s 0 or if the ta
28580 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20  ble or index is 
28590 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20  not empty, fall 
285a0 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68  through.** to th
285b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74  e following inst
285c0 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
285d0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
285e0 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
285f0 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
28600 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
28610 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e  ,.** from the en
28620 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67  d toward the beg
28630 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65  inning.  In othe
28640 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
28650 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
28660 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76  ured to use Prev
28670 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a  , not Next..**.*
28680 2a 20 49 66 20 50 33 20 69 73 20 2d 31 2c 20 74  * If P3 is -1, t
28690 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
286a0 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  s positioned at 
286b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
286c0 74 72 65 65 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tree.** for the 
286d0 70 75 72 70 6f 73 65 20 6f 66 20 61 70 70 65 6e  purpose of appen
286e0 64 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ding a new entry
286f0 20 6f 6e 74 6f 20 74 68 65 20 62 74 72 65 65 2e   onto the btree.
28700 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63 61 73    In that.** cas
28710 65 20 50 32 20 6d 75 73 74 20 62 65 20 30 2e 20  e P2 must be 0. 
28720 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
28730 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
28740 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 0a  s used only for.
28750 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61 6e 64  ** appending and
28760 20 73 6f 20 69 66 20 74 68 65 20 63 75 72 73 6f   so if the curso
28770 72 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 6e  r is valid, then
28780 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   the cursor must
28790 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 20 70   already.** be p
287a0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65  ointing at the e
287b0 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65 65 20  nd of the btree 
287c0 61 6e 64 20 73 6f 20 6e 6f 20 63 68 61 6e 67 65  and so no change
287d0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 0a 2a 2a  s are made to.**
287e0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a   the cursor..*/.
287f0 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20 7b 20  case OP_Last: { 
28800 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
28810 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
28820 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  pC;.  BtCursor *
28830 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65 73  pCrsr;.  int res
28840 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
28850 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
28860 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
28870 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
28880 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
28890 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
288a0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
288b0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
288c0 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  REE );.  pCrsr =
288d0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
288e0 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61 73  .  res = 0;.  as
288f0 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29  sert( pCrsr!=0 )
28900 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
28910 6c 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 23 69  lt = pOp->p3;.#i
28920 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
28930 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d  G.  pC->seekOp =
28940 20 4f 50 5f 4c 61 73 74 3b 0a 23 65 6e 64 69 66   OP_Last;.#endif
28950 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3d 3d  .  if( pOp->p3==
28960 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 74 72  0 || !sqlite3Btr
28970 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
28980 4e 28 70 43 72 73 72 29 20 29 7b 0a 20 20 20 20  N(pCrsr) ){.    
28990 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
289a0 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26 72 65  eLast(pCrsr, &re
289b0 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c  s);.    pC->null
289c0 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a 20  Row = (u8)res;. 
289d0 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
289e0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
289f0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
28a00 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
28a10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28a20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
28a30 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  or;.    if( pOp-
28a40 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 56  >p2>0 ){.      V
28a50 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72  dbeBranchTaken(r
28a60 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20 20 20  es!=0,2);.      
28a70 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
28a80 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d  ump_to_p2;.    }
28a90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
28aa0 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 30  sert( pOp->p2==0
28ab0 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b   );.  }.  break;
28ac0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
28ad0 66 53 6d 61 6c 6c 65 72 20 50 31 20 50 32 20 50  fSmaller P1 P2 P
28ae0 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69  3 * *.**.** Esti
28af0 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
28b00 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
28b10 61 62 6c 65 20 50 31 2e 20 20 4a 75 6d 70 20 74  able P1.  Jump t
28b20 6f 20 50 32 20 69 66 20 74 68 61 74 0a 2a 2a 20  o P2 if that.** 
28b30 65 73 74 69 6d 61 74 65 20 69 73 20 6c 65 73 73  estimate is less
28b40 20 74 68 61 6e 20 61 70 70 72 6f 78 69 6d 61 74   than approximat
28b50 65 6c 79 20 32 2a 2a 28 30 2e 31 2a 50 33 29 2e  ely 2**(0.1*P3).
28b60 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 53 6d  .*/.case OP_IfSm
28b70 61 6c 6c 65 72 3a 20 7b 20 20 20 20 20 20 20 20  aller: {        
28b80 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62  /* jump */.  Vdb
28b90 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
28ba0 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a  tCursor *pCrsr;.
28bb0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 36 34    int res;.  i64
28bc0 20 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   sz;..  assert( 
28bd0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
28be0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
28bf0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
28c00 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
28c10 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
28c20 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75  .  pCrsr = pC->u
28c30 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73  c.pCursor;.  ass
28c40 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20  ert( pCrsr );.  
28c50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
28c60 65 46 69 72 73 74 28 70 43 72 73 72 2c 20 26 72  eFirst(pCrsr, &r
28c70 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
28c80 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
28c90 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72  o_error;.  if( r
28ca0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  es==0 ){.    sz 
28cb0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
28cc0 77 43 6f 75 6e 74 45 73 74 28 70 43 72 73 72 29  wCountEst(pCrsr)
28cd0 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
28ce0 28 73 7a 3e 3d 30 29 20 26 26 20 73 71 6c 69 74  (sz>=0) && sqlit
28cf0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 73 7a  e3LogEst((u64)sz
28d00 29 3c 70 4f 70 2d 3e 70 33 20 29 20 72 65 73 20  )<pOp->p3 ) res 
28d10 3d 20 31 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42  = 1;.  }.  VdbeB
28d20 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
28d30 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
28d40 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
28d50 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  2;.  break;.}...
28d60 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
28d70 72 53 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20  rSort P1 P2 * * 
28d80 2a 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c  *.**.** After al
28d90 6c 20 72 65 63 6f 72 64 73 20 68 61 76 65 20 62  l records have b
28da0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
28db0 6f 20 74 68 65 20 53 6f 72 74 65 72 20 6f 62 6a  o the Sorter obj
28dc0 65 63 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ect.** identifie
28dd0 64 20 62 79 20 50 31 2c 20 69 6e 76 6f 6b 65 20  d by P1, invoke 
28de0 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 61  this opcode to a
28df0 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 73  ctually do the s
28e00 6f 72 74 69 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20  orting..** Jump 
28e10 74 6f 20 50 32 20 69 66 20 74 68 65 72 65 20 61  to P2 if there a
28e20 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 74 6f  re no records to
28e30 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a   be sorted..**.*
28e40 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73  * This opcode is
28e50 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 4f 50   an alias for OP
28e60 5f 53 6f 72 74 20 61 6e 64 20 4f 50 5f 52 65 77  _Sort and OP_Rew
28e70 69 6e 64 20 74 68 61 74 20 69 73 20 75 73 65 64  ind that is used
28e80 0a 2a 2a 20 66 6f 72 20 53 6f 72 74 65 72 20 6f  .** for Sorter o
28e90 62 6a 65 63 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70  bjects..*/./* Op
28ea0 63 6f 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32  code: Sort P1 P2
28eb0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
28ec0 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78  s opcode does ex
28ed0 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74  actly the same t
28ee0 68 69 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e  hing as OP_Rewin
28ef0 64 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  d except that.**
28f00 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61   it increments a
28f10 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67  n undocumented g
28f20 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75  lobal variable u
28f30 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e  sed for testing.
28f40 0a 2a 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69  .**.** Sorting i
28f50 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62  s accomplished b
28f60 79 20 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64  y writing record
28f70 73 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  s into a sorting
28f80 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
28f90 72 65 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69  rewinding that i
28fa0 6e 64 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67  ndex and playing
28fb0 20 69 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65   it back from be
28fc0 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e  ginning to.** en
28fd0 64 2e 20 20 57 65 20 75 73 65 20 74 68 65 20 4f  d.  We use the O
28fe0 50 5f 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e  P_Sort opcode in
28ff0 73 74 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69  stead of OP_Rewi
29000 6e 64 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20  nd to do the.** 
29010 72 65 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61  rewinding so tha
29020 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72  t the global var
29030 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e  iable will be in
29040 63 72 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a  cremented and.**
29050 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
29060 73 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20  s can determine 
29070 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
29080 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a  he optimizer is.
29090 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74  ** correctly opt
290a0 69 6d 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74  imizing out sort
290b0 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  s..*/.case OP_So
290c0 72 74 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20  rterSort:    /* 
290d0 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
290e0 53 6f 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  Sort: {        /
290f0 2a 20 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66  * jump */.#ifdef
29100 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
29110 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
29120 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t++;.  sqlite3_s
29130 65 61 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23  earch_count--;.#
29140 65 6e 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e  endif.  p->aCoun
29150 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53  ter[SQLITE_STMTS
29160 54 41 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20  TATUS_SORT]++;. 
29170 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
29180 20 69 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20   into OP_Rewind 
29190 2a 2f 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  */.}./* Opcode: 
291a0 52 65 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a  Rewind P1 P2 * *
291b0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78   *.**.** The nex
291c0 74 20 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77  t use of the Row
291d0 69 64 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20  id or Column or 
291e0 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  Next instruction
291f0 20 66 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c   for P1 .** will
29200 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 66 69   refer to the fi
29210 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
29220 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
29230 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20  or index..** If 
29240 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
29250 65 78 20 69 73 20 65 6d 70 74 79 2c 20 6a 75 6d  ex is empty, jum
29260 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
29270 20 50 32 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74   P2..** If the t
29280 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
29290 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
292a0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
292b0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e  following .** in
292c0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
292d0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
292e0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
292f0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
29300 65 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64  e in forward ord
29310 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
29320 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64  beginning toward
29330 20 74 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74   the end.  In ot
29340 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
29350 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
29360 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65  igured to use Ne
29370 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f  xt, not Prev..*/
29380 0a 63 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a  .case OP_Rewind:
29390 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
293a0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
293b0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
293c0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
293d0 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
293e0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
293f0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
29400 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
29410 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
29420 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
29430 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f 72  .  assert( isSor
29440 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f  ter(pC)==(pOp->o
29450 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
29460 53 6f 72 74 29 20 29 3b 0a 20 20 72 65 73 20 3d  Sort) );.  res =
29470 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
29480 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65  E_DEBUG.  pC->se
29490 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
294a0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
294b0 73 53 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20  sSorter(pC) ){. 
294c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
294d0 64 62 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28  dbeSorterRewind(
294e0 70 43 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c  pC, &res);.  }el
294f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
29500 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
29510 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
29520 20 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75     pCrsr = pC->u
29530 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 61  c.pCursor;.    a
29540 73 73 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a  ssert( pCrsr );.
29550 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29560 42 74 72 65 65 46 69 72 73 74 28 70 43 72 73 72  BtreeFirst(pCrsr
29570 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d  , &res);.    pC-
29580 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
29590 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
295a0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
295b0 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66  _STALE;.  }.  if
295c0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
295d0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
295e0 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
295f0 28 75 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72  (u8)res;.  asser
29600 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  t( pOp->p2>0 && 
29610 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29  pOp->p2<p->nOp )
29620 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
29630 6b 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20  ken(res!=0,2);. 
29640 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20   if( res ) goto 
29650 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
29660 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
29670 65 3a 20 4e 65 78 74 20 50 31 20 50 32 20 50 33  e: Next P1 P2 P3
29680 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76   P4 P5.**.** Adv
29690 61 6e 63 65 20 63 75 72 73 6f 72 20 50 31 20 73  ance cursor P1 s
296a0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
296b0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79   to the next key
296c0 2f 64 61 74 61 20 70 61 69 72 20 69 6e 20 69 74  /data pair in it
296d0 73 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  s.** table or in
296e0 64 65 78 2e 20 20 49 66 20 74 68 65 72 65 20 61  dex.  If there a
296f0 72 65 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f 76  re no more key/v
29700 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e 20  alue pairs then 
29710 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20  fall through.** 
29720 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
29730 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42   instruction.  B
29740 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ut if the cursor
29750 20 61 64 76 61 6e 63 65 20 77 61 73 20 73 75 63   advance was suc
29760 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
29770 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
29780 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65  P2..**.** The Ne
29790 78 74 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c  xt opcode is onl
297a0 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e  y valid followin
297b0 67 20 61 6e 20 53 65 65 6b 47 54 2c 20 53 65 65  g an SeekGT, See
297c0 6b 47 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65  kGE, or.** OP_Re
297d0 77 69 6e 64 20 6f 70 63 6f 64 65 20 75 73 65 64  wind opcode used
297e0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
297f0 20 63 75 72 73 6f 72 2e 20 20 4e 65 78 74 20 69   cursor.  Next i
29800 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s not allowed.**
29810 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c   to follow SeekL
29820 54 2c 20 53 65 65 6b 4c 45 2c 20 6f 72 20 4f 50  T, SeekLE, or OP
29830 5f 4c 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _Last..**.** The
29840 20 50 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20   P1 cursor must 
29850 62 65 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61  be for a real ta
29860 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64  ble, not a pseud
29870 6f 2d 74 61 62 6c 65 2e 20 20 50 31 20 6d 75 73  o-table.  P1 mus
29880 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 6f  t have.** been o
29890 70 65 6e 65 64 20 70 72 69 6f 72 20 74 6f 20 74  pened prior to t
298a0 68 69 73 20 6f 70 63 6f 64 65 20 6f 72 20 74 68  his opcode or th
298b0 65 20 70 72 6f 67 72 61 6d 20 77 69 6c 6c 20 73  e program will s
298c0 65 67 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54  egfault..**.** T
298d0 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 61  he P3 value is a
298e0 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72   hint to the btr
298f0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
29900 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61  n. If P3==1, tha
29910 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73  t.** means P1 is
29920 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
29930 64 20 74 68 61 74 20 74 68 69 73 20 69 6e 73 74  d that this inst
29940 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  ruction could ha
29950 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74  ve been.** omitt
29960 65 64 20 69 66 20 74 68 61 74 20 69 6e 64 65 78  ed if that index
29970 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65   had been unique
29980 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79  .  P3 is usually
29990 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c   0.  P3 is.** al
299a0 77 61 79 73 20 65 69 74 68 65 72 20 30 20 6f 72  ways either 0 or
299b0 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20   1..**.** P4 is 
299c0 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50  always of type P
299d0 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66  4_ADVANCE. The f
299e0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
299f0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c  points to.** sql
29a00 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
29a10 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
29a20 70 6f 73 69 74 69 76 65 20 61 6e 64 20 74 68 65  positive and the
29a30 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20   jump is taken, 
29a40 74 68 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74  then event count
29a50 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d  er.** number P5-
29a60 31 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  1 in the prepare
29a70 64 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69  d statement is i
29a80 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
29a90 2a 20 53 65 65 20 61 6c 73 6f 3a 20 50 72 65 76  * See also: Prev
29aa0 2c 20 4e 65 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a  , NextIfOpen.*/.
29ab0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 49  /* Opcode: NextI
29ac0 66 4f 70 65 6e 20 50 31 20 50 32 20 50 33 20 50  fOpen P1 P2 P3 P
29ad0 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4 P5.**.** This 
29ae0 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73  opcode works jus
29af0 74 20 6c 69 6b 65 20 4e 65 78 74 20 65 78 63 65  t like Next exce
29b00 70 74 20 74 68 61 74 20 69 66 20 63 75 72 73 6f  pt that if curso
29b10 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f  r P1 is not.** o
29b20 70 65 6e 20 69 74 20 62 65 68 61 76 65 73 20 61  pen it behaves a
29b30 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70   no-op..*/./* Op
29b40 63 6f 64 65 3a 20 50 72 65 76 20 50 31 20 50 32  code: Prev P1 P2
29b50 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
29b60 42 61 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50  Back up cursor P
29b70 31 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  1 so that it poi
29b80 6e 74 73 20 74 6f 20 74 68 65 20 70 72 65 76 69  nts to the previ
29b90 6f 75 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69  ous key/data pai
29ba0 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c  r in its.** tabl
29bb0 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20  e or index.  If 
29bc0 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76  there is no prev
29bd0 69 6f 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70  ious key/value p
29be0 61 69 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74  airs then fall t
29bf0 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65  hrough.** to the
29c00 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72   following instr
29c10 75 63 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20  uction.  But if 
29c20 74 68 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75  the cursor backu
29c30 70 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  p was successful
29c40 2c 0a 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69  ,.** jump immedi
29c50 61 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a  ately to P2..**.
29c60 2a 2a 0a 2a 2a 20 54 68 65 20 50 72 65 76 20 6f  **.** The Prev o
29c70 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61  pcode is only va
29c80 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  lid following an
29c90 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c   SeekLT, SeekLE,
29ca0 20 6f 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f   or.** OP_Last o
29cb0 70 63 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f  pcode used to po
29cc0 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
29cd0 72 2e 20 20 50 72 65 76 20 69 73 20 6e 6f 74 20  r.  Prev is not 
29ce0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f  allowed.** to fo
29cf0 6c 6c 6f 77 20 53 65 65 6b 47 54 2c 20 53 65 65  llow SeekGT, See
29d00 6b 47 45 2c 20 6f 72 20 4f 50 5f 52 65 77 69 6e  kGE, or OP_Rewin
29d10 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20  d..**.** The P1 
29d20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66  cursor must be f
29d30 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c  or a real table,
29d40 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61   not a pseudo-ta
29d50 62 6c 65 2e 20 20 49 66 20 50 31 20 69 73 0a 2a  ble.  If P1 is.*
29d60 2a 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 6e 20  * not open then 
29d70 74 68 65 20 62 65 68 61 76 69 6f 72 20 69 73 20  the behavior is 
29d80 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  undefined..**.**
29d90 20 54 68 65 20 50 33 20 76 61 6c 75 65 20 69 73   The P3 value is
29da0 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62   a hint to the b
29db0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
29dc0 69 6f 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74  ion. If P3==1, t
29dd0 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20  hat.** means P1 
29de0 69 73 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  is an SQL index 
29df0 61 6e 64 20 74 68 61 74 20 74 68 69 73 20 69 6e  and that this in
29e00 73 74 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20  struction could 
29e10 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69  have been.** omi
29e20 74 74 65 64 20 69 66 20 74 68 61 74 20 69 6e 64  tted if that ind
29e30 65 78 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71  ex had been uniq
29e40 75 65 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c  ue.  P3 is usual
29e50 6c 79 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20  ly 0.  P3 is.** 
29e60 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 30 20  always either 0 
29e70 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69  or 1..**.** P4 i
29e80 73 20 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65  s always of type
29e90 20 50 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65   P4_ADVANCE. The
29ea0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
29eb0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73  r points to.** s
29ec0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
29ed0 6f 75 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ous()..**.** If 
29ee0 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20 61  P5 is positive a
29ef0 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  nd the jump is t
29f00 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74  aken, then event
29f10 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62   counter.** numb
29f20 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70  er P5-1 in the p
29f30 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
29f40 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
29f50 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
29f60 50 72 65 76 49 66 4f 70 65 6e 20 50 31 20 50 32  PrevIfOpen P1 P2
29f70 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
29f80 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
29f90 73 20 6a 75 73 74 20 6c 69 6b 65 20 50 72 65 76  s just like Prev
29fa0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
29fb0 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e 6f 74  cursor P1 is not
29fc0 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65 68 61  .** open it beha
29fd0 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  ves a no-op..*/.
29fe0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65  /* Opcode: Sorte
29ff0 72 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20  rNext P1 P2 * * 
2a000 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P5.**.** This op
2a010 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  code works just 
2a020 6c 69 6b 65 20 4f 50 5f 4e 65 78 74 20 65 78 63  like OP_Next exc
2a030 65 70 74 20 74 68 61 74 20 50 31 20 6d 75 73 74  ept that P1 must
2a040 20 62 65 20 61 0a 2a 2a 20 73 6f 72 74 65 72 20   be a.** sorter 
2a050 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69 63 68  object for which
2a060 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f   the OP_SorterSo
2a070 72 74 20 6f 70 63 6f 64 65 20 68 61 73 20 62 65  rt opcode has be
2a080 65 6e 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20  en.** invoked.  
2a090 54 68 69 73 20 6f 70 63 6f 64 65 20 61 64 76 61  This opcode adva
2a0a0 6e 63 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  nces the cursor 
2a0b0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 6f 72 74  to the next sort
2a0c0 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72  ed.** record, or
2a0d0 20 6a 75 6d 70 73 20 74 6f 20 50 32 20 69 66 20   jumps to P2 if 
2a0e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
2a0f0 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 73  e sorted records
2a100 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72  ..*/.case OP_Sor
2a110 74 65 72 4e 65 78 74 3a 20 7b 20 20 2f 2a 20 6a  terNext: {  /* j
2a120 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ump */.  VdbeCur
2a130 73 6f 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72  sor *pC;.  int r
2a140 65 73 3b 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61  es;..  pC = p->a
2a150 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2a160 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
2a170 72 28 70 43 29 20 29 3b 0a 20 20 72 65 73 20 3d  r(pC) );.  res =
2a180 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
2a190 65 33 56 64 62 65 53 6f 72 74 65 72 4e 65 78 74  e3VdbeSorterNext
2a1a0 28 64 62 2c 20 70 43 2c 20 26 72 65 73 29 3b 0a  (db, pC, &res);.
2a1b0 20 20 67 6f 74 6f 20 6e 65 78 74 5f 74 61 69 6c    goto next_tail
2a1c0 3b 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66  ;.case OP_PrevIf
2a1d0 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75 6d 70  Open:    /* jump
2a1e0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74   */.case OP_Next
2a1f0 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75  IfOpen:    /* ju
2a200 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61  mp */.  if( p->a
2a210 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3d 3d 30  pCsr[pOp->p1]==0
2a220 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a 20 46   ) break;.  /* F
2a230 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 63  all through */.c
2a240 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20 20 20  ase OP_Prev:    
2a250 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2a260 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 20 20  .case OP_Next:  
2a270 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2a280 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
2a290 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2a2a0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2a2b0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a2c0 70 35 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  p5<ArraySize(p->
2a2d0 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20 20 70  aCounter) );.  p
2a2e0 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2a2f0 2d 3e 70 31 5d 3b 0a 20 20 72 65 73 20 3d 20 70  ->p1];.  res = p
2a300 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74  Op->p3;.  assert
2a310 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
2a320 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
2a330 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
2a340 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2a350 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2a360 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
2a370 20 72 65 73 3d 3d 30 20 7c 7c 20 28 72 65 73 3d   res==0 || (res=
2a380 3d 31 20 26 26 20 70 43 2d 3e 69 73 54 61 62 6c  =1 && pC->isTabl
2a390 65 3d 3d 30 29 20 29 3b 0a 20 20 74 65 73 74 63  e==0) );.  testc
2a3a0 61 73 65 28 20 72 65 73 3d 3d 31 20 29 3b 0a 20  ase( res==1 );. 
2a3b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2a3c0 63 6f 64 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c  code!=OP_Next ||
2a3d0 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
2a3e0 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 4e  e==sqlite3BtreeN
2a3f0 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ext );.  assert(
2a400 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50   pOp->opcode!=OP
2a410 5f 50 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 70 34  _Prev || pOp->p4
2a420 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74  .xAdvance==sqlit
2a430 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 20  e3BtreePrevious 
2a440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2a450 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78  ->opcode!=OP_Nex
2a460 74 49 66 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e  tIfOpen || pOp->
2a470 70 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c  p4.xAdvance==sql
2a480 69 74 65 33 42 74 72 65 65 4e 65 78 74 20 29 3b  ite3BtreeNext );
2a490 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a4a0 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 49  opcode!=OP_PrevI
2a4b0 66 4f 70 65 6e 20 7c 7c 20 70 4f 70 2d 3e 70 34  fOpen || pOp->p4
2a4c0 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74  .xAdvance==sqlit
2a4d0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 29  e3BtreePrevious)
2a4e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4e 65 78 74  ;..  /* The Next
2a4f0 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
2a500 75 73 65 64 20 61 66 74 65 72 20 53 65 65 6b 47  used after SeekG
2a510 54 2c 20 53 65 65 6b 47 45 2c 20 61 6e 64 20 52  T, SeekGE, and R
2a520 65 77 69 6e 64 2e 0a 20 20 2a 2a 20 54 68 65 20  ewind..  ** The 
2a530 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73 20 6f  Prev opcode is o
2a540 6e 6c 79 20 75 73 65 64 20 61 66 74 65 72 20 53  nly used after S
2a550 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 61  eekLT, SeekLE, a
2a560 6e 64 20 4c 61 73 74 2e 20 2a 2f 0a 20 20 61 73  nd Last. */.  as
2a570 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2a580 65 21 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 70 4f  e!=OP_Next || pO
2a590 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65  p->opcode!=OP_Ne
2a5a0 78 74 49 66 4f 70 65 6e 0a 20 20 20 20 20 20 20  xtIfOpen.       
2a5b0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2a5c0 50 5f 53 65 65 6b 47 54 20 7c 7c 20 70 43 2d 3e  P_SeekGT || pC->
2a5d0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47  seekOp==OP_SeekG
2a5e0 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e  E.       || pC->
2a5f0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e  seekOp==OP_Rewin
2a600 64 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d  d || pC->seekOp=
2a610 3d 4f 50 5f 46 6f 75 6e 64 29 3b 0a 20 20 61 73  =OP_Found);.  as
2a620 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2a630 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20 70 4f  e!=OP_Prev || pO
2a640 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72  p->opcode!=OP_Pr
2a650 65 76 49 66 4f 70 65 6e 0a 20 20 20 20 20 20 20  evIfOpen.       
2a660 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
2a670 50 5f 53 65 65 6b 4c 54 20 7c 7c 20 70 43 2d 3e  P_SeekLT || pC->
2a680 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  seekOp==OP_SeekL
2a690 45 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e  E.       || pC->
2a6a0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 4c 61 73 74 20  seekOp==OP_Last 
2a6b0 29 3b 0a 0a 20 20 72 63 20 3d 20 70 4f 70 2d 3e  );..  rc = pOp->
2a6c0 70 34 2e 78 41 64 76 61 6e 63 65 28 70 43 2d 3e  p4.xAdvance(pC->
2a6d0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  uc.pCursor, &res
2a6e0 29 3b 0a 6e 65 78 74 5f 74 61 69 6c 3a 0a 20 20  );.next_tail:.  
2a6f0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
2a700 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
2a710 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
2a720 28 72 65 73 3d 3d 30 2c 32 29 3b 0a 20 20 69 66  (res==0,2);.  if
2a730 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2a740 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2a750 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
2a760 20 20 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20      pC->nullRow 
2a770 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 75  = 0;.    p->aCou
2a780 6e 74 65 72 5b 70 4f 70 2d 3e 70 35 5d 2b 2b 3b  nter[pOp->p5]++;
2a790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2a7a0 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
2a7b0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
2a7c0 23 65 6e 64 69 66 0a 20 20 20 20 67 6f 74 6f 20  #endif.    goto 
2a7d0 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63  jump_to_p2_and_c
2a7e0 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
2a7f0 70 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  pt;.  }else{.   
2a800 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31   pC->nullRow = 1
2a810 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63 68 65  ;.  }.  goto che
2a820 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74  ck_for_interrupt
2a830 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2a840 49 64 78 49 6e 73 65 72 74 20 50 31 20 50 32 20  IdxInsert P1 P2 
2a850 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
2a860 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a  psis: key=r[P2].
2a870 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50  **.** Register P
2a880 32 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69  2 holds an SQL i
2a890 6e 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73  ndex key made us
2a8a0 69 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52  ing the.** MakeR
2a8b0 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f  ecord instructio
2a8c0 6e 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  ns.  This opcode
2a8d0 20 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79   writes that key
2a8e0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  .** into the ind
2a8f0 65 78 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72  ex P1.  Data for
2a900 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69   the entry is ni
2a910 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69  l..**.** If P4 i
2a920 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
2a930 20 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65   it is the numbe
2a940 72 20 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 74  r of values in t
2a950 68 65 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b  he unpacked.** k
2a960 65 79 20 6f 66 20 72 65 67 28 50 32 29 2e 20 20  ey of reg(P2).  
2a970 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 50 33  In that case, P3
2a980 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
2a990 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
2a9a0 74 65 72 0a 2a 2a 20 66 6f 72 20 74 68 65 20 75  ter.** for the u
2a9b0 6e 70 61 63 6b 65 64 20 6b 65 79 2e 20 20 54 68  npacked key.  Th
2a9c0 65 20 61 76 61 69 6c 61 62 69 6c 69 74 79 20 6f  e availability o
2a9d0 66 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b  f the unpacked k
2a9e0 65 79 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73  ey can sometimes
2a9f0 0a 2a 2a 20 62 65 20 61 6e 20 6f 70 74 69 6d 69  .** be an optimi
2aa00 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  zation..**.** If
2aa10 20 50 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c   P5 has the OPFL
2aa20 41 47 5f 41 50 50 45 4e 44 20 62 69 74 20 73 65  AG_APPEND bit se
2aa30 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
2aa40 74 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  t to the b-tree 
2aa50 6c 61 79 65 72 0a 2a 2a 20 74 68 61 74 20 74 68  layer.** that th
2aa60 69 73 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b  is insert is lik
2aa70 65 6c 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70  ely to be an app
2aa80 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  end..**.** If P5
2aa90 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f   has the OPFLAG_
2aaa0 4e 43 48 41 4e 47 45 20 62 69 74 20 73 65 74 2c  NCHANGE bit set,
2aab0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
2aac0 20 63 6f 75 6e 74 65 72 20 69 73 0a 2a 2a 20 69   counter is.** i
2aad0 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
2aae0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
2aaf0 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e   If the OPFLAG_N
2ab00 43 48 41 4e 47 45 20 62 69 74 20 69 73 20 63 6c  CHANGE bit is cl
2ab10 65 61 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ear,.** then the
2ab20 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2ab30 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
2ab40 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
2ab50 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20  G_USESEEKRESULT 
2ab60 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65  flag of P5 is se
2ab70 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  t, the implement
2ab80 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72  ation might.** r
2ab90 75 6e 20 66 61 73 74 65 72 20 62 79 20 61 76 6f  un faster by avo
2aba0 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73  iding an unneces
2abb0 73 61 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72  sary seek on cur
2abc0 73 6f 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72  sor P1.  However
2abd0 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f  ,.** the OPFLAG_
2abe0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
2abf0 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20  ag must only be 
2ac00 73 65 74 20 69 66 20 74 68 65 72 65 20 68 61 76  set if there hav
2ac10 65 20 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a  e been no prior.
2ac20 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20  ** seeks on the 
2ac30 63 75 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65  cursor or if the
2ac40 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65   most recent see
2ac50 6b 20 75 73 65 64 20 61 20 6b 65 79 20 65 71 75  k used a key equ
2ac60 69 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20 50 32  ivalent.** to P2
2ac70 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  . .**.** This in
2ac80 73 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77  struction only w
2ac90 6f 72 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73  orks for indices
2aca0 2e 20 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e  .  The equivalen
2acb0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  t instruction.**
2acc0 20 66 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f   for tables is O
2acd0 50 5f 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20  P_Insert..*/./* 
2ace0 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 49 6e  Opcode: SorterIn
2acf0 73 65 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  sert P1 P2 * * *
2ad00 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
2ad10 79 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65  y=r[P2].**.** Re
2ad20 67 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20  gister P2 holds 
2ad30 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79  an SQL index key
2ad40 20 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a   made using the.
2ad50 2a 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e  ** MakeRecord in
2ad60 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69  structions.  Thi
2ad70 73 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20  s opcode writes 
2ad80 74 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f  that key.** into
2ad90 20 74 68 65 20 73 6f 72 74 65 72 20 50 31 2e 20   the sorter P1. 
2ada0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e   Data for the en
2adb0 74 72 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63  try is nil..*/.c
2adc0 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  ase OP_SorterIns
2add0 65 72 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e  ert:       /* in
2ade0 32 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78  2 */.case OP_Idx
2adf0 49 6e 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20  Insert: {       
2ae00 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62   /* in2 */.  Vdb
2ae10 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42  eCursor *pC;.  B
2ae20 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 0a 0a  treePayload x;..
2ae30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2ae40 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2ae50 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
2ae60 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
2ae70 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2ae80 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
2ae90 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
2aea0 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  )==(pOp->opcode=
2aeb0 3d 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74  =OP_SorterInsert
2aec0 29 20 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61  ) );.  pIn2 = &a
2aed0 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  Mem[pOp->p2];.  
2aee0 61 73 73 65 72 74 28 20 70 49 6e 32 2d 3e 66 6c  assert( pIn2->fl
2aef0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
2af00 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20  ;.  if( pOp->p5 
2af10 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45  & OPFLAG_NCHANGE
2af20 20 29 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b   ) p->nChange++;
2af30 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
2af40 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2af50 5f 42 54 52 45 45 20 7c 7c 20 70 4f 70 2d 3e 6f  _BTREE || pOp->o
2af60 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72  pcode==OP_Sorter
2af70 49 6e 73 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Insert );.  asse
2af80 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c 65 3d  rt( pC->isTable=
2af90 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 45 78 70  =0 );.  rc = Exp
2afa0 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 3b 0a 20  andBlob(pIn2);. 
2afb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2afc0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2afd0 72 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  r;.  if( pOp->op
2afe0 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49  code==OP_SorterI
2aff0 6e 73 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  nsert ){.    rc 
2b000 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
2b010 74 65 72 57 72 69 74 65 28 70 43 2c 20 70 49 6e  terWrite(pC, pIn
2b020 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2);.  }else{.   
2b030 20 78 2e 6e 4b 65 79 20 3d 20 70 49 6e 32 2d 3e   x.nKey = pIn2->
2b040 6e 3b 0a 20 20 20 20 78 2e 70 4b 65 79 20 3d 20  n;.    x.pKey = 
2b050 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20 20 78 2e 61  pIn2->z;.    x.a
2b060 4d 65 6d 20 3d 20 61 4d 65 6d 20 2b 20 70 4f 70  Mem = aMem + pOp
2b070 2d 3e 70 33 3b 0a 20 20 20 20 78 2e 6e 4d 65 6d  ->p3;.    x.nMem
2b080 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e   = (u16)pOp->p4.
2b090 69 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  i;.    rc = sqli
2b0a0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 70  te3BtreeInsert(p
2b0b0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
2b0c0 78 2c 0a 20 20 20 20 20 20 20 20 20 28 70 4f 70  x,.         (pOp
2b0d0 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 41  ->p5 & (OPFLAG_A
2b0e0 50 50 45 4e 44 7c 4f 50 46 4c 41 47 5f 53 41 56  PPEND|OPFLAG_SAV
2b0f0 45 50 4f 53 49 54 49 4f 4e 29 29 2c 20 0a 20 20  EPOSITION)), .  
2b100 20 20 20 20 20 20 28 28 70 4f 70 2d 3e 70 35 20        ((pOp->p5 
2b110 26 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  & OPFLAG_USESEEK
2b120 52 45 53 55 4c 54 29 20 3f 20 70 43 2d 3e 73 65  RESULT) ? pC->se
2b130 65 6b 52 65 73 75 6c 74 20 3a 20 30 29 0a 20 20  ekResult : 0).  
2b140 20 20 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73        );.    ass
2b150 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
2b160 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
2b170 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
2b180 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
2b190 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 29 20 67  .  }.  if( rc) g
2b1a0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2b1b0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
2b1c0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .}../* Opcode: I
2b1d0 64 78 44 65 6c 65 74 65 20 50 31 20 50 32 20 50  dxDelete P1 P2 P
2b1e0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
2b1f0 73 3a 20 6b 65 79 3d 72 5b 50 32 40 50 33 5d 0a  s: key=r[P2@P3].
2b200 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
2b210 74 20 6f 66 20 50 33 20 72 65 67 69 73 74 65 72  t of P3 register
2b220 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  s starting at re
2b230 67 69 73 74 65 72 20 50 32 20 66 6f 72 6d 0a 2a  gister P2 form.*
2b240 2a 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  * an unpacked in
2b250 64 65 78 20 6b 65 79 2e 20 54 68 69 73 20 6f 70  dex key. This op
2b260 63 6f 64 65 20 72 65 6d 6f 76 65 73 20 74 68 61  code removes tha
2b270 74 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  t entry from the
2b280 20 0a 2a 2a 20 69 6e 64 65 78 20 6f 70 65 6e 65   .** index opene
2b290 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 2e 0a  d by cursor P1..
2b2a0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 44 65  */.case OP_IdxDe
2b2b0 6c 65 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75  lete: {.  VdbeCu
2b2c0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
2b2d0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 69  rsor *pCrsr;.  i
2b2e0 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
2b2f0 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20 61  edRecord r;..  a
2b300 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
2b310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2b320 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p2>0 && pOp->
2b330 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  p2+pOp->p3<=(p->
2b340 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
2b350 73 6f 72 29 2b 31 20 29 3b 0a 20 20 61 73 73 65  sor)+1 );.  asse
2b360 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
2b370 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
2b380 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
2b390 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2b3a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
2b3b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b3c0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
2b3d0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
2b3e0 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70  pCrsr = pC->uc.p
2b3f0 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
2b400 28 20 70 43 72 73 72 21 3d 30 20 29 3b 0a 20 20  ( pCrsr!=0 );.  
2b410 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d  assert( pOp->p5=
2b420 3d 30 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49 6e  =0 );.  r.pKeyIn
2b430 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66  fo = pC->pKeyInf
2b440 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  o;.  r.nField = 
2b450 28 75 31 36 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  (u16)pOp->p3;.  
2b460 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  r.default_rc = 0
2b470 3b 0a 20 20 72 2e 61 4d 65 6d 20 3d 20 26 61 4d  ;.  r.aMem = &aM
2b480 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 72  em[pOp->p2];.  r
2b490 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b4a0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
2b4b0 43 72 73 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20  Crsr, &r, 0, 0, 
2b4c0 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
2b4d0 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
2b4e0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
2b4f0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72   res==0 ){.    r
2b500 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b510 44 65 6c 65 74 65 28 70 43 72 73 72 2c 20 42 54  Delete(pCrsr, BT
2b520 52 45 45 5f 41 55 58 44 45 4c 45 54 45 29 3b 0a  REE_AUXDELETE);.
2b530 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b540 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2b550 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
2b560 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65 64  rt( pC->deferred
2b570 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20 70  Moveto==0 );.  p
2b580 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
2b590 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
2b5a0 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d  pC->seekResult =
2b5b0 20 30 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a   0;.  break;.}..
2b5c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 20  /* Opcode: Seek 
2b5d0 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a 2a 20  P1 * P3 P4 *.** 
2b5e0 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65 20 50  Synopsis: Move P
2b5f0 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 0a 2a 2a  3 to P1.rowid.**
2b600 0a 2a 2a 20 50 31 20 69 73 20 61 6e 20 6f 70 65  .** P1 is an ope
2b610 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 61  n index cursor a
2b620 6e 64 20 50 33 20 69 73 20 61 20 63 75 72 73 6f  nd P3 is a curso
2b630 72 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70  r on the corresp
2b640 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e  onding.** table.
2b650 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 64 6f    This opcode do
2b660 65 73 20 61 20 64 65 66 65 72 72 65 64 20 73 65  es a deferred se
2b670 65 6b 20 6f 66 20 74 68 65 20 50 33 20 74 61 62  ek of the P3 tab
2b680 6c 65 20 63 75 72 73 6f 72 0a 2a 2a 20 74 6f 20  le cursor.** to 
2b690 74 68 65 20 72 6f 77 20 74 68 61 74 20 63 6f 72  the row that cor
2b6a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
2b6b0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 50  current row of P
2b6c0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  1..**.** This is
2b6d0 20 61 20 64 65 66 65 72 72 65 64 20 73 65 65 6b   a deferred seek
2b6e0 2e 20 20 4e 6f 74 68 69 6e 67 20 61 63 74 75 61  .  Nothing actua
2b6f0 6c 6c 79 20 68 61 70 70 65 6e 73 20 75 6e 74 69  lly happens unti
2b700 6c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  l.** the cursor 
2b710 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
2b720 61 20 72 65 63 6f 72 64 2e 20 20 54 68 61 74 20  a record.  That 
2b730 77 61 79 2c 20 69 66 20 6e 6f 20 72 65 61 64 73  way, if no reads
2b740 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e 6f 20 75 6e  .** occur, no un
2b750 6e 65 63 65 73 73 61 72 79 20 49 2f 4f 20 68 61  necessary I/O ha
2b760 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ppens..**.** P4 
2b770 6d 61 79 20 62 65 20 61 6e 20 61 72 72 61 79 20  may be an array 
2b780 6f 66 20 69 6e 74 65 67 65 72 73 20 28 74 79 70  of integers (typ
2b790 65 20 50 34 5f 49 4e 54 41 52 52 41 59 29 20 63  e P4_INTARRAY) c
2b7a0 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65  ontaining.** one
2b7b0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
2b7c0 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 50 33  column in the P3
2b7d0 20 74 61 62 6c 65 2e 20 20 49 66 20 61 72 72 61   table.  If arra
2b7e0 79 20 65 6e 74 72 79 20 61 28 69 29 0a 2a 2a 20  y entry a(i).** 
2b7f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2b800 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e  n reading column
2b810 20 61 28 69 29 2d 31 20 66 72 6f 6d 20 63 75 72   a(i)-1 from cur
2b820 73 6f 72 20 50 33 20 69 73 20 0a 2a 2a 20 65 71  sor P3 is .** eq
2b830 75 69 76 61 6c 65 6e 74 20 74 6f 20 70 65 72 66  uivalent to perf
2b840 6f 72 6d 69 6e 67 20 74 68 65 20 64 65 66 65 72  orming the defer
2b850 72 65 64 20 73 65 65 6b 20 61 6e 64 20 74 68 65  red seek and the
2b860 6e 20 72 65 61 64 69 6e 67 20 63 6f 6c 75 6d 6e  n reading column
2b870 20 69 20 0a 2a 2a 20 66 72 6f 6d 20 50 31 2e 20   i .** from P1. 
2b880 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2b890 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  n is stored in P
2b8a0 33 20 61 6e 64 20 75 73 65 64 20 74 6f 20 72 65  3 and used to re
2b8b0 64 69 72 65 63 74 0a 2a 2a 20 72 65 61 64 73 20  direct.** reads 
2b8c0 61 67 61 69 6e 73 74 20 50 33 20 6f 76 65 72 20  against P3 over 
2b8d0 74 6f 20 50 31 2c 20 74 68 75 73 20 70 6f 73 73  to P1, thus poss
2b8e0 69 62 6c 79 20 61 76 6f 69 64 69 6e 67 20 74 68  ibly avoiding th
2b8f0 65 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 73 65 65  e need to.** see
2b900 6b 20 61 6e 64 20 72 65 61 64 20 63 75 72 73 6f  k and read curso
2b910 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  r P3..*/./* Opco
2b920 64 65 3a 20 49 64 78 52 6f 77 69 64 20 50 31 20  de: IdxRowid P1 
2b930 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
2b940 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
2b950 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e  d.**.** Write in
2b960 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 61  to register P2 a
2b970 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
2b980 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2b990 79 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20  y in the record 
2b9a0 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  at.** the end of
2b9b0 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 70   the index key p
2b9c0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 75 72  ointed to by cur
2b9d0 73 6f 72 20 50 31 2e 20 20 54 68 69 73 20 69 6e  sor P1.  This in
2b9e0 74 65 67 65 72 20 73 68 6f 75 6c 64 20 62 65 0a  teger should be.
2b9f0 2a 2a 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  ** the rowid of 
2ba00 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
2ba10 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 69 6e  to which this in
2ba20 64 65 78 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  dex entry points
2ba30 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2ba40 3a 20 52 6f 77 69 64 2c 20 4d 61 6b 65 52 65 63  : Rowid, MakeRec
2ba50 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ord..*/.case OP_
2ba60 53 65 65 6b 3a 0a 63 61 73 65 20 4f 50 5f 49 64  Seek:.case OP_Id
2ba70 78 52 6f 77 69 64 3a 20 7b 20 20 20 20 20 20 20  xRowid: {       
2ba80 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
2ba90 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2baa0 70 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pC;             
2bab0 20 20 20 2f 2a 20 54 68 65 20 50 31 20 69 6e 64     /* The P1 ind
2bac0 65 78 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56  ex cursor */.  V
2bad0 64 62 65 43 75 72 73 6f 72 20 2a 70 54 61 62 43  dbeCursor *pTabC
2bae0 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ur;           /*
2baf0 20 54 68 65 20 50 32 20 74 61 62 6c 65 20 63 75   The P2 table cu
2bb00 72 73 6f 72 20 28 4f 50 5f 53 65 65 6b 20 6f 6e  rsor (OP_Seek on
2bb10 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20 72 6f 77  ly) */.  i64 row
2bb20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2bb30 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2bb40 20 74 68 61 74 20 50 31 20 63 75 72 72 65 6e 74   that P1 current
2bb50 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20   points to */.. 
2bb60 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2bb70 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2bb80 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2bb90 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2bba0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2bbb0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2bbc0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2bbd0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2bbe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2bbf0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
2bc00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2bc10 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
2bc20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
2bc30 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
2bc40 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e  .  assert( !pC->
2bc50 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e  nullRow || pOp->
2bc60 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f  opcode==OP_IdxRo
2bc70 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  wid );..  /* The
2bc80 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20 53 65   IdxRowid and Se
2bc90 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65 20 63  ek opcodes are c
2bca0 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73 65 20  ombined because 
2bcb0 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69  of the commonali
2bcc0 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74  ty.  ** of sqlit
2bcd0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2bce0 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ore() and sqlite
2bcf0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 29 2e  3VdbeIdxRowid().
2bd00 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2bd10 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2bd20 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73  ore(pC);..  /* s
2bd30 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f 72 52  qlite3VbeCursorR
2bd40 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c  estore() can onl
2bd50 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 72 65  y fail if the re
2bd60 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20 64 65  cord has been de
2bd70 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66  leted.  ** out f
2bd80 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
2bd90 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69 6c 6c  rsor.  That will
2bda0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73 20 66   never happens f
2bdb0 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64 0a 20  or an IdxRowid. 
2bdc0 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f   ** or Seek opco
2bdd0 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  de */.  if( NEVE
2bde0 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  R(rc!=SQLITE_OK)
2bdf0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2be00 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69  e_to_error;..  i
2be10 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  f( !pC->nullRow 
2be20 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 30  ){.    rowid = 0
2be30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
2be40 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
2be50 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
2be60 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2be70 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
2be80 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43  id(db, pC->uc.pC
2be90 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a  ursor, &rowid);.
2bea0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2beb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2bec0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2bed0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
2bee0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2bef0 65 3d 3d 4f 50 5f 53 65 65 6b 20 29 7b 0a 20 20  e==OP_Seek ){.  
2bf00 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
2bf10 3e 70 33 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p3>=0 && pOp->p
2bf20 33 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  3<p->nCursor );.
2bf30 20 20 20 20 20 20 70 54 61 62 43 75 72 20 3d 20        pTabCur = 
2bf40 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33  p->apCsr[pOp->p3
2bf50 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
2bf60 20 70 54 61 62 43 75 72 21 3d 30 20 29 3b 0a 20   pTabCur!=0 );. 
2bf70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2bf80 62 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d  bCur->eCurType==
2bf90 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
2bfa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2bfb0 54 61 62 43 75 72 2d 3e 75 63 2e 70 43 75 72 73  TabCur->uc.pCurs
2bfc0 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  or!=0 );.      a
2bfd0 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e  ssert( pTabCur->
2bfe0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  isTable );.     
2bff0 20 70 54 61 62 43 75 72 2d 3e 6e 75 6c 6c 52 6f   pTabCur->nullRo
2c000 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  w = 0;.      pTa
2c010 62 43 75 72 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  bCur->movetoTarg
2c020 65 74 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20  et = rowid;.    
2c030 20 20 70 54 61 62 43 75 72 2d 3e 64 65 66 65 72    pTabCur->defer
2c040 72 65 64 4d 6f 76 65 74 6f 20 3d 20 31 3b 0a 20  redMoveto = 1;. 
2c050 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2c060 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
2c070 41 52 52 41 59 20 7c 7c 20 70 4f 70 2d 3e 70 34  ARRAY || pOp->p4
2c080 2e 61 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  .ai==0 );.      
2c090 70 54 61 62 43 75 72 2d 3e 61 41 6c 74 4d 61 70  pTabCur->aAltMap
2c0a0 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
2c0b0 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 70 41       pTabCur->pA
2c0c0 6c 74 43 75 72 73 6f 72 20 3d 20 70 43 3b 0a 20  ltCursor = pC;. 
2c0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c0e0 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
2c0f0 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
2c100 20 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d       pOut->u.i =
2c110 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20 20   rowid;.    }.  
2c120 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2c130 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
2c140 4f 50 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a 20  OP_IdxRowid );. 
2c150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
2c160 6d 53 65 74 4e 75 6c 6c 28 26 61 4d 65 6d 5b 70  mSetNull(&aMem[p
2c170 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 7d 0a 20 20  Op->p2]);.  }.  
2c180 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2c190 6f 64 65 3a 20 49 64 78 47 45 20 50 31 20 50 32  ode: IdxGE P1 P2
2c1a0 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
2c1b0 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40  opsis: key=r[P3@
2c1c0 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34  P4].**.** The P4
2c1d0 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65 73   register values
2c1e0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
2c1f0 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  P3 form an unpac
2c200 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b 65  ked index .** ke
2c210 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  y that omits the
2c220 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 43   PRIMARY KEY.  C
2c230 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79 20  ompare this key 
2c240 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74 68  value against th
2c250 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61 74  e index .** that
2c260 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79   P1 is currently
2c270 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69 67   pointing to, ig
2c280 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d 41  noring the PRIMA
2c290 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 20  RY KEY or ROWID 
2c2a0 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74 68  .** fields at th
2c2b0 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e end..**.** If 
2c2c0 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
2c2d0 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ry is greater th
2c2e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
2c2f0 68 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20  he key value.** 
2c300 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
2c310 20 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c    Otherwise fall
2c320 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2c330 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2c340 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2c350 49 64 78 47 54 20 50 31 20 50 32 20 50 33 20 50  IdxGT P1 P2 P3 P
2c360 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2c370 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
2c380 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69  *.** The P4 regi
2c390 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69  ster values begi
2c3a0 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f  nning with P3 fo
2c3b0 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  rm an unpacked i
2c3c0 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61  ndex .** key tha
2c3d0 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d  t omits the PRIM
2c3e0 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72  ARY KEY.  Compar
2c3f0 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2c400 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e 64   against the ind
2c410 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20 69  ex .** that P1 i
2c420 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2c430 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e  ting to, ignorin
2c440 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  g the PRIMARY KE
2c450 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66  Y or ROWID .** f
2c460 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e 64  ields at the end
2c470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
2c480 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69 73  1 index entry is
2c490 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2c4a0 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20 74  e key value.** t
2c4b0 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20  hen jump to P2. 
2c4c0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2c4d0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
2c4e0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
2c4f0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
2c500 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  dxLT P1 P2 P3 P4
2c510 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
2c520 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
2c530 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
2c540 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
2c550 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
2c560 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
2c570 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
2c580 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41   omits the PRIMA
2c590 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e  RY KEY or ROWID.
2c5a0 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2c5b0 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2c5c0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68  .** the index th
2c5d0 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
2c5e0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
2c5f0 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49  ignoring the PRI
2c600 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52  MARY KEY or.** R
2c610 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69  OWID on the P1 i
2c620 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
2c630 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72  he P1 index entr
2c640 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  y is less than t
2c650 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 65  he key value the
2c660 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a  n jump to P2..**
2c670 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2c680 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
2c690 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
2c6a0 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49  .*/./* Opcode: I
2c6b0 64 78 4c 45 20 50 31 20 50 32 20 50 33 20 50 34  dxLE P1 P2 P3 P4
2c6c0 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   P5.** Synopsis:
2c6d0 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
2c6e0 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69 73  .** The P4 regis
2c6f0 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e  ter values begin
2c700 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72  ning with P3 for
2c710 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e  m an unpacked in
2c720 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74  dex .** key that
2c730 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41   omits the PRIMA
2c740 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44 2e  RY KEY or ROWID.
2c750 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2c760 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2c770 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74 68  .** the index th
2c780 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74  at P1 is current
2c790 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20  ly pointing to, 
2c7a0 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49  ignoring the PRI
2c7b0 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20 52  MARY KEY or.** R
2c7c0 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20 69  OWID on the P1 i
2c7d0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ndex..**.** If t
2c7e0 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74 72  he P1 index entr
2c7f0 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
2c800 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
2c810 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a 75  ey value then ju
2c820 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 4f 74 68  mp.** to P2. Oth
2c830 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72 6f  erwise fall thro
2c840 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
2c850 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
2c860 63 61 73 65 20 4f 50 5f 49 64 78 4c 45 3a 20 20  case OP_IdxLE:  
2c870 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2c880 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 54  */.case OP_IdxGT
2c890 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  :          /* ju
2c8a0 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64  mp */.case OP_Id
2c8b0 78 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a  xLT:          /*
2c8c0 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50   jump */.case OP
2c8d0 5f 49 64 78 47 45 3a 20 20 7b 20 20 20 20 20 20  _IdxGE:  {      
2c8e0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
2c8f0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
2c900 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63  int res;.  Unpac
2c910 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20 20  kedRecord r;..  
2c920 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2c930 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2c940 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2c950 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2c960 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2c970 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
2c980 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64  t( pC->isOrdered
2c990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c9a0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
2c9b0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
2c9c0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
2c9d0 75 72 73 6f 72 21 3d 30 29 3b 0a 20 20 61 73 73  ursor!=0);.  ass
2c9e0 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72 65  ert( pC->deferre
2c9f0 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20 20  dMoveto==0 );.  
2ca00 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d  assert( pOp->p5=
2ca10 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 31  =0 || pOp->p5==1
2ca20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
2ca30 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
2ca40 54 33 32 20 29 3b 0a 20 20 72 2e 70 4b 65 79 49  T32 );.  r.pKeyI
2ca50 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e  nfo = pC->pKeyIn
2ca60 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20 3d  fo;.  r.nField =
2ca70 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b   (u16)pOp->p4.i;
2ca80 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
2ca90 64 65 3c 4f 50 5f 49 64 78 4c 54 20 29 7b 0a 20  de<OP_IdxLT ){. 
2caa0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2cab0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 45  opcode==OP_IdxLE
2cac0 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d   || pOp->opcode=
2cad0 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
2cae0 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20   r.default_rc = 
2caf0 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
2cb00 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
2cb10 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c  code==OP_IdxGE |
2cb20 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
2cb30 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72  P_IdxLT );.    r
2cb40 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  .default_rc = 0;
2cb50 0a 20 20 7d 0a 20 20 72 2e 61 4d 65 6d 20 3d 20  .  }.  r.aMem = 
2cb60 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
2cb70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2cb80 42 55 47 0a 20 20 7b 20 69 6e 74 20 69 3b 20 66  BUG.  { int i; f
2cb90 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69 65  or(i=0; i<r.nFie
2cba0 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  ld; i++) assert(
2cbb0 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e 61   memIsValid(&r.a
2cbc0 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65 6e  Mem[i]) ); }.#en
2cbd0 64 69 66 0a 20 20 72 65 73 20 3d 20 30 3b 20 20  dif.  res = 0;  
2cbe0 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20 20  /* Not needed.  
2cbf0 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69 6c  Only used to sil
2cc00 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e 20  ence a warning. 
2cc10 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2cc20 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
2cc30 72 65 28 64 62 2c 20 70 43 2c 20 26 72 2c 20 26  re(db, pC, &r, &
2cc40 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20  res);.  assert( 
2cc50 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d 3d 28 4f  (OP_IdxLE&1)==(O
2cc60 50 5f 49 64 78 4c 54 26 31 29 20 26 26 20 28 4f  P_IdxLT&1) && (O
2cc70 50 5f 49 64 78 47 45 26 31 29 3d 3d 28 4f 50 5f  P_IdxGE&1)==(OP_
2cc80 49 64 78 47 54 26 31 29 20 29 3b 0a 20 20 69 66  IdxGT&1) );.  if
2cc90 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 26 31  ( (pOp->opcode&1
2cca0 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29 20  )==(OP_IdxLT&1) 
2ccb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ccc0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2ccd0 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  dxLE || pOp->opc
2cce0 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b  ode==OP_IdxLT );
2ccf0 0a 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73 3b  .    res = -res;
2cd00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2cd10 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2cd20 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20 70  e==OP_IdxGE || p
2cd30 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2cd40 64 78 47 54 20 29 3b 0a 20 20 20 20 72 65 73 2b  dxGT );.    res+
2cd50 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61  +;.  }.  VdbeBra
2cd60 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e 30 2c 32  nchTaken(res>0,2
2cd70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2cd80 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2cd90 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
2cda0 3e 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  >0 ) goto jump_t
2cdb0 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
2cdc0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65 73  ../* Opcode: Des
2cdd0 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a 20  troy P1 P2 P3 * 
2cde0 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  *.**.** Delete a
2cdf0 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  n entire databas
2ce00 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
2ce10 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
2ce20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ce30 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76 65  .** file is give
2ce40 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  n by P1..**.** T
2ce50 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2ce60 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20 74  estroyed is in t
2ce70 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2ce80 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e 20   file if P3==0. 
2ce90 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68 65   If.** P3==1 the
2cea0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
2ceb0 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
2cec0 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2ced0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
2cee0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
2cef0 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
2cf00 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
2cf10 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
2cf20 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55  *.** If AUTOVACU
2cf30 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  UM is enabled th
2cf40 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  en it is possibl
2cf50 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 72  e that another r
2cf60 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  oot page.** migh
2cf70 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20  t be moved into 
2cf80 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74 65  the newly delete
2cf90 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 6f  d root page in o
2cfa0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c 6c  rder to keep all
2cfb0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 63  .** root pages c
2cfc0 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68 65  ontiguous at the
2cfd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2cfe0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
2cff0 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75 65   former.** value
2d000 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   of the root pag
2d010 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20 69  e that moved - i
2d020 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ts value before 
2d030 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72 65  the move occurre
2d040 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  d -.** is stored
2d050 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e   in register P2.
2d060 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a 2a    If no page .**
2d070 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72 65   movement was re
2d080 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65 20  quired (because 
2d090 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2d0a0 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72 65  dropped was alre
2d0b0 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73 74  ady .** the last
2d0c0 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74 61   one in the data
2d0d0 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a 65 72  base) then a zer
2d0e0 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  o is stored in r
2d0f0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20 49  egister P2..** I
2d100 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2d110 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61 20  disabled then a 
2d120 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69  zero is stored i
2d130 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  n register P2..*
2d140 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
2d150 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lear.*/.case OP_
2d160 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20 2f  Destroy: {     /
2d170 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
2d180 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69 44  iMoved;.  int iD
2d190 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b;..  assert( p-
2d1a0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
2d1b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2d1c0 31 3e 31 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  1>1 );.  pOut = 
2d1d0 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
2d1e0 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
2d1f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
2d200 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  ;.  if( db->nVdb
2d210 65 52 65 61 64 20 3e 20 64 62 2d 3e 6e 56 44 65  eRead > db->nVDe
2d220 73 74 72 6f 79 2b 31 20 29 7b 0a 20 20 20 20 72  stroy+1 ){.    r
2d230 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
2d240 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  D;.    p->errorA
2d250 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
2d260 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  ;.    goto abort
2d270 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2d280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62 20   }else{.    iDb 
2d290 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61  = pOp->p3;.    a
2d2a0 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73  ssert( DbMaskTes
2d2b0 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
2d2c0 69 44 62 29 20 29 3b 0a 20 20 20 20 69 4d 6f 76  iDb) );.    iMov
2d2d0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  ed = 0;  /* Not 
2d2e0 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 74 6f  needed.  Only to
2d2f0 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69   silence a warni
2d300 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2d310 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2d320 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44  Table(db->aDb[iD
2d330 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c  b].pBt, pOp->p1,
2d340 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70   &iMoved);.    p
2d350 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
2d360 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
2d370 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 20 20  u.i = iMoved;.  
2d380 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d390 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2d3a0 6f 72 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  or;.#ifndef SQLI
2d3b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d3c0 55 4d 0a 20 20 20 20 69 66 28 20 69 4d 6f 76 65  UM.    if( iMove
2d3d0 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d!=0 ){.      sq
2d3e0 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
2d3f0 65 64 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76  ed(db, iDb, iMov
2d400 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  ed, pOp->p1);.  
2d410 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65      /* All OP_De
2d420 73 74 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73  stroy operations
2d430 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 73 61   occur on the sa
2d440 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  me btree */.    
2d450 20 20 61 73 73 65 72 74 28 20 72 65 73 65 74 53    assert( resetS
2d460 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20  chemaOnFault==0 
2d470 7c 7c 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e  || resetSchemaOn
2d480 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a  Fault==iDb+1 );.
2d490 20 20 20 20 20 20 72 65 73 65 74 53 63 68 65 6d        resetSchem
2d4a0 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b 31  aOnFault = iDb+1
2d4b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2d4c0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
2d4d0 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72 20  * Opcode: Clear 
2d4e0 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44  P1 P2 P3.**.** D
2d4f0 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e  elete all conten
2d500 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
2d510 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
2d520 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  x whose root pag
2d530 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
2d540 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69 76  base file is giv
2d550 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c 20  en by P1.  But, 
2d560 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c 20  unlike Destroy, 
2d570 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65  do not.** remove
2d580 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
2d590 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61 74  dex from the dat
2d5a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2d5b0 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
2d5c0 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  g clear is in th
2d5d0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2d5e0 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20 20  file if P2==0.  
2d5f0 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e  If.** P2==1 then
2d600 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
2d610 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65   clear is in the
2d620 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2d630 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74  ase file.** that
2d640 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2d650 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 20  e tables create 
2d660 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d  using CREATE TEM
2d670 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a  PORARY TABLE..**
2d680 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 76 61  .** If the P3 va
2d690 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
2d6a0 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   then the table 
2d6b0 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75 73 74  referred to must
2d6c0 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79   be an.** intkey
2d6d0 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c 20 74   table (an SQL t
2d6e0 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64  able, not an ind
2d6f0 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ex). In this cas
2d700 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65  e the row change
2d710 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e   .** count is in
2d720 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65  cremented by the
2d730 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2d740 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  in the table bei
2d750 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20  ng cleared. .** 
2d760 49 66 20 50 33 20 69 73 20 67 72 65 61 74 65 72  If P3 is greater
2d770 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
2d780 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
2d790 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
2d7a0 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72   is.** also incr
2d7b0 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e  emented by the n
2d7c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2d7d0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2d7e0 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
2d7f0 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f  See also: Destro
2d800 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65  y.*/.case OP_Cle
2d810 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ar: {.  int nCha
2d820 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67 65  nge;. .  nChange
2d830 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2d840 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
2d850 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
2d860 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
2d870 61 73 6b 2c 20 70 4f 70 2d 3e 70 32 29 20 29 3b  ask, pOp->p2) );
2d880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2d890 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 0a  treeClearTable(.
2d8a0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70 4f        db->aDb[pO
2d8b0 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70 2d  p->p2].pBt, pOp-
2d8c0 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f 20  >p1, (pOp->p3 ? 
2d8d0 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20 20  &nChange : 0).  
2d8e0 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  );.  if( pOp->p3
2d8f0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e   ){.    p->nChan
2d900 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  ge += nChange;. 
2d910 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30     if( pOp->p3>0
2d920 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d930 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d  ( memIsValid(&aM
2d940 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b 0a  em[pOp->p3]) );.
2d950 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f        memAboutTo
2d960 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d 5b  Change(p, &aMem[
2d970 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20 20  pOp->p3]);.     
2d980 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 75   aMem[pOp->p3].u
2d990 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  .i += nChange;. 
2d9a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2d9b0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
2d9c0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
2d9d0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2d9e0 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65 72 20  de: ResetSorter 
2d9f0 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  P1 * * * *.**.**
2da00 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74   Delete all cont
2da10 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 65 70  ents from the ep
2da20 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 72  hemeral table or
2da30 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74 20   sorter.** that 
2da40 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73 6f  is open on curso
2da50 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r P1..**.** This
2da60 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f 72   opcode only wor
2da70 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20 75  ks for cursors u
2da80 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  sed for sorting 
2da90 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77 69  and.** opened wi
2daa0 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  th OP_OpenEpheme
2dab0 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72  ral or OP_Sorter
2dac0 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  Open..*/.case OP
2dad0 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20 7b 0a  _ResetSorter: {.
2dae0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
2daf0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 70 4f  ;. .  assert( pO
2db00 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
2db10 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
2db20 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
2db30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
2db40 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2db50 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70 43   if( isSorter(pC
2db60 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2db70 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74 28  VdbeSorterReset(
2db80 64 62 2c 20 70 43 2d 3e 75 63 2e 70 53 6f 72 74  db, pC->uc.pSort
2db90 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
2dba0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
2dbb0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2dbc0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61 73 73  BTREE );.    ass
2dbd0 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68 65 6d  ert( pC->isEphem
2dbe0 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  eral );.    rc =
2dbf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2dc00 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f 72 28  arTableOfCursor(
2dc10 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
2dc20 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2dc30 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2dc40 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65  error;.  }.  bre
2dc50 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2dc60 3a 20 43 72 65 61 74 65 54 61 62 6c 65 20 50 31  : CreateTable P1
2dc70 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
2dc80 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 6f  opsis: r[P2]=roo
2dc90 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20 41  t iDb=P1.**.** A
2dca0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 74 61  llocate a new ta
2dcb0 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
2dcc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
2dcd0 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65   P1==0 or in the
2dce0 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2dcf0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50  tabase file if P
2dd00 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61 74  1==1 or in an at
2dd10 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
2dd20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72 69  if.** P1>1.  Wri
2dd30 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  te the root page
2dd40 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2dd50 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ew table into.**
2dd60 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a   register P2.**.
2dd70 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2dd80 65 20 62 65 74 77 65 65 6e 20 61 20 74 61 62 6c  e between a tabl
2dd90 65 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 69  e and an index i
2dda0 73 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c 65  s this:  A table
2ddb0 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61 20   must.** have a 
2ddc0 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6b  4-byte integer k
2ddd0 65 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65 20  ey and can have 
2dde0 61 72 62 69 74 72 61 72 79 20 64 61 74 61 2e 20  arbitrary data. 
2ddf0 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61 73   An index.** has
2de00 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b 65   an arbitrary ke
2de10 79 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a 2a  y but no data..*
2de20 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 43  *.** See also: C
2de30 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f 2a  reateIndex.*/./*
2de40 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65 49   Opcode: CreateI
2de50 6e 64 65 78 20 50 31 20 50 32 20 2a 20 2a 20 2a  ndex P1 P2 * * *
2de60 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
2de70 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31 0a  P2]=root iDb=P1.
2de80 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  **.** Allocate a
2de90 20 6e 65 77 20 69 6e 64 65 78 20 69 6e 20 74 68   new index in th
2dea0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2deb0 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f 72  file if P1==0 or
2dec0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69 6c   in the.** auxil
2ded0 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69  iary database fi
2dee0 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20 69  le if P1==1 or i
2def0 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  n an attached da
2df00 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31 3e  tabase if.** P1>
2df10 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72 6f  1.  Write the ro
2df20 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
2df30 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
2df40 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
2df50 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 64   P2..**.** See d
2df60 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 20  ocumentation on 
2df70 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 66  OP_CreateTable f
2df80 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2df90 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61  formation..*/.ca
2dfa0 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  se OP_CreateInde
2dfb0 78 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x:            /*
2dfc0 20 6f 75 74 32 20 2a 2f 0a 63 61 73 65 20 4f 50   out2 */.case OP
2dfd0 5f 43 72 65 61 74 65 54 61 62 6c 65 3a 20 7b 20  _CreateTable: { 
2dfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
2dff0 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 0a   */.  int pgno;.
2e000 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 44    int flags;.  D
2e010 62 20 2a 70 44 62 3b 0a 0a 20 20 70 4f 75 74 20  b *pDb;..  pOut 
2e020 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
2e030 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 67 6e 6f  (p, pOp);.  pgno
2e040 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2e050 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2e060 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
2e070 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
2e080 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
2e090 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
2e0a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61    assert( p->rea
2e0b0 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44  dOnly==0 );.  pD
2e0c0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70  b = &db->aDb[pOp
2e0d0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2e0e0 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a   pDb->pBt!=0 );.
2e0f0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2e100 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  e==OP_CreateTabl
2e110 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61 67  e ){.    /* flag
2e120 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  s = BTREE_INTKEY
2e130 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d  ; */.    flags =
2e140 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a 20   BTREE_INTKEY;. 
2e150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67   }else{.    flag
2e160 73 20 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  s = BTREE_BLOBKE
2e170 59 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  Y;.  }.  rc = sq
2e180 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2e190 54 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20  Table(pDb->pBt, 
2e1a0 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a 20  &pgno, flags);. 
2e1b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
2e1c0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
2e1d0 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  r;.  pOut->u.i =
2e1e0 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b 0a   pgno;.  break;.
2e1f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 71  }../* Opcode: Sq
2e200 6c 45 78 65 63 20 2a 20 2a 20 2a 20 50 34 20 2a  lExec * * * P4 *
2e210 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 53  .**.** Run the S
2e220 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  QL statement or 
2e230 73 74 61 74 65 6d 65 6e 74 73 20 73 70 65 63 69  statements speci
2e240 66 69 65 64 20 69 6e 20 74 68 65 20 50 34 20 73  fied in the P4 s
2e250 74 72 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65 20 4f  tring..*/.case O
2e260 50 5f 53 71 6c 45 78 65 63 3a 20 7b 0a 20 20 64  P_SqlExec: {.  d
2e270 62 2d 3e 6e 53 71 6c 45 78 65 63 2b 2b 3b 0a 20  b->nSqlExec++;. 
2e280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2e290 65 63 28 64 62 2c 20 70 4f 70 2d 3e 70 34 2e 7a  ec(db, pOp->p4.z
2e2a0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62  , 0, 0, 0);.  db
2e2b0 2d 3e 6e 53 71 6c 45 78 65 63 2d 2d 3b 0a 20 20  ->nSqlExec--;.  
2e2c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
2e2d0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
2e2e0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
2e2f0 20 4f 70 63 6f 64 65 3a 20 50 61 72 73 65 53 63   Opcode: ParseSc
2e300 68 65 6d 61 20 50 31 20 2a 20 2a 20 50 34 20 2a  hema P1 * * P4 *
2e310 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  .**.** Read and 
2e320 70 61 72 73 65 20 61 6c 6c 20 65 6e 74 72 69 65  parse all entrie
2e330 73 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  s from the SQLIT
2e340 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
2e350 66 20 64 61 74 61 62 61 73 65 20 50 31 0a 2a 2a  f database P1.**
2e360 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20   that match the 
2e370 57 48 45 52 45 20 63 6c 61 75 73 65 20 50 34 2e  WHERE clause P4.
2e380 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63   .**.** This opc
2e390 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
2e3a0 70 61 72 73 65 72 20 74 6f 20 63 72 65 61 74 65  parser to create
2e3b0 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 6d   a new virtual m
2e3c0 61 63 68 69 6e 65 2c 0a 2a 2a 20 74 68 65 6e 20  achine,.** then 
2e3d0 72 75 6e 73 20 74 68 65 20 6e 65 77 20 76 69 72  runs the new vir
2e3e0 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 49  tual machine.  I
2e3f0 74 20 69 73 20 74 68 75 73 20 61 20 72 65 2d 65  t is thus a re-e
2e400 6e 74 72 61 6e 74 20 6f 70 63 6f 64 65 2e 0a 2a  ntrant opcode..*
2e410 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 73 65 53  /.case OP_ParseS
2e420 63 68 65 6d 61 3a 20 7b 0a 20 20 69 6e 74 20 69  chema: {.  int i
2e430 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db;.  const char
2e440 20 2a 7a 4d 61 73 74 65 72 3b 0a 20 20 63 68 61   *zMaster;.  cha
2e450 72 20 2a 7a 53 71 6c 3b 0a 20 20 49 6e 69 74 44  r *zSql;.  InitD
2e460 61 74 61 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20  ata initData;.. 
2e470 20 2f 2a 20 41 6e 79 20 70 72 65 70 61 72 65 64   /* Any prepared
2e480 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
2e490 69 6e 76 6f 6b 65 73 20 74 68 69 73 20 6f 70 63  invokes this opc
2e4a0 6f 64 65 20 77 69 6c 6c 20 68 6f 6c 64 20 6d 75  ode will hold mu
2e4b0 74 65 78 65 73 0a 20 20 2a 2a 20 6f 6e 20 65 76  texes.  ** on ev
2e4c0 65 72 79 20 62 74 72 65 65 2e 20 20 54 68 69 73  ery btree.  This
2e4d0 20 69 73 20 61 20 70 72 65 72 65 71 75 69 73 69   is a prerequisi
2e4e0 74 65 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  te for invoking 
2e4f0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 49 6e 69  .  ** sqlite3Ini
2e500 74 43 61 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 2a  tCallback()..  *
2e510 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2e520 44 45 42 55 47 0a 20 20 66 6f 72 28 69 44 62 3d  DEBUG.  for(iDb=
2e530 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
2e540 69 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  iDb++){.    asse
2e550 72 74 28 20 69 44 62 3d 3d 31 20 7c 7c 20 73 71  rt( iDb==1 || sq
2e560 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2e570 75 74 65 78 28 64 62 2d 3e 61 44 62 5b 69 44 62  utex(db->aDb[iDb
2e580 5d 2e 70 42 74 29 20 29 3b 0a 20 20 7d 0a 23 65  ].pBt) );.  }.#e
2e590 6e 64 69 66 0a 0a 20 20 69 44 62 20 3d 20 70 4f  ndif..  iDb = pO
2e5a0 70 2d 3e 70 31 3b 0a 20 20 61 73 73 65 72 74 28  p->p1;.  assert(
2e5b0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
2e5c0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
2e5d0 72 74 28 20 44 62 48 61 73 50 72 6f 70 65 72 74  rt( DbHasPropert
2e5e0 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53 63  y(db, iDb, DB_Sc
2e5f0 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 3b 0a 20  hemaLoaded) );. 
2e600 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 61   /* Used to be a
2e610 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 2a 2f 20   conditional */ 
2e620 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
2e630 4d 41 53 54 45 52 5f 4e 41 4d 45 3b 0a 20 20 20  MASTER_NAME;.   
2e640 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d 20 64   initData.db = d
2e650 62 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  b;.    initData.
2e660 69 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20  iDb = pOp->p1;. 
2e670 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72     initData.pzEr
2e680 72 4d 73 67 20 3d 20 26 70 2d 3e 7a 45 72 72 4d  rMsg = &p->zErrM
2e690 73 67 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  sg;.    zSql = s
2e6a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
2e6b0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
2e6c0 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c   name, rootpage,
2e6d0 20 73 71 6c 20 46 52 4f 4d 20 27 25 71 27 2e 25   sql FROM '%q'.%
2e6e0 73 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  s WHERE %s ORDER
2e6f0 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20   BY rowid",.    
2e700 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
2e710 7a 44 62 53 4e 61 6d 65 2c 20 7a 4d 61 73 74 65  zDbSName, zMaste
2e720 72 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  r, pOp->p4.z);. 
2e730 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
2e740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2e750 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2e760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e770 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
2e780 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
2e790 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
2e7a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 69 74   = 1;.      init
2e7b0 44 61 74 61 2e 72 63 20 3d 20 53 51 4c 49 54 45  Data.rc = SQLITE
2e7c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  _OK;.      asser
2e7d0 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
2e7e0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 63  iled );.      rc
2e7f0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2e800 64 62 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65  db, zSql, sqlite
2e810 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 2c 20 26  3InitCallback, &
2e820 69 6e 69 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  initData, 0);.  
2e830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e840 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 69 6e 69  TE_OK ) rc = ini
2e850 74 44 61 74 61 2e 72 63 3b 0a 20 20 20 20 20 20  tData.rc;.      
2e860 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2e870 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 64  , zSql);.      d
2e880 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 30  b->init.busy = 0
2e890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2e8a0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
2e8b0 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
2e8c0 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
2e8d0 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
2e8e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
2e8f0 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
2e900 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  m;.    }.    got
2e910 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
2e920 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72 65 61  rror;.  }.  brea
2e930 6b 3b 20 20 0a 7d 0a 0a 23 69 66 20 21 64 65 66  k;  .}..#if !def
2e940 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2e950 5f 41 4e 41 4c 59 5a 45 29 0a 2f 2a 20 4f 70 63  _ANALYZE)./* Opc
2e960 6f 64 65 3a 20 4c 6f 61 64 41 6e 61 6c 79 73 69  ode: LoadAnalysi
2e970 73 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  s P1 * * * *.**.
2e980 2a 2a 20 52 65 61 64 20 74 68 65 20 73 71 6c 69  ** Read the sqli
2e990 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 20 66  te_stat1 table f
2e9a0 6f 72 20 64 61 74 61 62 61 73 65 20 50 31 20 61  or database P1 a
2e9b0 6e 64 20 6c 6f 61 64 20 74 68 65 20 63 6f 6e 74  nd load the cont
2e9c0 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  ent.** of that t
2e9d0 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 69 6e  able into the in
2e9e0 74 65 72 6e 61 6c 20 69 6e 64 65 78 20 68 61 73  ternal index has
2e9f0 68 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 77  h table.  This w
2ea00 69 6c 6c 20 63 61 75 73 65 0a 2a 2a 20 74 68 65  ill cause.** the
2ea10 20 61 6e 61 6c 79 73 69 73 20 74 6f 20 62 65 20   analysis to be 
2ea20 75 73 65 64 20 77 68 65 6e 20 70 72 65 70 61 72  used when prepar
2ea30 69 6e 67 20 61 6c 6c 20 73 75 62 73 65 71 75 65  ing all subseque
2ea40 6e 74 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 63  nt queries..*/.c
2ea50 61 73 65 20 4f 50 5f 4c 6f 61 64 41 6e 61 6c 79  ase OP_LoadAnaly
2ea60 73 69 73 3a 20 7b 0a 20 20 61 73 73 65 72 74 28  sis: {.  assert(
2ea70 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2ea80 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
2ea90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2eaa0 41 6e 61 6c 79 73 69 73 4c 6f 61 64 28 64 62 2c  AnalysisLoad(db,
2eab0 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 69 66 28   pOp->p1);.  if(
2eac0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2ead0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2eae0 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 23 65 6e 64   break;  .}.#end
2eaf0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2eb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
2eb10 5a 45 29 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ZE) */../* Opcod
2eb20 65 3a 20 44 72 6f 70 54 61 62 6c 65 20 50 31 20  e: DropTable P1 
2eb30 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
2eb40 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
2eb50 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
2eb60 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
2eb70 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
2eb80 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  the table named 
2eb90 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
2eba0 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
2ebb0 65 64 20 61 66 74 65 72 20 61 20 74 61 62 6c 65  ed after a table
2ebc0 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66  .** is dropped f
2ebd0 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20  rom disk (using 
2ebe0 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f  the Destroy opco
2ebf0 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  de) in order to 
2ec00 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74  keep .** the int
2ec10 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
2ec20 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
2ec30 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
2ec40 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
2ec50 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
2ec60 50 5f 44 72 6f 70 54 61 62 6c 65 3a 20 7b 0a 20  P_DropTable: {. 
2ec70 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2ec80 64 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  dDeleteTable(db,
2ec90 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2eca0 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
2ecb0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
2ecc0 70 49 6e 64 65 78 20 50 31 20 2a 20 2a 20 50 34  pIndex P1 * * P4
2ecd0 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20   *.**.** Remove 
2ece0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e  the internal (in
2ecf0 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74  -memory) data st
2ed00 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
2ed10 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e  scribe.** the in
2ed20 64 65 78 20 6e 61 6d 65 64 20 50 34 20 69 6e 20  dex named P4 in 
2ed30 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68  database P1.  Th
2ed40 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
2ed50 65 72 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  er an index.** i
2ed60 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64  s dropped from d
2ed70 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44  isk (using the D
2ed80 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 0a 2a  estroy opcode).*
2ed90 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  * in order to ke
2eda0 65 70 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ep the internal 
2edb0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2edc0 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
2edd0 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
2ede0 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
2edf0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
2ee00 49 6e 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74  Index: {.  sqlit
2ee10 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
2ee20 65 49 6e 64 65 78 28 64 62 2c 20 70 4f 70 2d 3e  eIndex(db, pOp->
2ee30 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  p1, pOp->p4.z);.
2ee40 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2ee50 70 63 6f 64 65 3a 20 44 72 6f 70 54 72 69 67 67  pcode: DropTrigg
2ee60 65 72 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  er P1 * * P4 *.*
2ee70 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2ee80 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
2ee90 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
2eea0 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
2eeb0 62 65 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65  be.** the trigge
2eec0 72 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61  r named P4 in da
2eed0 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73  tabase P1.  This
2eee0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2eef0 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 69 73   a trigger.** is
2ef00 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69   dropped from di
2ef10 73 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65  sk (using the De
2ef20 73 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e  stroy opcode) in
2ef30 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a   order to keep .
2ef40 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ** the internal 
2ef50 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2ef60 66 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  f the.** schema 
2ef70 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
2ef80 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
2ef90 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70  .*/.case OP_Drop
2efa0 54 72 69 67 67 65 72 3a 20 7b 0a 20 20 73 71 6c  Trigger: {.  sql
2efb0 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2efc0 65 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70  eteTrigger(db, p
2efd0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
2efe0 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
2eff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f000 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2f010 48 45 43 4b 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  HECK./* Opcode: 
2f020 49 6e 74 65 67 72 69 74 79 43 6b 20 50 31 20 50  IntegrityCk P1 P
2f030 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
2f040 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20   Do an analysis 
2f050 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  of the currently
2f060 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 20   open database. 
2f070 20 53 74 6f 72 65 20 69 6e 0a 2a 2a 20 72 65 67   Store in.** reg
2f080 69 73 74 65 72 20 50 31 20 74 68 65 20 74 65 78  ister P1 the tex
2f090 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  t of an error me
2f0a0 73 73 61 67 65 20 64 65 73 63 72 69 62 69 6e 67  ssage describing
2f0b0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 2a   any problems..*
2f0c0 2a 20 49 66 20 6e 6f 20 70 72 6f 62 6c 65 6d 73  * If no problems
2f0d0 20 61 72 65 20 66 6f 75 6e 64 2c 20 73 74 6f 72   are found, stor
2f0e0 65 20 61 20 4e 55 4c 4c 20 69 6e 20 72 65 67 69  e a NULL in regi
2f0f0 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54  ster P1..**.** T
2f100 68 65 20 72 65 67 69 73 74 65 72 20 50 33 20 63  he register P3 c
2f110 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6c 65 73 73  ontains one less
2f120 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
2f130 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f  m number of allo
2f140 77 65 64 20 65 72 72 6f 72 73 2e 0a 2a 2a 20 41  wed errors..** A
2f150 74 20 6d 6f 73 74 20 72 65 67 28 50 33 29 20 65  t most reg(P3) e
2f160 72 72 6f 72 73 20 77 69 6c 6c 20 62 65 20 72 65  rrors will be re
2f170 70 6f 72 74 65 64 2e 0a 2a 2a 20 49 6e 20 6f 74  ported..** In ot
2f180 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 61  her words, the a
2f190 6e 61 6c 79 73 69 73 20 73 74 6f 70 73 20 61 73  nalysis stops as
2f1a0 20 73 6f 6f 6e 20 61 73 20 72 65 67 28 50 31 29   soon as reg(P1)
2f1b0 20 65 72 72 6f 72 73 20 61 72 65 20 0a 2a 2a 20   errors are .** 
2f1c0 73 65 65 6e 2e 20 20 52 65 67 28 50 31 29 20 69  seen.  Reg(P1) i
2f1d0 73 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74  s updated with t
2f1e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2f1f0 6f 72 73 20 72 65 6d 61 69 6e 69 6e 67 2e 0a 2a  ors remaining..*
2f200 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
2f210 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20 61 6c  ge numbers of al
2f220 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
2f230 64 61 74 61 62 61 73 65 20 61 72 65 20 69 6e 74  database are int
2f240 65 67 65 72 73 0a 2a 2a 20 73 74 6f 72 65 64 20  egers.** stored 
2f250 69 6e 20 50 34 5f 49 4e 54 41 52 52 41 59 20 61  in P4_INTARRAY a
2f260 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
2f270 66 20 50 35 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P5 is not zero
2f280 2c 20 74 68 65 20 63 68 65 63 6b 20 69 73 20 64  , the check is d
2f290 6f 6e 65 20 6f 6e 20 74 68 65 20 61 75 78 69 6c  one on the auxil
2f2a0 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
2f2b0 20 66 69 6c 65 2c 20 6e 6f 74 20 74 68 65 20 6d   file, not the m
2f2c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2f2d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
2f2e0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
2f2f0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 69 6e  implement the in
2f300 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 70 72  tegrity_check pr
2f310 61 67 6d 61 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  agma..*/.case OP
2f320 5f 49 6e 74 65 67 72 69 74 79 43 6b 3a 20 7b 0a  _IntegrityCk: {.
2f330 20 20 69 6e 74 20 6e 52 6f 6f 74 3b 20 20 20 20    int nRoot;    
2f340 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2f350 61 62 6c 65 73 20 74 6f 20 63 68 65 63 6b 2e 20  ables to check. 
2f360 20 28 4e 75 6d 62 65 72 20 6f 66 20 72 6f 6f 74   (Number of root
2f370 20 70 61 67 65 73 2e 29 20 2a 2f 0a 20 20 69 6e   pages.) */.  in
2f380 74 20 2a 61 52 6f 6f 74 3b 20 20 20 20 20 2f 2a  t *aRoot;     /*
2f390 20 41 72 72 61 79 20 6f 66 20 72 6f 6f 74 70 61   Array of rootpa
2f3a0 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74  ge numbers for t
2f3b0 61 62 6c 65 73 20 74 6f 20 62 65 20 63 68 65 63  ables to be chec
2f3c0 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  ked */.  int nEr
2f3d0 72 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  r;       /* Numb
2f3e0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 70  er of errors rep
2f3f0 6f 72 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  orted */.  char 
2f400 2a 7a 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65  *z;        /* Te
2f410 78 74 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  xt of the error 
2f420 72 65 70 6f 72 74 20 2a 2f 0a 20 20 4d 65 6d 20  report */.  Mem 
2f430 2a 70 6e 45 72 72 3b 20 20 20 20 20 2f 2a 20 52  *pnErr;     /* R
2f440 65 67 69 73 74 65 72 20 6b 65 65 70 69 6e 67 20  egister keeping 
2f450 74 72 61 63 6b 20 6f 66 20 65 72 72 6f 72 73 20  track of errors 
2f460 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 0a 20 20  remaining */..  
2f470 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
2f480 61 64 65 72 20 29 3b 0a 20 20 6e 52 6f 6f 74 20  ader );.  nRoot 
2f490 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 52 6f  = pOp->p2;.  aRo
2f4a0 6f 74 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b  ot = pOp->p4.ai;
2f4b0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 6f 6f 74  .  assert( nRoot
2f4c0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2f4d0 61 52 6f 6f 74 5b 6e 52 6f 6f 74 5d 3d 3d 30 20  aRoot[nRoot]==0 
2f4e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2f4f0 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
2f500 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
2f510 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
2f520 20 70 6e 45 72 72 20 3d 20 26 61 4d 65 6d 5b 70   pnErr = &aMem[p
2f530 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72  Op->p3];.  asser
2f540 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67 73  t( (pnErr->flags
2f550 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
2f560 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e 45  ;.  assert( (pnE
2f570 72 72 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d  rr->flags & (MEM
2f580 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  _Str|MEM_Blob))=
2f590 3d 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26  =0 );.  pIn1 = &
2f5a0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
2f5b0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
2f5c0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
2f5d0 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
2f5e0 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
2f5f0 4f 70 2d 3e 70 35 29 20 29 3b 0a 20 20 7a 20 3d  Op->p5) );.  z =
2f600 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
2f610 65 67 72 69 74 79 43 68 65 63 6b 28 64 62 2d 3e  egrityCheck(db->
2f620 61 44 62 5b 70 4f 70 2d 3e 70 35 5d 2e 70 42 74  aDb[pOp->p5].pBt
2f630 2c 20 61 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 0a  , aRoot, nRoot,.
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 28 69 6e 74 29 70 6e 45 72 72 2d 3e 75 2e 69   (int)pnErr->u.i
2f670 2b 31 2c 20 26 6e 45 72 72 29 3b 0a 20 20 73 71  +1, &nErr);.  sq
2f680 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
2f690 75 6c 6c 28 70 49 6e 31 29 3b 0a 20 20 69 66 28  ull(pIn1);.  if(
2f6a0 20 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20   nErr==0 ){.    
2f6b0 61 73 73 65 72 74 28 20 7a 3d 3d 30 20 29 3b 0a  assert( z==0 );.
2f6c0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 3d 3d 30    }else if( z==0
2f6d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f   ){.    goto no_
2f6e0 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mem;.  }else{.  
2f6f0 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d 3d 20    pnErr->u.i -= 
2f700 6e 45 72 72 2d 31 3b 0a 20 20 20 20 73 71 6c 69  nErr-1;.    sqli
2f710 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
2f720 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pIn1, z, -1, SQ
2f730 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
2f740 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 20 20  e3_free);.  }.  
2f750 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
2f760 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73 71 6c  IZE(pIn1);.  sql
2f770 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e  ite3VdbeChangeEn
2f780 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65 6e 63  coding(pIn1, enc
2f790 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61 6b 3b  oding);.  break;
2f7a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f7b0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2f7c0 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20  TY_CHECK */../* 
2f7d0 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 41 64  Opcode: RowSetAd
2f7e0 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  d P1 P2 * * *.**
2f7f0 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 77 73 65   Synopsis: rowse
2f800 74 28 50 31 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a  t(P1)=r[P2].**.*
2f810 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69 6e 74  * Insert the int
2f820 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c 64 20  eger value held 
2f830 62 79 20 72 65 67 69 73 74 65 72 20 50 32 20 69  by register P2 i
2f840 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 69 6e  nto a boolean in
2f850 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e 20 72  dex.** held in r
2f860 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a  egister P1..**.*
2f870 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  * An assertion f
2f880 61 69 6c 73 20 69 66 20 50 32 20 69 73 20 6e 6f  ails if P2 is no
2f890 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  t an integer..*/
2f8a0 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65 74 41  .case OP_RowSetA
2f8b0 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 69  dd: {       /* i
2f8c0 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70 49 6e  n1, in2 */.  pIn
2f8d0 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
2f8e0 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d  1];.  pIn2 = &aM
2f8f0 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61  em[pOp->p2];.  a
2f900 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e 66 6c  ssert( (pIn2->fl
2f910 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
2f920 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  0 );.  if( (pIn1
2f930 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
2f940 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  wSet)==0 ){.    
2f950 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
2f960 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20  tRowSet(pIn1);. 
2f970 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c     if( (pIn1->fl
2f980 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
2f990 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  )==0 ) goto no_m
2f9a0 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  em;.  }.  sqlite
2f9b0 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49  3RowSetInsert(pI
2f9c0 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70  n1->u.pRowSet, p
2f9d0 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In2->u.i);.  bre
2f9e0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
2f9f0 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50 31 20  : RowSetRead P1 
2fa00 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
2fa10 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 6f 77  opsis: r[P3]=row
2fa20 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78  set(P1).**.** Ex
2fa30 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c 6c 65  tract the smalle
2fa40 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20 62 6f  st value from bo
2fa50 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20 61  olean index P1 a
2fa60 6e 64 20 70 75 74 20 74 68 61 74 20 76 61 6c 75  nd put that valu
2fa70 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74  e into.** regist
2fa80 65 72 20 50 33 2e 20 20 4f 72 2c 20 69 66 20 62  er P3.  Or, if b
2fa90 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31 20  oolean index P1 
2faa0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  is initially emp
2fab0 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a 2a 20  ty, leave P3.** 
2fac0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 6a 75  unchanged and ju
2fad0 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
2fae0 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P2..*/.case OP
2faf0 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b 20 20  _RowSetRead: {  
2fb00 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
2fb10 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36 34  1, out3 */.  i64
2fb20 20 76 61 6c 3b 0a 0a 20 20 70 49 6e 31 20 3d 20   val;..  pIn1 = 
2fb30 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2fb40 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
2fb50 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
2fb60 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  ==0 .   || sqlit
2fb70 65 33 52 6f 77 53 65 74 4e 65 78 74 28 70 49 6e  e3RowSetNext(pIn
2fb80 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 26 76  1->u.pRowSet, &v
2fb90 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  al)==0.  ){.    
2fba0 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e 20 69  /* The boolean i
2fbb0 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20 2a 2f  ndex is empty */
2fbc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2fbd0 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e 31 29  MemSetNull(pIn1)
2fbe0 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  ;.    VdbeBranch
2fbf0 54 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20 20 20  Taken(1,2);.    
2fc00 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 5f  goto jump_to_p2_
2fc10 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  and_check_for_in
2fc20 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c 73 65  terrupt;.  }else
2fc30 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c 75 65  {.    /* A value
2fc40 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d   was pulled from
2fc50 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
2fc60 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
2fc70 6e 28 30 2c 32 29 3b 0a 20 20 20 20 73 71 6c 69  n(0,2);.    sqli
2fc80 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74  te3VdbeMemSetInt
2fc90 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  64(&aMem[pOp->p3
2fca0 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 67  ], val);.  }.  g
2fcb0 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  oto check_for_in
2fcc0 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f  terrupt;.}../* O
2fcd0 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 54 65 73  pcode: RowSetTes
2fce0 74 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a  t P1 P2 P3 P4.**
2fcf0 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
2fd00 50 33 5d 20 69 6e 20 72 6f 77 73 65 74 28 50 31  P3] in rowset(P1
2fd10 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  ) goto P2.**.** 
2fd20 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 61  Register P3 is a
2fd30 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61  ssumed to hold a
2fd40 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
2fd50 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69 73 74  value. If regist
2fd60 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61 69 6e  er P1.** contain
2fd70 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63  s a RowSet objec
2fd80 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77 53 65  t and that RowSe
2fd90 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  t object contain
2fda0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 68  s.** the value h
2fdb0 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d 70 20  eld in P3, jump 
2fdc0 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
2fdd0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73 65 72  Otherwise, inser
2fde0 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72  t the.** integer
2fdf0 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68 65 20   in P3 into the 
2fe00 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e 74 69  RowSet and conti
2fe10 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  nue on to the.**
2fe20 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a 2a 2a   next opcode..**
2fe30 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74 20 6f  .** The RowSet o
2fe40 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d 69 7a  bject is optimiz
2fe50 65 64 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ed for the case 
2fe60 77 68 65 72 65 20 73 75 63 63 65 73 73 69 76 65  where successive
2fe70 20 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e 74 65   sets.** of inte
2fe80 67 65 72 73 2c 20 77 68 65 72 65 20 65 61 63 68  gers, where each
2fe90 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   set contains no
2fea0 20 64 75 70 6c 69 63 61 74 65 73 2e 20 45 61 63   duplicates. Eac
2feb0 68 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61 6c 75  h set.** of valu
2fec0 65 73 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  es is identified
2fed0 20 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20   by a unique P4 
2fee0 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
2fef0 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76   set.** must hav
2ff00 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e  e P4==0, the fin
2ff10 61 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20 20 50  al set P4=-1.  P
2ff20 34 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  4 must be either
2ff30 20 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d 6e 65   -1 or.** non-ne
2ff40 67 61 74 69 76 65 2e 20 20 46 6f 72 20 6e 6f 6e  gative.  For non
2ff50 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73  -negative values
2ff60 20 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68 65 20   of P4 only the 
2ff70 6c 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74 73 20  lower 4.** bits 
2ff80 61 72 65 20 73 69 67 6e 69 66 69 63 61 6e 74 2e  are significant.
2ff90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f  .**.** This allo
2ffa0 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ws optimizations
2ffb0 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d 3d 30  : (a) when P4==0
2ffc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2ffd0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 65  d to test.** the
2ffe0 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74 20 66   rowset object f
2fff0 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69 73 20  or P3, as it is 
30000 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74 20 74  guaranteed not t
30010 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a 2a 2a  o contain it,.**
30020 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d 2d 31   (b) when P4==-1
30030 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
30040 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
30050 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77 69 6c  value, as it wil
30060 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20 74 65  l.** never be te
30070 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20 28 63  sted for, and (c
30080 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65 20 74  ) when a value t
30090 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 73  hat is part of s
300a0 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73 65 72  et X is.** inser
300b0 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
300c0 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20   need to search 
300d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 61  to see if the sa
300e0 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a 2a 20  me value was.** 
300f0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 65 72  previously inser
30100 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 73  ted as part of s
30110 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20 69 74  et X (only if it
30120 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   was previously.
30130 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73 20 70  ** inserted as p
30140 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65  art of some othe
30150 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73 65 20  r set)..*/.case 
30160 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20 7b  OP_RowSetTest: {
30170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30180 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
30190 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20  1, in3 */.  int 
301a0 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78 69 73  iSet;.  int exis
301b0 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61  ts;..  pIn1 = &a
301c0 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
301d0 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn3 = &aMem[pOp
301e0 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20 3d 20  ->p3];.  iSet = 
301f0 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61 73 73  pOp->p4.i;.  ass
30200 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
30210 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20 20 2f  &MEM_Int );..  /
30220 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
30230 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
30240 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a 65 63  n a rowset objec
30250 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
30260 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65 74 65   P1,.  ** delete
30270 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e 69 74   it now and init
30280 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68 20 61  ialize P1 with a
30290 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 0a 20  n empty rowset. 
302a0 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e 31 2d   */.  if( (pIn1-
302b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
302c0 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Set)==0 ){.    s
302d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
302e0 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a 20 20  RowSet(pIn1);.  
302f0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
30300 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
30310 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
30320 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  m;.  }..  assert
30330 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
30340 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61 73 73  4_INT32 );.  ass
30350 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20 7c 7c  ert( iSet==-1 ||
30360 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20 69 66   iSet>=0 );.  if
30370 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20 65 78  ( iSet ){.    ex
30380 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33 52 6f  ists = sqlite3Ro
30390 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d 3e 75  wSetTest(pIn1->u
303a0 2e 70 52 6f 77 53 65 74 2c 20 69 53 65 74 2c 20  .pRowSet, iSet, 
303b0 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pIn3->u.i);.    
303c0 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
303d0 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a 20 20  exists!=0,2);.  
303e0 20 20 69 66 28 20 65 78 69 73 74 73 20 29 20 67    if( exists ) g
303f0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
30400 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74 3e 3d    }.  if( iSet>=
30410 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30420 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70 49 6e  RowSetInsert(pIn
30430 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20 70 49  1->u.pRowSet, pI
30440 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a 20 20  n3->u.i);.  }.  
30450 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  break;.}...#ifnd
30460 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
30470 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63 6f 64  RIGGER../* Opcod
30480 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20 50 32  e: Program P1 P2
30490 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20   P3 P4 P5.**.** 
304a0 45 78 65 63 75 74 65 20 74 68 65 20 74 72 69 67  Execute the trig
304b0 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61 73 73  ger program pass
304c0 65 64 20 61 73 20 50 34 20 28 74 79 70 65 20 50  ed as P4 (type P
304d0 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e 20 0a  4_SUBPROGRAM). .
304e0 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61 69 6e  **.** P1 contain
304f0 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  s the address of
30500 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
30510 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
30520 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
30530 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61  .** cell in an a
30540 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 75  rray of values u
30550 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e 74 73  sed as arguments
30560 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72 6f 67   to the sub-prog
30570 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f 6e 74  ram. P2 .** cont
30580 61 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73  ains the address
30590 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 20 74   to jump to if t
305a0 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 74  he sub-program t
305b0 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52 45 20  hrows an IGNORE 
305c0 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 75 73  .** exception us
305d0 69 6e 67 20 74 68 65 20 52 41 49 53 45 28 29 20  ing the RAISE() 
305e0 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69 73 74  function. Regist
305f0 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74  er P3 contains t
30600 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a 20 6f  he address .** o
30610 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  f a memory cell 
30620 69 6e 20 74 68 69 73 20 28 74 68 65 20 70 61 72  in this (the par
30630 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69 73 20  ent) VM that is 
30640 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
30650 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20   the .** memory 
30660 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
30670 73 75 62 2d 76 64 62 65 20 61 74 20 72 75 6e 74  sub-vdbe at runt
30680 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  ime..**.** P4 is
30690 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
306a0 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  e VM containing 
306b0 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
306c0 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  ram..**.** If P5
306d0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
306e0 65 6e 20 72 65 63 75 72 73 69 76 65 20 70 72 6f  en recursive pro
306f0 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f 6e 20  gram invocation 
30700 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f 0a 63  is enabled..*/.c
30710 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d 3a 20  ase OP_Program: 
30720 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
30730 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
30740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30750 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
30760 79 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  y registers for 
30770 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  sub-program */. 
30780 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
30790 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
307a0 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73 70 61  s of runtime spa
307b0 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
307c0 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f 0a 20  sub-program */. 
307d0 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20 20 20   Mem *pRt;      
307e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
307f0 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ster to allocate
30800 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65 20 2a   runtime space *
30810 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 20 20  /.  Mem *pMem;  
30820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
30830 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
30840 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20 63 65  hrough memory ce
30850 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 45  lls */.  Mem *pE
30860 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
30870 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72 79 20   /* Last memory 
30880 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72 72 61  cell in new arra
30890 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61 6d 65  y */.  VdbeFrame
308a0 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20 20 2f   *pFrame;      /
308b0 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61 6d 65  * New vdbe frame
308c0 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e 20 2a   to execute in *
308d0 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
308e0 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a 20 53  pProgram;   /* S
308f0 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20 65 78  ub-program to ex
30900 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69 64 20  ecute */.  void 
30910 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *t;             
30920 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64 65 6e     /* Token iden
30930 74 69 66 79 69 6e 67 20 74 72 69 67 67 65 72 20  tifying trigger 
30940 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d 20 3d  */..  pProgram =
30950 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
30960 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d 65 6d  m;.  pRt = &aMem
30970 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
30980 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  ert( pProgram->n
30990 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  Op>0 );.  .  /* 
309a0 49 66 20 74 68 65 20 70 35 20 66 6c 61 67 20 69  If the p5 flag i
309b0 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72 65  s clear, then re
309c0 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61 74 69  cursive invocati
309d0 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73 20 69  on of triggers i
309e0 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c 65 64  s .  ** disabled
309f0 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   for backwards c
30a00 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28 70 35  ompatibility (p5
30a10 20 69 73 20 73 65 74 20 69 66 20 74 68 69 73 20   is set if this 
30a20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20 2a 2a  sub-program.  **
30a30 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74 72 69   is really a tri
30a40 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f 72 65  gger, not a fore
30a50 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e 2c 20  ign key action, 
30a60 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73 65 74  and the flag set
30a70 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 65  .  ** and cleare
30a80 64 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  d by the "PRAGMA
30a90 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
30aa0 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ers" command is 
30ab0 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a 20 20  clear)..  ** .  
30ac0 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72 73 69  ** It is recursi
30ad0 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  ve invocation of
30ae0 20 74 72 69 67 67 65 72 73 2c 20 61 74 20 74 68   triggers, at th
30af0 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74 68 61  e SQL level, tha
30b00 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62  t is .  ** disab
30b10 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  led. In some cas
30b20 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72 69 67  es a single trig
30b30 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61 74 65  ger may generate
30b40 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 0a   more than one .
30b50 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61 6d 20    ** SubProgram 
30b60 28 69 66 20 74 68 65 20 74 72 69 67 67 65 72 20  (if the trigger 
30b70 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
30b80 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20 6f  with more than o
30b90 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a 20 20  ne different .  
30ba0 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 61  ** ON CONFLICT a
30bb0 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62 50 72  lgorithm). SubPr
30bc0 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72 65 73  ogram structures
30bd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
30be0 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65 20 74   a.  ** single t
30bf0 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76 65 20  rigger all have 
30c00 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 66  the same value f
30c10 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  or the SubProgra
30c20 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20 76 61  m.token .  ** va
30c30 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  riable.  */.  if
30c40 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20 20  ( pOp->p5 ){.   
30c50 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74   t = pProgram->t
30c60 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 70 46  oken;.    for(pF
30c70 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
30c80 70 46 72 61 6d 65 20 26 26 20 70 46 72 61 6d 65  pFrame && pFrame
30c90 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46 72 61  ->token!=t; pFra
30ca0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
30cb0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nt);.    if( pFr
30cc0 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ame ) break;.  }
30cd0 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 61 6d  ..  if( p->nFram
30ce0 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e>=db->aLimit[SQ
30cf0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
30d00 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20 20 20  ER_DEPTH] ){.   
30d10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
30d20 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
30d30 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74 6f 6f  dbeError(p, "too
30d40 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
30d50 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
30d60 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  n");.    goto ab
30d70 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
30d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
30d90 73 74 65 72 20 70 52 74 20 69 73 20 75 73 65 64  ster pRt is used
30da0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6d 65   to store the me
30db0 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 74 6f  mory required to
30dc0 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 0a   save the state.
30dd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72    ** of the curr
30de0 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61 6e 64  ent program, and
30df0 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
30e00 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d 65 20  ired at runtime 
30e10 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a 2a 20  to execute.  ** 
30e20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f 67  the trigger prog
30e30 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74 72 69  ram. If this tri
30e40 67 67 65 72 20 68 61 73 20 62 65 65 6e 20 66 69  gger has been fi
30e50 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  red before, then
30e60 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20 61 6c   pRt .  ** is al
30e70 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 2e  ready allocated.
30e80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
30e90 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ust be initializ
30ea0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  ed.  */.  if( (p
30eb0 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 46 72  Rt->flags&MEM_Fr
30ec0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ame)==0 ){.    /
30ed0 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e 4d 65  * SubProgram.nMe
30ee0 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  m is set to the 
30ef0 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79  number of memory
30f00 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79 20 74   cells used by t
30f10 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f 67 72  he .    ** progr
30f20 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53 75 62  am stored in Sub
30f30 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41 73 20  Program.aOp. As 
30f40 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c 20 6f  well as these, o
30f50 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  ne memory.    **
30f60 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69 72 65   cell is require
30f70 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73 6f  d for each curso
30f80 72 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  r used by the pr
30f90 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63 61 6c  ogram. Set local
30fa0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
30fb0 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74 65 72   nMem (and later
30fc0 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43 68 69  , VdbeFrame.nChi
30fd0 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73 20 76  ldMem) to this v
30fe0 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
30ff0 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72 61 6d   nMem = pProgram
31000 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67 72 61  ->nMem + pProgra
31010 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61 73 73  m->nCsr;.    ass
31020 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b 0a 20  ert( nMem>0 );. 
31030 20 20 20 69 66 28 20 70 50 72 6f 67 72 61 6d 2d     if( pProgram-
31040 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65 6d 2b  >nCsr==0 ) nMem+
31050 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52  +;.    nByte = R
31060 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56 64 62  OUND8(sizeof(Vdb
31070 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20 20 20  eFrame)).       
31080 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20 2a 20         + nMem * 
31090 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20 20 20  sizeof(Mem).    
310a0 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 72 6f            + pPro
310b0 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73 69 7a  gram->nCsr * siz
310c0 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eof(VdbeCursor *
310d0 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d 20  );.    pFrame = 
310e0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
310f0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
31100 20 20 20 20 69 66 28 20 21 70 46 72 61 6d 65 20      if( !pFrame 
31110 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f  ){.      goto no
31120 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _mem;.    }.    
31130 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
31140 6c 65 61 73 65 28 70 52 74 29 3b 0a 20 20 20 20  lease(pRt);.    
31150 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  pRt->flags = MEM
31160 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70 52 74 2d  _Frame;.    pRt-
31170 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70 46 72 61  >u.pFrame = pFra
31180 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61 6d 65 2d  me;..    pFrame-
31190 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46 72 61  >v = p;.    pFra
311a0 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 3d 20  me->nChildMem = 
311b0 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65  nMem;.    pFrame
311c0 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20 70 50  ->nChildCsr = pP
311d0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20  rogram->nCsr;.  
311e0 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d 20 28    pFrame->pc = (
311f0 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b  int)(pOp - aOp);
31200 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4d 65  .    pFrame->aMe
31210 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20  m = p->aMem;.   
31220 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20 3d 20   pFrame->nMem = 
31230 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72  p->nMem;.    pFr
31240 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20 70 2d 3e  ame->apCsr = p->
31250 61 70 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d  apCsr;.    pFram
31260 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 2d 3e  e->nCursor = p->
31270 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 46 72  nCursor;.    pFr
31280 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e 61 4f  ame->aOp = p->aO
31290 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 6e  p;.    pFrame->n
312a0 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = p->nOp;.   
312b0 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e 20 3d   pFrame->token =
312c0 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b 65 6e   pProgram->token
312d0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
312e0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
312f0 53 54 41 54 55 53 0a 20 20 20 20 70 46 72 61 6d  STATUS.    pFram
31300 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d 3e 61  e->anExec = p->a
31310 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  nExec;.#endif.. 
31320 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62 65 46     pEnd = &VdbeF
31330 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 5b  rameMem(pFrame)[
31340 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
31350 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d 65 6d  m];.    for(pMem
31360 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46  =VdbeFrameMem(pF
31370 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70 45 6e  rame); pMem!=pEn
31380 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  d; pMem++){.    
31390 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
313a0 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
313b0 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20       pMem->db = 
313c0 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  db;.    }.  }els
313d0 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20 3d 20  e{.    pFrame = 
313e0 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b 0a 20  pRt->u.pFrame;. 
313f0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 6f 67     assert( pProg
31400 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f 67 72  ram->nMem+pProgr
31410 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65  am->nCsr==pFrame
31420 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 0a 20 20 20  ->nChildMem .   
31430 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 67 72 61       || (pProgra
31440 6d 2d 3e 6e 43 73 72 3d 3d 30 20 26 26 20 70 50  m->nCsr==0 && pP
31450 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 31 3d 3d  rogram->nMem+1==
31460 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65  pFrame->nChildMe
31470 6d 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  m) );.    assert
31480 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  ( pProgram->nCsr
31490 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
314a0 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Csr );.    asser
314b0 74 28 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61  t( (int)(pOp - a
314c0 4f 70 29 3d 3d 70 46 72 61 6d 65 2d 3e 70 63 20  Op)==pFrame->pc 
314d0 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e 46 72  );.  }..  p->nFr
314e0 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d 65 2d  ame++;.  pFrame-
314f0 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 46  >pParent = p->pF
31500 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  rame;.  pFrame->
31510 6c 61 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e  lastRowid = db->
31520 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72  lastRowid;.  pFr
31530 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  ame->nChange = p
31540 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 70 46 72  ->nChange;.  pFr
31550 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 20 3d  ame->nDbChange =
31560 20 70 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 3b   p->db->nChange;
31570 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 61 6d  .  assert( pFram
31580 65 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  e->pAuxData==0 )
31590 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  ;.  pFrame->pAux
315a0 44 61 74 61 20 3d 20 70 2d 3e 70 41 75 78 44 61  Data = p->pAuxDa
315b0 74 61 3b 0a 20 20 70 2d 3e 70 41 75 78 44 61 74  ta;.  p->pAuxDat
315c0 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68 61  a = 0;.  p->nCha
315d0 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46  nge = 0;.  p->pF
315e0 72 61 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20  rame = pFrame;. 
315f0 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20   p->aMem = aMem 
31600 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
31610 46 72 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65  Frame);.  p->nMe
31620 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69  m = pFrame->nChi
31630 6c 64 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72  ldMem;.  p->nCur
31640 73 6f 72 20 3d 20 28 75 31 36 29 70 46 72 61 6d  sor = (u16)pFram
31650 65 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20  e->nChildCsr;.  
31660 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62 65  p->apCsr = (Vdbe
31670 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
31680 70 2d 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 2d 3e 61  p->nMem];.  p->a
31690 4f 70 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67  Op = aOp = pProg
316a0 72 61 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e  ram->aOp;.  p->n
316b0 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  Op = pProgram->n
316c0 4f 70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Op;.#ifdef SQLIT
316d0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
316e0 41 4e 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e  ANSTATUS.  p->an
316f0 45 78 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Exec = 0;.#endif
31700 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 2d 31  .  pOp = &aOp[-1
31710 5d 3b 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ];..  break;.}..
31720 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d  /* Opcode: Param
31730 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
31740 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69  ** This opcode i
31750 73 20 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73  s only ever pres
31760 65 6e 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72  ent in sub-progr
31770 61 6d 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ams called via t
31780 68 65 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61  he .** OP_Progra
31790 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43  m instruction. C
317a0 6f 70 79 20 61 20 76 61 6c 75 65 20 63 75 72 72  opy a value curr
317b0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
317c0 61 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  a memory .** cel
317d0 6c 20 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67  l of the calling
317e0 20 28 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20   (parent) frame 
317f0 74 6f 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68  to cell P2 in th
31800 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73  e current frames
31810 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
31820 63 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ce. This is used
31830 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f 67   by trigger prog
31840 72 61 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74  rams to access t
31850 68 65 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64  he new.* .** and
31860 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a   old.* values..*
31870 2a 0a 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73  *.** The address
31880 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20   of the cell in 
31890 74 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65  the parent frame
318a0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
318b0 79 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20  y adding.** the 
318c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
318d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
318e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20  value of the P1 
318f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
31900 2a 2a 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72  ** calling OP_Pr
31910 6f 67 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f  ogram instructio
31920 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61  n..*/.case OP_Pa
31930 72 61 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20  ram: {          
31940 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64   /* out2 */.  Vd
31950 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
31960 0a 20 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70  .  Mem *pIn;.  p
31970 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
31980 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
31990 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61  pFrame = p->pFra
319a0 6d 65 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46 72  me;.  pIn = &pFr
319b0 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
319c0 31 20 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b  1 + pFrame->aOp[
319d0 70 46 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b  pFrame->pc].p1];
319e0 20 20 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62     .  sqlite3Vdb
319f0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
31a00 70 4f 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45  pOut, pIn, MEM_E
31a10 70 68 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  phem);.  break;.
31a20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  }..#endif /* #if
31a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31a40 5f 54 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66  _TRIGGER */..#if
31a50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31a60 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20  _FOREIGN_KEY./* 
31a70 4f 70 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65  Opcode: FkCounte
31a80 72 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  r P1 P2 * * *.**
31a90 20 53 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74 72   Synopsis: fkctr
31aa0 5b 50 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49  [P1]+=P2.**.** I
31ab0 6e 63 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73  ncrement a "cons
31ac0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20  traint counter" 
31ad0 62 79 20 50 32 20 28 50 32 20 6d 61 79 20 62 65  by P2 (P2 may be
31ae0 20 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73   negative or pos
31af0 69 74 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31  itive)..** If P1
31b00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
31b10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74  e database const
31b20 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73  raint counter is
31b30 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a   incremented .**
31b40 20 28 64 65 66 65 72 72 65 64 20 66 6f 72 65 69   (deferred forei
31b50 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
31b60 74 73 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ts). Otherwise, 
31b70 69 66 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74  if P1 is zero, t
31b80 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
31b90 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72   counter is incr
31ba0 65 6d 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61  emented (immedia
31bb0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
31bc0 6f 6e 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a  onstraints)..*/.
31bd0 63 61 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65  case OP_FkCounte
31be0 72 3a 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66  r: {.  if( db->f
31bf0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65  lags & SQLITE_De
31c00 66 65 72 46 4b 73 20 29 7b 0a 20 20 20 20 64 62  ferFKs ){.    db
31c10 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
31c20 6e 73 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  ns += pOp->p2;. 
31c30 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
31c40 70 31 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  p1 ){.    db->nD
31c50 65 66 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70  eferredCons += p
31c60 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b  Op->p2;.  }else{
31c70 0a 20 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  .    p->nFkConst
31c80 72 61 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32  raint += pOp->p2
31c90 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
31ca0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49  ../* Opcode: FkI
31cb0 66 5a 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20  fZero P1 P2 * * 
31cc0 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
31cd0 66 20 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20 67  f fkctr[P1]==0 g
31ce0 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69  oto P2.**.** Thi
31cf0 73 20 6f 70 63 6f 64 65 20 74 65 73 74 73 20 69  s opcode tests i
31d00 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
31d10 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74  constraint-count
31d20 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
31d30 7a 65 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20  zero..** If so, 
31d40 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
31d50 69 6f 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73  ion P2. Otherwis
31d60 65 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  e, fall through 
31d70 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  to the next .** 
31d80 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
31d90 2a 2a 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d  ** If P1 is non-
31da0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
31db0 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20  ump is taken if 
31dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
31dd0 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a  straint-counter.
31de0 2a 2a 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20  ** is zero (the 
31df0 6f 6e 65 20 74 68 61 74 20 63 6f 75 6e 74 73 20  one that counts 
31e00 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
31e10 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
31e20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72   If P1 is.** zer
31e30 6f 2c 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  o, the jump is t
31e40 61 6b 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  aken if the stat
31e50 65 6d 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  ement constraint
31e60 2d 63 6f 75 6e 74 65 72 20 69 73 20 7a 65 72 6f  -counter is zero
31e70 0a 2a 2a 20 28 69 6d 6d 65 64 69 61 74 65 20 66  .** (immediate f
31e80 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
31e90 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
31ea0 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b  )..*/.case OP_Fk
31eb0 49 66 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20  IfZero: {       
31ec0 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
31ed0 66 28 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20  f( pOp->p1 ){.  
31ee0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
31ef0 6e 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43  n(db->nDeferredC
31f00 6f 6e 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44  ons==0 && db->nD
31f10 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d  eferredImmCons==
31f20 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 64  0, 2);.    if( d
31f30 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
31f40 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65  ==0 && db->nDefe
31f50 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29  rredImmCons==0 )
31f60 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
31f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
31f80 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70  dbeBranchTaken(p
31f90 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d  ->nFkConstraint=
31fa0 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  =0 && db->nDefer
31fb0 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32  redImmCons==0, 2
31fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46  );.    if( p->nF
31fd0 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26  kConstraint==0 &
31fe0 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
31ff0 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f  mmCons==0 ) goto
32000 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
32010 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
32020 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
32030 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
32040 4e 5f 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  N_KEY */..#ifnde
32050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32060 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f  TOINCREMENT./* O
32070 70 63 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31  pcode: MemMax P1
32080 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
32090 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61 78  opsis: r[P1]=max
320a0 28 72 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a  (r[P1],r[P2]).**
320b0 0a 2a 2a 20 50 31 20 69 73 20 61 20 72 65 67 69  .** P1 is a regi
320c0 73 74 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74  ster in the root
320d0 20 66 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56   frame of this V
320e0 4d 20 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d  M (the root fram
320f0 65 20 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e  e is.** differen
32100 74 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  t from the curre
32110 6e 74 20 66 72 61 6d 65 20 69 66 20 74 68 69 73  nt frame if this
32120 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
32130 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a  being executed.*
32140 2a 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70  * within a sub-p
32150 72 6f 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65  rogram). Set the
32160 20 76 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74   value of regist
32170 65 72 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78  er P1 to the max
32180 69 6d 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20  imum of .** its 
32190 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e  current value an
321a0 64 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  d the value in r
321b0 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a  egister P2..**.*
321c0 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
321d0 6f 6e 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72  on throws an err
321e0 6f 72 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79  or if the memory
321f0 20 63 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69   cell is not ini
32200 74 69 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74  tially.** an int
32210 65 67 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eger..*/.case OP
32220 5f 4d 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20  _MemMax: {      
32230 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64    /* in2 */.  Vd
32240 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
32250 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
32260 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61   ){.    for(pFra
32270 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
32280 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
32290 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
322a0 61 72 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31  arent);.    pIn1
322b0 20 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d   = &pFrame->aMem
322c0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c  [pOp->p1];.  }el
322d0 73 65 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  se{.    pIn1 = &
322e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
322f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d   }.  assert( mem
32300 49 73 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b  IsValid(pIn1) );
32310 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
32320 6d 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31  mIntegerify(pIn1
32330 29 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65  );.  pIn2 = &aMe
32340 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71  m[pOp->p2];.  sq
32350 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65  lite3VdbeMemInte
32360 67 65 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20  gerify(pIn2);.  
32370 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49  if( pIn1->u.i<pI
32380 6e 32 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49  n2->u.i){.    pI
32390 6e 31 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e  n1->u.i = pIn2->
323a0 75 2e 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  u.i;.  }.  break
323b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
323c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
323d0 43 52 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f  CREMENT */../* O
323e0 70 63 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20  pcode: IfPos P1 
323f0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
32400 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e  opsis: if r[P1]>
32410 30 20 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33  0 then r[P1]-=P3
32420 2c 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20  , goto P2.**.** 
32430 52 65 67 69 73 74 65 72 20 50 31 20 6d 75 73 74  Register P1 must
32440 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
32450 67 65 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76  ger..** If the v
32460 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
32470 20 50 31 20 69 73 20 31 20 6f 72 20 67 72 65 61   P1 is 1 or grea
32480 74 65 72 2c 20 73 75 62 74 72 61 63 74 20 50 33  ter, subtract P3
32490 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61 6c   from the.** val
324a0 75 65 20 69 6e 20 50 31 20 61 6e 64 20 6a 75 6d  ue in P1 and jum
324b0 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49  p to P2..**.** I
324c0 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  f the initial va
324d0 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20  lue of register 
324e0 50 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  P1 is less than 
324f0 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 76  1, then the.** v
32500 61 6c 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65  alue is unchange
32510 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70 61  d and control pa
32520 73 73 65 73 20 74 68 72 6f 75 67 68 20 74 6f 20  sses through to 
32530 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
32540 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  tion..*/.case OP
32550 5f 49 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20  _IfPos: {       
32560 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f   /* jump, in1 */
32570 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
32580 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
32590 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26  rt( pIn1->flags&
325a0 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62  MEM_Int );.  Vdb
325b0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 70 49  eBranchTaken( pI
325c0 6e 31 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a 20  n1->u.i>0, 2);. 
325d0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30   if( pIn1->u.i>0
325e0 20 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e   ){.    pIn1->u.
325f0 69 20 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  i -= pOp->p3;.  
32600 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
32610 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
32620 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 66  }../* Opcode: Of
32630 66 73 65 74 4c 69 6d 69 74 20 50 31 20 50 32 20  fsetLimit P1 P2 
32640 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
32650 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74  is: if r[P1]>0 t
32660 68 65 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b  hen r[P2]=r[P1]+
32670 6d 61 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c 73  max(0,r[P3]) els
32680 65 20 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a  e r[P2]=(-1).**.
32690 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 70  ** This opcode p
326a0 65 72 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e  erforms a common
326b0 6c 79 20 75 73 65 64 20 63 6f 6d 70 75 74 61 74  ly used computat
326c0 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
326d0 69 74 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e 64  ith.** LIMIT and
326e0 20 4f 46 46 53 45 54 20 70 72 6f 63 65 73 73 2e   OFFSET process.
326f0 20 20 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74 68    r[P1] holds th
32700 65 20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72 2e  e limit counter.
32710 20 20 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73    r[P3].** holds
32720 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e   the offset coun
32730 74 65 72 2e 20 20 54 68 65 20 6f 70 63 6f 64 65  ter.  The opcode
32740 20 63 6f 6d 70 75 74 65 73 20 74 68 65 20 63 6f   computes the co
32750 6d 62 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a 20  mbined value.** 
32760 6f 66 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  of the LIMIT and
32770 20 4f 46 46 53 45 54 20 61 6e 64 20 73 74 6f 72   OFFSET and stor
32780 65 73 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  es that value in
32790 20 72 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b 50   r[P2].  The r[P
327a0 32 5d 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d 70  2].** value comp
327b0 75 74 65 64 20 69 73 20 74 68 65 20 74 6f 74 61  uted is the tota
327c0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  l number of rows
327d0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20   that will need 
327e0 74 6f 20 62 65 0a 2a 2a 20 76 69 73 69 74 65 64  to be.** visited
327f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d   in order to com
32800 70 6c 65 74 65 20 74 68 65 20 71 75 65 72 79 2e  plete the query.
32810 0a 2a 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d 20  .**.** If r[P3] 
32820 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
32830 69 76 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ive, that means 
32840 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 46 46 53  there is no OFFS
32850 45 54 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d 20  ET.** and r[P2] 
32860 69 73 20 73 65 74 20 74 6f 20 62 65 20 74 68 65  is set to be the
32870 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4c 49   value of the LI
32880 4d 49 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a  MIT, r[P1]..**.*
32890 2a 20 69 66 20 72 5b 50 31 5d 20 69 73 20 7a 65  * if r[P1] is ze
328a0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20  ro or negative, 
328b0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72 65  that means there
328c0 20 69 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20   is no LIMIT.** 
328d0 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74  and r[P2] is set
328e0 20 74 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f   to -1. .**.** O
328f0 74 68 65 72 77 69 73 65 2c 20 72 5b 50 32 5d 20  therwise, r[P2] 
32900 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
32910 6d 20 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20 72  m of r[P1] and r
32920 5b 50 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  [P3]..*/.case OP
32930 5f 4f 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b 20  _OffsetLimit: { 
32940 20 20 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 2c     /* in1, out2,
32950 20 69 6e 33 20 2a 2f 0a 20 20 69 36 34 20 78 3b   in3 */.  i64 x;
32960 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
32970 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33  pOp->p1];.  pIn3
32980 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
32990 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ];.  pOut = out2
329a0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
329b0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  p);.  assert( pI
329c0 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
329d0 49 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Int );.  assert(
329e0 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d   pIn3->flags & M
329f0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 78 20 3d 20  EM_Int );.  x = 
32a00 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 69 66 28  pIn1->u.i;.  if(
32a10 20 78 3c 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   x<=0 || sqlite3
32a20 41 64 64 49 6e 74 36 34 28 26 78 2c 20 70 49 6e  AddInt64(&x, pIn
32a30 33 2d 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75  3->u.i>0?pIn3->u
32a40 2e 69 3a 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20  .i:0) ){.    /* 
32a50 49 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  If the LIMIT is 
32a60 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
32a70 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70  al to zero, loop
32a80 20 66 6f 72 65 76 65 72 2e 20 20 54 68 69 73 0a   forever.  This.
32a90 20 20 20 20 2a 2a 20 69 73 20 64 6f 63 75 6d 65      ** is docume
32aa0 6e 74 65 64 2e 20 20 42 75 74 20 61 6c 73 6f 2c  nted.  But also,
32ab0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46   if the LIMIT+OF
32ac0 46 53 45 54 20 65 78 63 65 65 64 73 20 32 5e 36  FSET exceeds 2^6
32ad0 33 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  3 then.    ** al
32ae0 73 6f 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e  so loop forever.
32af0 20 20 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75    This is undocu
32b00 6d 65 6e 74 65 64 2e 20 20 49 6e 20 66 61 63 74  mented.  In fact
32b10 2c 20 6f 6e 65 20 63 6f 75 6c 64 20 61 72 67 75  , one could argu
32b20 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  e.    ** that th
32b30 65 20 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 74 65  e loop should te
32b40 72 6d 69 6e 61 74 65 2e 20 20 42 75 74 20 61 73  rminate.  But as
32b50 73 75 6d 69 6e 67 20 31 20 62 69 6c 6c 69 6f 6e  suming 1 billion
32b60 20 69 74 65 72 61 74 69 6f 6e 73 0a 20 20 20 20   iterations.    
32b70 2a 2a 20 70 65 72 20 73 65 63 6f 6e 64 20 28 66  ** per second (f
32b80 61 72 20 65 78 63 65 65 64 69 6e 67 20 74 68 65  ar exceeding the
32b90 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 6f 66   capabilities of
32ba0 20 61 6e 79 20 63 75 72 72 65 6e 74 20 68 61 72   any current har
32bb0 64 77 61 72 65 29 0a 20 20 20 20 2a 2a 20 69 74  dware).    ** it
32bc0 20 77 6f 75 6c 64 20 74 61 6b 65 20 6e 65 61 72   would take near
32bd0 6c 79 20 33 30 30 20 79 65 61 72 73 20 74 6f 20  ly 300 years to 
32be0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 20 74  actually reach t
32bf0 68 65 20 6c 69 6d 69 74 2e 20 20 53 6f 0a 20 20  he limit.  So.  
32c00 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f 72    ** looping for
32c10 65 76 65 72 20 69 73 20 61 20 72 65 61 73 6f 6e  ever is a reason
32c20 61 62 6c 65 20 61 70 70 72 6f 78 69 6d 61 74 69  able approximati
32c30 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 4f 75 74 2d  on. */.    pOut-
32c40 3e 75 2e 69 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  >u.i = -1;.  }el
32c50 73 65 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e  se{.    pOut->u.
32c60 69 20 3d 20 78 3b 0a 20 20 7d 0a 20 20 62 72 65  i = x;.  }.  bre
32c70 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
32c80 3a 20 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50  : IfNotZero P1 P
32c90 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
32ca0 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30  sis: if r[P1]!=0
32cb0 20 74 68 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67   then r[P1]--, g
32cc0 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67  oto P2.**.** Reg
32cd0 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f  ister P1 must co
32ce0 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ntain an integer
32cf0 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  .  If the conten
32d00 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  t of register P1
32d10 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
32d20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
32d30 72 6f 2c 20 74 68 65 6e 20 64 65 63 72 65 6d 65  ro, then decreme
32d40 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  nt the value in 
32d50 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20  register P1..** 
32d60 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
32d70 6f 20 28 6e 65 67 61 74 69 76 65 20 6f 72 20 70  o (negative or p
32d80 6f 73 69 74 69 76 65 29 20 61 6e 64 20 74 68 65  ositive) and the
32d90 6e 20 61 6c 73 6f 20 6a 75 6d 70 20 74 6f 20 50  n also jump to P
32da0 32 2e 20 20 0a 2a 2a 20 49 66 20 72 65 67 69 73  2.  .** If regis
32db0 74 65 72 20 50 31 20 69 73 20 69 6e 69 74 69 61  ter P1 is initia
32dc0 6c 6c 79 20 7a 65 72 6f 2c 20 6c 65 61 76 65 20  lly zero, leave 
32dd0 69 74 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  it unchanged and
32de0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
32df0 2f 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 5a  /.case OP_IfNotZ
32e00 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ero: {        /*
32e10 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
32e20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
32e30 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
32e40 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d   pIn1->flags&MEM
32e50 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72  _Int );.  VdbeBr
32e60 61 6e 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e  anchTaken(pIn1->
32e70 75 2e 69 3c 30 2c 20 32 29 3b 0a 20 20 69 66 28  u.i<0, 2);.  if(
32e80 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20 20   pIn1->u.i ){.  
32e90 20 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69     if( pIn1->u.i
32ea0 3e 30 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d  >0 ) pIn1->u.i--
32eb0 3b 0a 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70  ;.     goto jump
32ec0 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72  _to_p2;.  }.  br
32ed0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
32ee0 65 3a 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f 20  e: DecrJumpZero 
32ef0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
32f00 79 6e 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d 72  ynopsis: if (--r
32f10 5b 50 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 32  [P1])==0 goto P2
32f20 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
32f30 50 31 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e 20  P1 must hold an 
32f40 69 6e 74 65 67 65 72 2e 20 20 44 65 63 72 65 6d  integer.  Decrem
32f50 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ent the value in
32f60 20 50 31 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70 20   P1.** and jump 
32f70 74 6f 20 50 32 20 69 66 20 74 68 65 20 6e 65 77  to P2 if the new
32f80 20 76 61 6c 75 65 20 69 73 20 65 78 61 63 74 6c   value is exactl
32f90 79 20 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20  y zero..*/.case 
32fa0 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3a  OP_DecrJumpZero:
32fb0 20 7b 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c   {      /* jump,
32fc0 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
32fd0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
32fe0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d  .  assert( pIn1-
32ff0 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29  >flags&MEM_Int )
33000 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
33010 69 3e 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  i>SMALLEST_INT64
33020 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a   ) pIn1->u.i--;.
33030 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
33040 6e 28 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20  n(pIn1->u.i==0, 
33050 32 29 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e  2);.  if( pIn1->
33060 75 2e 69 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75  u.i==0 ) goto ju
33070 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
33080 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
33090 3a 20 41 67 67 53 74 65 70 30 20 2a 20 50 32 20  : AggStep0 * P2 
330a0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
330b0 70 73 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33  psis: accum=r[P3
330c0 5d 20 73 74 65 70 28 72 5b 50 32 40 50 35 5d 29  ] step(r[P2@P5])
330d0 0a 2a 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  .**.** Execute t
330e0 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  he step function
330f0 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
33100 65 2e 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74  e.  The.** funct
33110 69 6f 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d  ion has P5 argum
33120 65 6e 74 73 2e 20 20 20 50 34 20 69 73 20 61 20  ents.   P4 is a 
33130 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
33140 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
33150 75 72 65 20 74 68 61 74 20 73 70 65 63 69 66 69  ure that specifi
33160 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  es the function.
33170 20 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73    Register P3 is
33180 20 74 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61   the.** accumula
33190 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  tor..**.** The P
331a0 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  5 arguments are 
331b0 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73  taken from regis
331c0 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a  ter P2 and its.*
331d0 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f  * successors..*/
331e0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53  ./* Opcode: AggS
331f0 74 65 70 20 2a 20 50 32 20 50 33 20 50 34 20 50  tep * P2 P3 P4 P
33200 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61  5.** Synopsis: a
33210 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28  ccum=r[P3] step(
33220 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20  r[P2@P5]).**.** 
33230 45 78 65 63 75 74 65 20 74 68 65 20 73 74 65 70  Execute the step
33240 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e   function for an
33250 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 65   aggregate.  The
33260 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  .** function has
33270 20 50 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   P5 arguments.  
33280 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72   P4 is a pointer
33290 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63   to an sqlite3_c
332a0 6f 6e 74 65 78 74 0a 2a 2a 20 6f 62 6a 65 63 74  ontext.** object
332b0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
332c0 20 72 75 6e 20 74 68 65 20 66 75 6e 63 74 69 6f   run the functio
332d0 6e 2e 20 20 52 65 67 69 73 74 65 72 20 50 33 20  n.  Register P3 
332e0 69 73 0a 2a 2a 20 61 73 20 74 68 65 20 61 63 63  is.** as the acc
332f0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
33300 54 68 65 20 50 35 20 61 72 67 75 6d 65 6e 74 73  The P5 arguments
33310 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
33320 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 64 20  register P2 and 
33330 69 74 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72  its.** successor
33340 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  s..**.** This op
33350 63 6f 64 65 20 69 73 20 69 6e 69 74 69 61 6c 6c  code is initiall
33360 79 20 63 6f 64 65 64 20 61 73 20 4f 50 5f 41 67  y coded as OP_Ag
33370 67 53 74 65 70 30 2e 20 20 4f 6e 20 66 69 72 73  gStep0.  On firs
33380 74 20 65 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a  t evaluation,.**
33390 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74 6f   the FuncDef sto
333a0 72 65 64 20 69 6e 20 50 34 20 69 73 20 63 6f 6e  red in P4 is con
333b0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 73  verted into an s
333c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 61  qlite3_context a
333d0 6e 64 0a 2a 2a 20 74 68 65 20 6f 70 63 6f 64 65  nd.** the opcode
333e0 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 49 6e   is changed.  In
333f0 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 69   this way, the i
33400 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
33410 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
33420 63 6f 6e 74 65 78 74 20 6f 6e 6c 79 20 68 61 70  context only hap
33430 70 65 6e 73 20 6f 6e 63 65 2c 20 69 6e 73 74 65  pens once, inste
33440 61 64 20 6f 66 20 6f 6e 20 65 61 63 68 20 63 61  ad of on each ca
33450 6c 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 65  ll to the.** ste
33460 70 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  p function..*/.c
33470 61 73 65 20 4f 50 5f 41 67 67 53 74 65 70 30 3a  ase OP_AggStep0:
33480 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71   {.  int n;.  sq
33490 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
334a0 43 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Ctx;..  assert( 
334b0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
334c0 46 55 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20 3d  FUNCDEF );.  n =
334d0 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65   pOp->p5;.  asse
334e0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26  rt( pOp->p3>0 &&
334f0 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d   pOp->p3<=(p->nM
33500 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
33510 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
33520 6e 3d 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32  n==0 || (pOp->p2
33530 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c  >0 && pOp->p2+n<
33540 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
33550 3e 6e 43 75 72 73 6f 72 29 2b 31 29 20 29 3b 0a  >nCursor)+1) );.
33560 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
33570 33 3c 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70  3<pOp->p2 || pOp
33580 2d 3e 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20  ->p3>=pOp->p2+n 
33590 29 3b 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69  );.  pCtx = sqli
335a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
335b0 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74  (db, sizeof(*pCt
335c0 78 29 20 2b 20 28 6e 2d 31 29 2a 73 69 7a 65 6f  x) + (n-1)*sizeo
335d0 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  f(sqlite3_value*
335e0 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d  ));.  if( pCtx==
335f0 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  0 ) goto no_mem;
33600 0a 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20  .  pCtx->pMem = 
33610 30 3b 0a 20 20 70 43 74 78 2d 3e 70 46 75 6e 63  0;.  pCtx->pFunc
33620 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
33630 3b 0a 20 20 70 43 74 78 2d 3e 69 4f 70 20 3d 20  ;.  pCtx->iOp = 
33640 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29  (int)(pOp - aOp)
33650 3b 0a 20 20 70 43 74 78 2d 3e 70 56 64 62 65 20  ;.  pCtx->pVdbe 
33660 3d 20 70 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67  = p;.  pCtx->arg
33670 63 20 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34  c = n;.  pOp->p4
33680 74 79 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54  type = P4_FUNCCT
33690 58 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74  X;.  pOp->p4.pCt
336a0 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d  x = pCtx;.  pOp-
336b0 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67  >opcode = OP_Agg
336c0 53 74 65 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  Step;.  /* Fall 
336d0 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
336e0 41 67 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73  AggStep */.}.cas
336f0 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a  e OP_AggStep: {.
33700 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
33710 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
33720 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
33730 20 4d 65 6d 20 74 3b 0a 0a 20 20 61 73 73 65 72   Mem t;..  asser
33740 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
33750 50 34 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20 20  P4_FUNCCTX );.  
33760 70 43 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pCtx = pOp->p4.p
33770 43 74 78 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61  Ctx;.  pMem = &a
33780 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20  Mem[pOp->p3];.. 
33790 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63   /* If this func
337a0 74 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f  tion is inside o
337b0 66 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  f a trigger, the
337c0 20 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20   register array 
337d0 69 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d  in aMem[].  ** m
337e0 69 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d  ight change from
337f0 20 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   one evaluation 
33800 74 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68  to the next.  Th
33810 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
33820 63 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73  code.  ** checks
33830 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
33840 65 67 69 73 74 65 72 20 61 72 72 61 79 20 68 61  egister array ha
33850 73 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69  s changed, and i
33860 66 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69  f so it.  ** rei
33870 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72  nitializes the r
33880 65 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66  elavant parts of
33890 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e   the sqlite3_con
338a0 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  text object */. 
338b0 20 69 66 28 20 70 43 74 78 2d 3e 70 4d 65 6d 20   if( pCtx->pMem 
338c0 21 3d 20 70 4d 65 6d 20 29 7b 0a 20 20 20 20 70  != pMem ){.    p
338d0 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d  Ctx->pMem = pMem
338e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 74 78  ;.    for(i=pCtx
338f0 2d 3e 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20  ->argc-1; i>=0; 
33900 69 2d 2d 29 20 70 43 74 78 2d 3e 61 72 67 76 5b  i--) pCtx->argv[
33910 69 5d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  i] = &aMem[pOp->
33920 70 32 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64  p2+i];.  }..#ifd
33930 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
33940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74    for(i=0; i<pCt
33950 78 2d 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  x->argc; i++){. 
33960 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73     assert( memIs
33970 56 61 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76  Valid(pCtx->argv
33980 5b 69 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49  [i]) );.    REGI
33990 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
339a0 70 32 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76  p2+i, pCtx->argv
339b0 5b 69 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  [i]);.  }.#endif
339c0 0a 0a 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20  ..  pMem->n++;. 
339d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
339e0 6e 69 74 28 26 74 2c 20 64 62 2c 20 4d 45 4d 5f  nit(&t, db, MEM_
339f0 4e 75 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70  Null);.  pCtx->p
33a00 4f 75 74 20 3d 20 26 74 3b 0a 20 20 70 43 74 78  Out = &t;.  pCtx
33a10 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 3d 20  ->fErrorOrAux = 
33a20 30 3b 0a 20 20 70 43 74 78 2d 3e 73 6b 69 70 46  0;.  pCtx->skipF
33a30 6c 61 67 20 3d 20 30 3b 0a 20 20 28 70 43 74 78  lag = 0;.  (pCtx
33a40 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 29  ->pFunc->xSFunc)
33a50 28 70 43 74 78 2c 70 43 74 78 2d 3e 61 72 67 63  (pCtx,pCtx->argc
33a60 2c 70 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f 2a  ,pCtx->argv); /*
33a70 20 49 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33   IMP: R-24505-23
33a80 32 33 30 20 2a 2f 0a 20 20 69 66 28 20 70 43 74  230 */.  if( pCt
33a90 78 2d 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 29  x->fErrorOrAux )
33aa0 7b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  {.    if( pCtx->
33ab0 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  isError ){.     
33ac0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
33ad0 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  r(p, "%s", sqlit
33ae0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 74  e3_value_text(&t
33af0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ));.      rc = p
33b00 43 74 78 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20  Ctx->isError;.  
33b10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
33b20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 74  dbeMemRelease(&t
33b30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33b40 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
33b50 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65  o_error;.  }else
33b60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 2e  {.    assert( t.
33b70 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20  flags==MEM_Null 
33b80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 74  );.  }.  if( pCt
33b90 78 2d 3e 73 6b 69 70 46 6c 61 67 20 29 7b 0a 20  x->skipFlag ){. 
33ba0 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
33bb0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  1].opcode==OP_Co
33bc0 6c 6c 53 65 71 20 29 3b 0a 20 20 20 20 69 20 3d  llSeq );.    i =
33bd0 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
33be0 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65 33   if( i ) sqlite3
33bf0 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
33c00 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20  &aMem[i], 1);.  
33c10 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
33c20 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61   Opcode: AggFina
33c30 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  l P1 P2 * P4 *.*
33c40 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
33c50 6d 3d 72 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a  m=r[P1] N=P2.**.
33c60 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
33c70 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f  inalizer functio
33c80 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
33c90 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68  te.  P1 is.** th
33ca0 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
33cb0 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63  n that is the ac
33cc0 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68  cumulator for th
33cd0 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  e aggregate..**.
33ce0 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d  ** P2 is the num
33cf0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
33d00 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66   that the step f
33d10 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e  unction takes an
33d20 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  d.** P4 is a poi
33d30 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
33d40 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e  Def for this fun
33d50 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a  ction.  The P2.*
33d60 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  * argument is no
33d70 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f  t used by this o
33d80 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e  pcode.  It is on
33d90 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61  ly there to disa
33da0 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63  mbiguate.** func
33db0 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74  tions that can t
33dc0 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62  ake varying numb
33dd0 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ers of arguments
33de0 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67  .  The.** P4 arg
33df0 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65  ument is only ne
33e00 65 64 65 64 20 66 6f 72 20 74 68 65 20 64 65 67  eded for the deg
33e10 65 6e 65 72 61 74 65 20 63 61 73 65 20 77 68 65  enerate case whe
33e20 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66  re.** the step f
33e30 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  unction was not 
33e40 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
33e50 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  d..*/.case OP_Ag
33e60 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20  gFinal: {.  Mem 
33e70 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  *pMem;.  assert(
33e80 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
33e90 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
33ea0 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
33eb0 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65  );.  pMem = &aMe
33ec0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
33ed0 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
33ee0 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c  gs & ~(MEM_Null|
33ef0 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a  MEM_Agg))==0 );.
33f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
33f10 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d  beMemFinalize(pM
33f20 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  em, pOp->p4.pFun
33f30 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  c);.  if( rc ){.
33f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
33f50 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71  rror(p, "%s", sq
33f60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
33f70 28 70 4d 65 6d 29 29 3b 0a 20 20 20 20 67 6f 74  (pMem));.    got
33f80 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
33f90 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rror;.  }.  sqli
33fa0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
33fb0 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f  oding(pMem, enco
33fc0 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f  ding);.  UPDATE_
33fd0 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65  MAX_BLOBSIZE(pMe
33fe0 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  m);.  if( sqlite
33ff0 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
34000 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Mem) ){.    goto
34010 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
34020 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
34030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
34040 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65  L./* Opcode: Che
34050 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20 50 33  ckpoint P1 P2 P3
34060 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   * *.**.** Check
34070 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 50  point database P
34080 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  1. This is a no-
34090 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f 74 20  op if P1 is not 
340a0 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
340b0 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d 65  WAL mode. Parame
340c0 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20 6f 66  ter P2 is one of
340d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
340e0 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
340f0 2c 0a 2a 2a 20 52 45 53 54 41 52 54 2c 20 6f 72  ,.** RESTART, or
34100 20 54 52 55 4e 43 41 54 45 2e 20 20 57 72 69 74   TRUNCATE.  Writ
34110 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65  e 1 or 0 into me
34120 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68 65  m[P3] if the che
34130 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a  ckpoint returns.
34140 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  ** SQLITE_BUSY o
34150 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
34160 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65 20  ely.  Write the 
34170 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34180 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66  in the.** WAL af
34190 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
341a0 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31  nt into mem[P3+1
341b0 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
341c0 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20   of pages.** in 
341d0 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61 76  the WAL that hav
341e0 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
341f0 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  ted after the ch
34200 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70  eckpoint.** comp
34210 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50  letes into mem[P
34220 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f  3+2].  However o
34230 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b  n an error, mem[
34240 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d  P3+1] and.** mem
34250 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69  [P3+2] are initi
34260 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f  alized to -1..*/
34270 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f  .case OP_Checkpo
34280 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20  int: {.  int i; 
34290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
342b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
342c0 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20  t aRes[3];      
342d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
342e0 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65   Results */.  Me
342f0 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
34300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34310 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
34320 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ere */..  assert
34330 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
34340 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20   );.  aRes[0] = 
34350 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61  0;.  aRes[1] = a
34360 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61  Res[2] = -1;.  a
34370 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
34380 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
34390 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20 20  T_PASSIVE.      
343a0 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c   || pOp->p2==SQL
343b0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
343c0 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  ULL.       || pO
343d0 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
343e0 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
343f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
34400 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
34410 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 0a 20  POINT_TRUNCATE. 
34420 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
34430 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
34440 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
34450 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52  2, &aRes[1], &aR
34460 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63  es[2]);.  if( rc
34470 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
34480 53 51 4c 49 54 45 5f 42 55 53 59 20 29 20 67 6f  SQLITE_BUSY ) go
34490 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
344a0 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20  error;.    rc = 
344b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61  SQLITE_OK;.    a
344c0 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Res[0] = 1;.  }.
344d0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20    for(i=0, pMem 
344e0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
344f0 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d  ; i<3; i++, pMem
34500 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
34510 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
34520 70 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b  pMem, (i64)aRes[
34530 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62  i]);.  }    .  b
34540 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69  reak;.};  .#endi
34550 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
34560 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a  E_OMIT_PRAGMA./*
34570 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c   Opcode: Journal
34580 4d 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  Mode P1 P2 P3 * 
34590 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  *.**.** Change t
345a0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
345b0 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20 74  of database P1 t
345c0 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65  o P3. P3 must be
345d0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50   one of the.** P
345e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
345f0 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20  _XXX values. If 
34600 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
34610 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c   the various rol
34620 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28  lback.** modes (
34630 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
34640 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61  , persist, off a
34650 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73  nd memory), this
34660 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
34670 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f  operation. No IO
34680 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
34690 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20  .** If changing 
346a0 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57  into or out of W
346b0 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63  AL mode the proc
346c0 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f  edure is more co
346d0 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  mplicated..**.**
346e0 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67 20   Write a string 
346f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
34700 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  inal journal-mod
34710 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  e to register P2
34720 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75  ..*/.case OP_Jou
34730 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f  rnalMode: {    /
34740 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42 74 72 65  * out2 */.  Btre
34750 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  e *pBt;         
34760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
34770 74 72 65 65 20 74 6f 20 63 68 61 6e 67 65 20 6a  tree to change j
34780 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 2a  ournal mode of *
34790 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  /.  Pager *pPage
347a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
347b0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73      /* Pager ass
347c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
347d0 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77 3b 20   */.  int eNew; 
347e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347f0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6a 6f 75        /* New jou
34800 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  rnal mode */.  i
34810 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt eOld;        
34820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34830 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75 72 6e 61  * The old journa
34840 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  l mode */.#ifnde
34850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
34860 4c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  L.  const char *
34870 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
34880 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
34890 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
348a0 20 70 50 61 67 65 72 20 2a 2f 0a 23 65 6e 64 69   pPager */.#endi
348b0 66 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  f..  pOut = out2
348c0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
348d0 70 29 3b 0a 20 20 65 4e 65 77 20 3d 20 70 4f 70  p);.  eNew = pOp
348e0 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
348f0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
34900 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
34910 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
34920 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34930 45 5f 54 52 55 4e 43 41 54 45 20 0a 20 20 20 20  E_TRUNCATE .    
34940 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
34950 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
34960 52 53 49 53 54 20 0a 20 20 20 20 20 20 20 7c 7c  RSIST .       ||
34970 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
34980 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20  RNALMODE_OFF.   
34990 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
349a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
349b0 45 4d 4f 52 59 0a 20 20 20 20 20 20 20 7c 7c 20  EMORY.       || 
349c0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
349d0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20  NALMODE_WAL.    
349e0 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
349f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
34a00 45 52 59 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ERY.  );.  asser
34a10 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
34a20 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
34a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
34a40 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
34a50 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
34a60 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
34a70 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
34a80 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
34a90 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  eOld = sqlit
34aa0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
34ab0 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  lMode(pPager);. 
34ac0 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52   if( eNew==PAGER
34ad0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
34ae0 52 59 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  RY ) eNew = eOld
34af0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
34b00 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a  PagerOkToChangeJ
34b10 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
34b20 72 29 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  r) ) eNew = eOld
34b30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
34b40 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69  E_OMIT_WAL.  zFi
34b50 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
34b60 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 50  PagerFilename(pP
34b70 61 67 65 72 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  ager, 1);..  /* 
34b80 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 74  Do not allow a t
34b90 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 6a 6f 75  ransition to jou
34ba0 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f  rnal_mode=WAL fo
34bb0 72 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  r a database.  *
34bc0 2a 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 73  * in temporary s
34bd0 74 6f 72 61 67 65 20 6f 72 20 69 66 20 74 68 65  torage or if the
34be0 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 73 75   VFS does not su
34bf0 70 70 6f 72 74 20 73 68 61 72 65 64 20 6d 65 6d  pport shared mem
34c00 6f 72 79 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ory .  */.  if( 
34c10 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
34c20 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 26  NALMODE_WAL.   &
34c30 26 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  & (sqlite3Strlen
34c40 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  30(zFilename)==0
34c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
34c60 6d 70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  mp file */.     
34c70 20 20 7c 7c 20 21 73 71 6c 69 74 65 33 50 61 67    || !sqlite3Pag
34c80 65 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28 70  erWalSupported(p
34c90 50 61 67 65 72 29 29 20 20 20 2f 2a 20 4e 6f 20  Pager))   /* No 
34ca0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 75  shared-memory su
34cb0 70 70 6f 72 74 20 2a 2f 0a 20 20 29 7b 0a 20 20  pport */.  ){.  
34cc0 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20    eNew = eOld;. 
34cd0 20 7d 0a 0a 20 20 69 66 28 20 28 65 4e 65 77 21   }..  if( (eNew!
34ce0 3d 65 4f 6c 64 29 0a 20 20 20 26 26 20 28 65 4f  =eOld).   && (eO
34cf0 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
34d00 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20 65 4e 65  LMODE_WAL || eNe
34d10 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
34d20 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 29 7b 0a 20  MODE_WAL).  ){. 
34d30 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
34d40 43 6f 6d 6d 69 74 20 7c 7c 20 64 62 2d 3e 6e 56  Commit || db->nV
34d50 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
34d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
34d70 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
34d80 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a  te3VdbeError(p,.
34d90 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
34da0 74 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20  t change %s wal 
34db0 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  mode from within
34dc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
34dd0 0a 20 20 20 20 20 20 20 20 20 20 28 65 4e 65 77  .          (eNew
34de0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34df0 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22  ODE_WAL ? "into"
34e00 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20 20 20   : "out of").   
34e10 20 20 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f     );.      goto
34e20 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
34e30 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ror;.    }else{.
34e40 20 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6c 64   .      if( eOld
34e50 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34e60 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
34e70 20 20 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67     /* If leaving
34e80 20 57 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65   WAL mode, close
34e90 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
34ea0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
34eb0 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e call.        *
34ec0 2a 20 74 6f 20 50 61 67 65 72 43 6c 6f 73 65 57  * to PagerCloseW
34ed0 61 6c 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73  al() checkpoints
34ee0 20 61 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65   and deletes the
34ef0 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
34f00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c   .        ** fil
34f10 65 2e 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  e. An EXCLUSIVE 
34f20 6c 6f 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62  lock may still b
34f30 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
34f40 74 61 62 61 73 65 20 66 69 6c 65 20 0a 20 20 20  tabase file .   
34f50 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 61 20       ** after a 
34f60 73 75 63 63 65 73 73 66 75 6c 20 72 65 74 75 72  successful retur
34f70 6e 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  n. .        */. 
34f80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34f90 74 65 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c  te3PagerCloseWal
34fa0 28 70 50 61 67 65 72 2c 20 64 62 29 3b 0a 20 20  (pPager, db);.  
34fb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
34fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34fd0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
34fe0 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
34ff0 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20  pPager, eNew);. 
35000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35010 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50  else if( eOld==P
35020 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35030 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
35040 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61     /* Cannot tra
35050 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  nsition directly
35060 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20   from MEMORY to 
35070 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f  WAL.  Use mode O
35080 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  FF.        ** as
35090 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
350a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
350b0 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
350c0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 50  alMode(pPager, P
350d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
350e0 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _OFF);.      }. 
350f0 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   .      /* Open 
35100 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
35110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35120 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  le. Regardless o
35130 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
35140 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69      ** mode, thi
35150 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  s transaction al
35160 77 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c 6c  ways uses a roll
35170 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
35180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
35190 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
351a0 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d  eIsInTrans(pBt)=
351b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
351c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
351d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
351e0 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72  lite3BtreeSetVer
351f0 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d  sion(pBt, (eNew=
35200 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35210 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29  DE_WAL ? 2 : 1))
35220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35230 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
35240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35250 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72  _WAL */..  if( r
35260 63 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b  c ) eNew = eOld;
35270 0a 20 20 65 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  eNew = sqlite
35280 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
35290 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65  Mode(pPager, eNe
352a0 77 29 3b 0a 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  w);..  pOut->fla
352b0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
352c0 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d  _Static|MEM_Term
352d0 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 28 63  ;.  pOut->z = (c
352e0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4a 6f 75  har *)sqlite3Jou
352f0 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e 65  rnalModename(eNe
35300 77 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  w);.  pOut->n = 
35310 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
35320 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74  pOut->z);.  pOut
35330 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
35340 54 46 38 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TF8;.  sqlite3Vd
35350 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
35360 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29  (pOut, encoding)
35370 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
35380 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
35390 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
353a0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
353b0 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a  TE_OMIT_PRAGMA *
353c0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
353d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
353e0 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UM) && !defined(
353f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
35400 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  CH)./* Opcode: V
35410 61 63 75 75 6d 20 50 31 20 2a 20 2a 20 2a 20 2a  acuum P1 * * * *
35420 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68  .**.** Vacuum th
35430 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  e entire databas
35440 65 20 50 31 2e 20 20 50 31 20 69 73 20 30 20 66  e P1.  P1 is 0 f
35450 6f 72 20 22 6d 61 69 6e 22 2c 20 61 6e 64 20 32  or "main", and 2
35460 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20   or more.** for 
35470 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
35480 62 61 73 65 2e 20 20 54 68 65 20 22 74 65 6d 70  base.  The "temp
35490 22 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  " database may n
354a0 6f 74 20 62 65 20 76 61 63 75 75 6d 65 64 2e 0a  ot be vacuumed..
354b0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75  */.case OP_Vacuu
354c0 6d 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  m: {.  assert( p
354d0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
354e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
354f0 75 6e 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72  unVacuum(&p->zEr
35500 72 4d 73 67 2c 20 64 62 2c 20 70 4f 70 2d 3e 70  rMsg, db, pOp->p
35510 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
35520 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
35530 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
35540 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
35550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
35560 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
35570 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56  /* Opcode: IncrV
35580 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20 2a 20  acuum P1 P2 * * 
35590 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  *.**.** Perform 
355a0 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
355b0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
355c0 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64 75 72   vacuum procedur
355d0 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64  e on.** the P1 d
355e0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
355f0 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e 69 73  vacuum has finis
35600 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73  hed, jump to ins
35610 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20  truction.** P2. 
35620 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
35630 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
35640 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
35650 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72  .*/.case OP_Incr
35660 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20 20 20  Vacuum: {       
35670 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74   /* jump */.  Bt
35680 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73  ree *pBt;..  ass
35690 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
356a0 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
356b0 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
356c0 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
356d0 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31  reeMask, pOp->p1
356e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
356f0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
35700 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
35710 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
35720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
35730 65 65 49 6e 63 72 56 61 63 75 75 6d 28 70 42 74  eeIncrVacuum(pBt
35740 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
35750 61 6b 65 6e 28 72 63 3d 3d 53 51 4c 49 54 45 5f  aken(rc==SQLITE_
35760 44 4f 4e 45 2c 32 29 3b 0a 20 20 69 66 28 20 72  DONE,2);.  if( r
35770 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21  c ){.    if( rc!
35780 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 67  =SQLITE_DONE ) g
35790 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
357a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d  _error;.    rc =
357b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
357c0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
357d0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
357e0 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
357f0 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a  e: Expire P1 * *
35800 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65   * *.**.** Cause
35810 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
35820 74 65 6d 65 6e 74 73 20 74 6f 20 65 78 70 69 72  tements to expir
35830 65 2e 20 20 57 68 65 6e 20 61 6e 20 65 78 70 69  e.  When an expi
35840 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  red statement.**
35850 20 69 73 20 65 78 65 63 75 74 65 64 20 75 73 69   is executed usi
35860 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ng sqlite3_step(
35870 29 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72  ) it will either
35880 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a   automatically.*
35890 2a 20 72 65 70 72 65 70 61 72 65 20 69 74 73 65  * reprepare itse
358a0 6c 66 20 28 69 66 20 69 74 20 77 61 73 20 6f 72  lf (if it was or
358b0 69 67 69 6e 61 6c 6c 79 20 63 72 65 61 74 65 64  iginally created
358c0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 70   using sqlite3_p
358d0 72 65 70 61 72 65 5f 76 32 28 29 29 0a 2a 2a 20  repare_v2()).** 
358e0 6f 72 20 69 74 20 77 69 6c 6c 20 66 61 69 6c 20  or it will fail 
358f0 77 69 74 68 20 53 51 4c 49 54 45 5f 53 43 48 45  with SQLITE_SCHE
35900 4d 41 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31  MA..** .** If P1
35910 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20   is 0, then all 
35920 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
35930 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 49  ecome expired. I
35940 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
35950 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74  ,.** then only t
35960 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65  he currently exe
35970 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  cuting statement
35980 20 69 73 20 65 78 70 69 72 65 64 2e 0a 2a 2f 0a   is expired..*/.
35990 63 61 73 65 20 4f 50 5f 45 78 70 69 72 65 3a 20  case OP_Expire: 
359a0 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 31  {.  if( !pOp->p1
359b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
359c0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
359d0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d  tements(db);.  }
359e0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70  else{.    p->exp
359f0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ired = 1;.  }.  
35a00 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
35a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
35a20 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70  ARED_CACHE./* Op
35a30 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20  code: TableLock 
35a40 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
35a50 20 53 79 6e 6f 70 73 69 73 3a 20 69 44 62 3d 50   Synopsis: iDb=P
35a60 31 20 72 6f 6f 74 3d 50 32 20 77 72 69 74 65 3d  1 root=P2 write=
35a70 50 33 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  P3.**.** Obtain 
35a80 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74  a lock on a part
35a90 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68  icular table. Th
35aa0 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
35ab0 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
35ac0 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63  .** the shared-c
35ad0 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
35ae0 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  enabled. .**.** 
35af0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
35b00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35b10 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  in sqlite3.aDb[]
35b20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
35b30 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
35b40 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65   lock is acquire
35b50 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69  d.  A readlock i
35b60 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33  s obtained if P3
35b70 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74  ==0 or.** a writ
35b80 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e  e lock if P3==1.
35b90 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69  .**.** P2 contai
35ba0 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ns the root-page
35bb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
35bc0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20   lock..**.** P4 
35bd0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
35be0 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f  er to the name o
35bf0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
35c00 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69  g locked. This i
35c10 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74  s only.** used t
35c20 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  o generate an er
35c30 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 74  ror message if t
35c40 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
35c50 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63  e obtained..*/.c
35c60 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  ase OP_TableLock
35c70 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69 74 65  : {.  u8 isWrite
35c80 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e  Lock = (u8)pOp->
35c90 70 33 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p3;.#ifndef SQLI
35ca0 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
35cb0 4e 54 0a 20 20 69 66 28 20 69 73 57 72 69 74 65  NT.  if( isWrite
35cc0 4c 6f 63 6b 20 26 26 20 64 62 2d 3e 62 43 6f 6e  Lock && db->bCon
35cd0 63 75 72 72 65 6e 74 20 26 26 20 70 4f 70 2d 3e  current && pOp->
35ce0 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  p2==1 ){.    rc 
35cf0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
35d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
35d10 72 72 6f 72 28 70 2c 20 0a 20 20 20 20 20 20 20  rror(p, .       
35d20 20 22 63 61 6e 6e 6f 74 20 6d 6f 64 69 66 79 20   "cannot modify 
35d30 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
35d40 77 69 74 68 69 6e 20 43 4f 4e 43 55 52 52 45 4e  within CONCURREN
35d50 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b  T transaction");
35d60 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
35d70 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
35d80 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  }.#endif.  if( i
35d90 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 30 3d  sWriteLock || 0=
35da0 3d 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  =(db->flags&SQLI
35db0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
35dc0 65 64 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  ed) ){.    int p
35dd0 31 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 0a 20 20  1 = pOp->p1; .  
35de0 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20    assert( p1>=0 
35df0 26 26 20 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  && p1<db->nDb );
35e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 44 62 4d  .    assert( DbM
35e10 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
35e20 4d 61 73 6b 2c 20 70 31 29 20 29 3b 0a 20 20 20  Mask, p1) );.   
35e30 20 61 73 73 65 72 74 28 20 69 73 57 72 69 74 65   assert( isWrite
35e40 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69  Lock==0 || isWri
35e50 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20  teLock==1 );.   
35e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
35e70 65 65 4c 6f 63 6b 54 61 62 6c 65 28 64 62 2d 3e  eeLockTable(db->
35e80 61 44 62 5b 70 31 5d 2e 70 42 74 2c 20 70 4f 70  aDb[p1].pBt, pOp
35e90 2d 3e 70 32 2c 20 69 73 57 72 69 74 65 4c 6f 63  ->p2, isWriteLoc
35ea0 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  k);.    if( rc )
35eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72 63 26  {.      if( (rc&
35ec0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 4c 4f  0xFF)==SQLITE_LO
35ed0 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  CKED ){.        
35ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
35ef0 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
35f00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
35f10 72 6f 72 28 70 2c 20 22 64 61 74 61 62 61 73 65  ror(p, "database
35f20 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
35f30 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
35f40 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62   }.      goto ab
35f50 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
35f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72  ;.    }.  }.  br
35f70 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
35f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
35f90 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
35fa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
35fb0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
35fc0 2a 20 4f 70 63 6f 64 65 3a 20 56 42 65 67 69 6e  * Opcode: VBegin
35fd0 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
35fe0 2a 20 50 34 20 6d 61 79 20 62 65 20 61 20 70 6f  * P4 may be a po
35ff0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
36000 74 65 33 5f 76 74 61 62 20 73 74 72 75 63 74 75  te3_vtab structu
36010 72 65 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20  re. If so, call 
36020 74 68 65 20 0a 2a 2a 20 78 42 65 67 69 6e 20 6d  the .** xBegin m
36030 65 74 68 6f 64 20 66 6f 72 20 74 68 61 74 20 74  ethod for that t
36040 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  able..**.** Also
36050 2c 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  , whether or not
36060 20 50 34 20 69 73 20 73 65 74 2c 20 63 68 65 63   P4 is set, chec
36070 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 6e  k that this is n
36080 6f 74 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  ot being called 
36090 66 72 6f 6d 0a 2a 2a 20 77 69 74 68 69 6e 20 61  from.** within a
360a0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 20 76   callback to a v
360b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 53 79  irtual table xSy
360c0 6e 63 28 29 20 6d 65 74 68 6f 64 2e 20 49 66 20  nc() method. If 
360d0 69 74 20 69 73 2c 20 74 68 65 20 65 72 72 6f 72  it is, the error
360e0 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  .** code will be
360f0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4c   set to SQLITE_L
36100 4f 43 4b 45 44 2e 0a 2a 2f 0a 63 61 73 65 20 4f  OCKED..*/.case O
36110 50 5f 56 42 65 67 69 6e 3a 20 7b 0a 20 20 56 54  P_VBegin: {.  VT
36120 61 62 6c 65 20 2a 70 56 54 61 62 3b 0a 20 20 70  able *pVTab;.  p
36130 56 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  VTab = pOp->p4.p
36140 56 74 61 62 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Vtab;.  rc = sql
36150 69 74 65 33 56 74 61 62 42 65 67 69 6e 28 64 62  ite3VtabBegin(db
36160 2c 20 70 56 54 61 62 29 3b 0a 20 20 69 66 28 20  , pVTab);.  if( 
36170 70 56 54 61 62 20 29 20 73 71 6c 69 74 65 33 56  pVTab ) sqlite3V
36180 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
36190 70 2c 20 70 56 54 61 62 2d 3e 70 56 74 61 62 29  p, pVTab->pVtab)
361a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
361b0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
361c0 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
361d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
361e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
361f0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
36200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36210 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
36220 64 65 3a 20 56 43 72 65 61 74 65 20 50 31 20 50  de: VCreate P1 P
36230 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 50 32  2 * * *.**.** P2
36240 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 74   is a register t
36250 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
36260 6d 65 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  me of a virtual 
36270 74 61 62 6c 65 20 69 6e 20 64 61 74 61 62 61 73  table in databas
36280 65 20 0a 2a 2a 20 50 31 2e 20 43 61 6c 6c 20 74  e .** P1. Call t
36290 68 65 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  he xCreate metho
362a0 64 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  d for that table
362b0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 72  ..*/.case OP_VCr
362c0 65 61 74 65 3a 20 7b 0a 20 20 4d 65 6d 20 73 4d  eate: {.  Mem sM
362d0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
362e0 46 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 20  For storing the 
362f0 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
36300 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oded */.  const 
36310 63 68 61 72 20 2a 7a 54 61 62 3b 20 20 2f 2a 20  char *zTab;  /* 
36320 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  Name of the virt
36330 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  ual table */..  
36340 6d 65 6d 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c  memset(&sMem, 0,
36350 20 73 69 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a   sizeof(sMem));.
36360 20 20 73 4d 65 6d 2e 64 62 20 3d 20 64 62 3b 0a    sMem.db = db;.
36370 20 20 2f 2a 20 42 65 63 61 75 73 65 20 50 32 20    /* Because P2 
36380 69 73 20 61 6c 77 61 79 73 20 61 20 73 74 61 74  is always a stat
36390 69 63 20 73 74 72 69 6e 67 2c 20 69 74 20 69 73  ic string, it is
363a0 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
363b0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
363c0 56 64 62 65 4d 65 6d 43 6f 70 79 28 29 20 74 6f  VdbeMemCopy() to
363d0 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
363e0 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  t( (aMem[pOp->p2
363f0 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ].flags & MEM_St
36400 72 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)!=0 );.  asser
36410 74 28 20 28 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32  t( (aMem[pOp->p2
36420 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ].flags & MEM_St
36430 61 74 69 63 29 21 3d 30 20 29 3b 0a 20 20 72 63  atic)!=0 );.  rc
36440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
36450 6d 43 6f 70 79 28 26 73 4d 65 6d 2c 20 26 61 4d  mCopy(&sMem, &aM
36460 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20  em[pOp->p2]);.  
36470 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36480 54 45 5f 4f 4b 20 29 3b 0a 20 20 7a 54 61 62 20  TE_OK );.  zTab 
36490 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
364a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
364b0 74 28 26 73 4d 65 6d 29 3b 0a 20 20 61 73 73 65  t(&sMem);.  asse
364c0 72 74 28 20 7a 54 61 62 20 7c 7c 20 64 62 2d 3e  rt( zTab || db->
364d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
364e0 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20    if( zTab ){.  
364f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
36500 61 62 43 61 6c 6c 43 72 65 61 74 65 28 64 62 2c  abCallCreate(db,
36510 20 70 4f 70 2d 3e 70 31 2c 20 7a 54 61 62 2c 20   pOp->p1, zTab, 
36520 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  &p->zErrMsg);.  
36530 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
36540 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
36550 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
36560 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
36570 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
36580 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
36590 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
365a0 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  BLE */..#ifndef 
365b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
365c0 55 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f  UALTABLE./* Opco
365d0 64 65 3a 20 56 44 65 73 74 72 6f 79 20 50 31 20  de: VDestroy P1 
365e0 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50  * * P4 *.**.** P
365f0 34 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  4 is the name of
36600 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
36610 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
36620 20 20 43 61 6c 6c 20 74 68 65 20 78 44 65 73 74    Call the xDest
36630 72 6f 79 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  roy method.** of
36640 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a   that table..*/.
36650 63 61 73 65 20 4f 50 5f 56 44 65 73 74 72 6f 79  case OP_VDestroy
36660 3a 20 7b 0a 20 20 64 62 2d 3e 6e 56 44 65 73 74  : {.  db->nVDest
36670 72 6f 79 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71  roy++;.  rc = sq
36680 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 44 65 73  lite3VtabCallDes
36690 74 72 6f 79 28 64 62 2c 20 70 4f 70 2d 3e 70 31  troy(db, pOp->p1
366a0 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
366b0 64 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2d 2d 3b  db->nVDestroy--;
366c0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
366d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
366e0 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  ror;.  break;.}.
366f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36700 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36710 4c 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  LE */..#ifndef S
36720 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
36730 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
36740 65 3a 20 56 4f 70 65 6e 20 50 31 20 2a 20 2a 20  e: VOpen P1 * * 
36750 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  P4 *.**.** P4 is
36760 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
36770 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62  virtual table ob
36780 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33  ject, an sqlite3
36790 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e  _vtab structure.
367a0 0a 2a 2a 20 50 31 20 69 73 20 61 20 63 75 72 73  .** P1 is a curs
367b0 6f 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 69 73  or number.  This
367c0 20 6f 70 63 6f 64 65 20 6f 70 65 6e 73 20 61 20   opcode opens a 
367d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 76 69  cursor to the vi
367e0 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 61  rtual.** table a
367f0 6e 64 20 73 74 6f 72 65 73 20 74 68 61 74 20 63  nd stores that c
36800 75 72 73 6f 72 20 69 6e 20 50 31 2e 0a 2a 2f 0a  ursor in P1..*/.
36810 63 61 73 65 20 4f 50 5f 56 4f 70 65 6e 3a 20 7b  case OP_VOpen: {
36820 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
36830 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
36840 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
36850 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  r;.  sqlite3_vta
36860 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
36870 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
36880 20 2a 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 61 73   *pModule;..  as
36890 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
368a0 65 72 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 30  er );.  pCur = 0
368b0 3b 0a 20 20 70 56 43 75 72 20 3d 20 30 3b 0a 20  ;.  pVCur = 0;. 
368c0 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34   pVtab = pOp->p4
368d0 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
368e0 20 69 66 28 20 70 56 74 61 62 3d 3d 30 20 7c 7c   if( pVtab==0 ||
368f0 20 4e 45 56 45 52 28 70 56 74 61 62 2d 3e 70 4d   NEVER(pVtab->pM
36900 6f 64 75 6c 65 3d 3d 30 29 20 29 7b 0a 20 20 20  odule==0) ){.   
36910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
36920 4b 45 44 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62  KED;.    goto ab
36930 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
36940 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64 75 6c 65 20  ;.  }.  pModule 
36950 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
36960 3b 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65  ;.  rc = pModule
36970 2d 3e 78 4f 70 65 6e 28 70 56 74 61 62 2c 20 26  ->xOpen(pVtab, &
36980 70 56 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65  pVCur);.  sqlite
36990 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
369a0 67 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69  g(p, pVtab);.  i
369b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
369c0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
369d0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
369e0 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e sqlite3_vtab_c
369f0 75 72 73 6f 72 20 62 61 73 65 20 63 6c 61 73 73  ursor base class
36a00 20 2a 2f 0a 20 20 70 56 43 75 72 2d 3e 70 56 74   */.  pVCur->pVt
36a10 61 62 20 3d 20 70 56 74 61 62 3b 0a 0a 20 20 2f  ab = pVtab;..  /
36a20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 64 62  * Initialize vdb
36a30 65 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  e cursor object 
36a40 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61 6c 6c 6f  */.  pCur = allo
36a50 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
36a60 70 2d 3e 70 31 2c 20 30 2c 20 2d 31 2c 20 43 55  p->p1, 0, -1, CU
36a70 52 54 59 50 45 5f 56 54 41 42 29 3b 0a 20 20 69  RTYPE_VTAB);.  i
36a80 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70  f( pCur ){.    p
36a90 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 20 3d 20  Cur->uc.pVCur = 
36aa0 70 56 43 75 72 3b 0a 20 20 20 20 70 56 74 61 62  pVCur;.    pVtab
36ab0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nRef++;.  }els
36ac0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
36ad0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
36ae0 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  );.    pModule->
36af0 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
36b00 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
36b10 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
36b20 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36b30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36b40 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
36b50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36b60 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
36b70 3a 20 56 46 69 6c 74 65 72 20 50 31 20 50 32 20  : VFilter P1 P2 
36b80 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
36b90 73 69 73 3a 20 69 70 6c 61 6e 3d 72 5b 50 33 5d  sis: iplan=r[P3]
36ba0 20 7a 70 6c 61 6e 3d 27 50 34 27 0a 2a 2a 0a 2a   zplan='P4'.**.*
36bb0 2a 20 50 31 20 69 73 20 61 20 63 75 72 73 6f 72  * P1 is a cursor
36bc0 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 56 4f   opened using VO
36bd0 70 65 6e 2e 20 20 50 32 20 69 73 20 61 6e 20 61  pen.  P2 is an a
36be0 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74  ddress to jump t
36bf0 6f 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 6c 74  o if.** the filt
36c00 65 72 65 64 20 72 65 73 75 6c 74 20 73 65 74 20  ered result set 
36c10 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
36c20 50 34 20 69 73 20 65 69 74 68 65 72 20 4e 55 4c  P4 is either NUL
36c30 4c 20 6f 72 20 61 20 73 74 72 69 6e 67 20 74 68  L or a string th
36c40 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  at was generated
36c50 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e 64   by the xBestInd
36c60 65 78 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ex.** method of 
36c70 74 68 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  the module.  The
36c80 20 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20   interpretation 
36c90 6f 66 20 74 68 65 20 50 34 20 73 74 72 69 6e 67  of the P4 string
36ca0 20 69 73 20 6c 65 66 74 0a 2a 2a 20 74 6f 20 74   is left.** to t
36cb0 68 65 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d  he module implem
36cc0 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  entation..**.** 
36cd0 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f  This opcode invo
36ce0 6b 65 73 20 74 68 65 20 78 46 69 6c 74 65 72 20  kes the xFilter 
36cf0 6d 65 74 68 6f 64 20 6f 6e 20 74 68 65 20 76 69  method on the vi
36d00 72 74 75 61 6c 20 74 61 62 6c 65 20 73 70 65 63  rtual table spec
36d10 69 66 69 65 64 0a 2a 2a 20 62 79 20 50 31 2e 20  ified.** by P1. 
36d20 20 54 68 65 20 69 6e 74 65 67 65 72 20 71 75 65   The integer que
36d30 72 79 20 70 6c 61 6e 20 70 61 72 61 6d 65 74 65  ry plan paramete
36d40 72 20 74 6f 20 78 46 69 6c 74 65 72 20 69 73 20  r to xFilter is 
36d50 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
36d60 65 72 0a 2a 2a 20 50 33 2e 20 52 65 67 69 73 74  er.** P3. Regist
36d70 65 72 20 50 33 2b 31 20 73 74 6f 72 65 73 20 74  er P3+1 stores t
36d80 68 65 20 61 72 67 63 20 70 61 72 61 6d 65 74 65  he argc paramete
36d90 72 20 74 6f 20 62 65 20 70 61 73 73 65 64 20 74  r to be passed t
36da0 6f 20 74 68 65 0a 2a 2a 20 78 46 69 6c 74 65 72  o the.** xFilter
36db0 20 6d 65 74 68 6f 64 2e 20 52 65 67 69 73 74 65   method. Registe
36dc0 72 73 20 50 33 2b 32 2e 2e 50 33 2b 31 2b 61 72  rs P3+2..P3+1+ar
36dd0 67 63 20 61 72 65 20 74 68 65 20 61 72 67 63 0a  gc are the argc.
36de0 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 70 61  ** additional pa
36df0 72 61 6d 65 74 65 72 73 20 77 68 69 63 68 20 61  rameters which a
36e00 72 65 20 70 61 73 73 65 64 20 74 6f 0a 2a 2a 20  re passed to.** 
36e10 78 46 69 6c 74 65 72 20 61 73 20 61 72 67 76 2e  xFilter as argv.
36e20 20 52 65 67 69 73 74 65 72 20 50 33 2b 32 20 62   Register P3+2 b
36e30 65 63 6f 6d 65 73 20 61 72 67 76 5b 30 5d 20 77  ecomes argv[0] w
36e40 68 65 6e 20 70 61 73 73 65 64 20 74 6f 20 78 46  hen passed to xF
36e50 69 6c 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  ilter..**.** A j
36e60 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20 50  ump is made to P
36e70 32 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  2 if the result 
36e80 73 65 74 20 61 66 74 65 72 20 66 69 6c 74 65 72  set after filter
36e90 69 6e 67 20 77 6f 75 6c 64 20 62 65 20 65 6d 70  ing would be emp
36ea0 74 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ty..*/.case OP_V
36eb0 46 69 6c 74 65 72 3a 20 7b 20 20 20 2f 2a 20 6a  Filter: {   /* j
36ec0 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ump */.  int nAr
36ed0 67 3b 0a 20 20 69 6e 74 20 69 51 75 65 72 79 3b  g;.  int iQuery;
36ee0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
36ef0 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
36f00 3b 0a 20 20 4d 65 6d 20 2a 70 51 75 65 72 79 3b  ;.  Mem *pQuery;
36f10 0a 20 20 4d 65 6d 20 2a 70 41 72 67 63 3b 0a 20  .  Mem *pArgc;. 
36f20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
36f30 72 73 6f 72 20 2a 70 56 43 75 72 3b 0a 20 20 73  rsor *pVCur;.  s
36f40 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
36f50 61 62 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  ab;.  VdbeCursor
36f60 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 65   *pCur;.  int re
36f70 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  s;.  int i;.  Me
36f80 6d 20 2a 2a 61 70 41 72 67 3b 0a 0a 20 20 70 51  m **apArg;..  pQ
36f90 75 65 72 79 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  uery = &aMem[pOp
36fa0 2d 3e 70 33 5d 3b 0a 20 20 70 41 72 67 63 20 3d  ->p3];.  pArgc =
36fb0 20 26 70 51 75 65 72 79 5b 31 5d 3b 0a 20 20 70   &pQuery[1];.  p
36fc0 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
36fd0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
36fe0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 51  t( memIsValid(pQ
36ff0 75 65 72 79 29 20 29 3b 0a 20 20 52 45 47 49 53  uery) );.  REGIS
37000 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
37010 33 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 61 73  3, pQuery);.  as
37020 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72  sert( pCur->eCur
37030 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54  Type==CURTYPE_VT
37040 41 42 20 29 3b 0a 20 20 70 56 43 75 72 20 3d 20  AB );.  pVCur = 
37050 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 3b 0a  pCur->uc.pVCur;.
37060 20 20 70 56 74 61 62 20 3d 20 70 56 43 75 72 2d    pVtab = pVCur-
37070 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64 75 6c  >pVtab;.  pModul
37080 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  e = pVtab->pModu
37090 6c 65 3b 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  le;..  /* Grab t
370a0 68 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  he index number 
370b0 61 6e 64 20 61 72 67 63 20 70 61 72 61 6d 65 74  and argc paramet
370c0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
370d0 20 28 70 51 75 65 72 79 2d 3e 66 6c 61 67 73 26   (pQuery->flags&
370e0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 26 26 20 70  MEM_Int)!=0 && p
370f0 41 72 67 63 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d  Argc->flags==MEM
37100 5f 49 6e 74 20 29 3b 0a 20 20 6e 41 72 67 20 3d  _Int );.  nArg =
37110 20 28 69 6e 74 29 70 41 72 67 63 2d 3e 75 2e 69   (int)pArgc->u.i
37120 3b 0a 20 20 69 51 75 65 72 79 20 3d 20 28 69 6e  ;.  iQuery = (in
37130 74 29 70 51 75 65 72 79 2d 3e 75 2e 69 3b 0a 0a  t)pQuery->u.i;..
37140 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
37150 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 2a  xFilter method *
37160 2f 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61  /.  res = 0;.  a
37170 70 41 72 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b  pArg = p->apArg;
37180 0a 20 20 66 6f 72 28 69 20 3d 20 30 3b 20 69 3c  .  for(i = 0; i<
37190 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
371a0 61 70 41 72 67 5b 69 5d 20 3d 20 26 70 41 72 67  apArg[i] = &pArg
371b0 63 5b 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20 72 63  c[i+1];.  }.  rc
371c0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 46 69 6c   = pModule->xFil
371d0 74 65 72 28 70 56 43 75 72 2c 20 69 51 75 65 72  ter(pVCur, iQuer
371e0 79 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 6e 41  y, pOp->p4.z, nA
371f0 72 67 2c 20 61 70 41 72 67 29 3b 0a 20 20 73 71  rg, apArg);.  sq
37200 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
37210 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrmsg(p, pVtab);
37220 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
37230 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
37240 72 6f 72 3b 0a 20 20 72 65 73 20 3d 20 70 4d 6f  ror;.  res = pMo
37250 64 75 6c 65 2d 3e 78 45 6f 66 28 70 56 43 75 72  dule->xEof(pVCur
37260 29 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c 52  );.  pCur->nullR
37270 6f 77 20 3d 20 30 3b 0a 20 20 56 64 62 65 42 72  ow = 0;.  VdbeBr
37280 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30  anchTaken(res!=0
37290 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29  ,2);.  if( res )
372a0 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
372b0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
372c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
372d0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
372e0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
372f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
37300 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ABLE./* Opcode: 
37310 56 43 6f 6c 75 6d 6e 20 50 31 20 50 32 20 50 33  VColumn P1 P2 P3
37320 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
37330 3a 20 72 5b 50 33 5d 3d 76 63 6f 6c 75 6d 6e 28  : r[P3]=vcolumn(
37340 50 32 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20  P2).**.** Store 
37350 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
37360 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66   P2-th column of
37370 0a 2a 2a 20 74 68 65 20 72 6f 77 20 6f 66 20 74  .** the row of t
37380 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  he virtual-table
37390 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 50 31   that the .** P1
373a0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
373b0 69 6e 67 20 74 6f 20 69 6e 74 6f 20 72 65 67 69  ing to into regi
373c0 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73 65  ster P3..*/.case
373d0 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b 0a 20   OP_VColumn: {. 
373e0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
373f0 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71  Vtab;.  const sq
37400 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
37410 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a 70 44  odule;.  Mem *pD
37420 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  est;.  sqlite3_c
37430 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78 74 3b  ontext sContext;
37440 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  ..  VdbeCursor *
37450 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b  pCur = p->apCsr[
37460 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
37470 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72 54 79  rt( pCur->eCurTy
37480 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42  pe==CURTYPE_VTAB
37490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
374a0 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e  p->p3>0 && pOp->
374b0 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p3<=(p->nMem+1 -
374c0 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
374d0 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b    pDest = &aMem[
374e0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41  pOp->p3];.  memA
374f0 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
37500 70 44 65 73 74 29 3b 0a 20 20 69 66 28 20 70 43  pDest);.  if( pC
37510 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20  ur->nullRow ){. 
37520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
37530 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b  mSetNull(pDest);
37540 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
37550 20 20 70 56 74 61 62 20 3d 20 70 43 75 72 2d 3e    pVtab = pCur->
37560 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61 62 3b  uc.pVCur->pVtab;
37570 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  .  pModule = pVt
37580 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 61  ab->pModule;.  a
37590 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e  ssert( pModule->
375a0 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d 65 6d  xColumn );.  mem
375b0 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c 20 30  set(&sContext, 0
375c0 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74 65 78  , sizeof(sContex
375d0 74 29 29 3b 0a 20 20 73 43 6f 6e 74 65 78 74 2e  t));.  sContext.
375e0 70 4f 75 74 20 3d 20 70 44 65 73 74 3b 0a 20 20  pOut = pDest;.  
375f0 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
37600 44 65 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  Dest, MEM_Null);
37610 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d  .  rc = pModule-
37620 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d 3e 75  >xColumn(pCur->u
37630 63 2e 70 56 43 75 72 2c 20 26 73 43 6f 6e 74 65  c.pVCur, &sConte
37640 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20  xt, pOp->p2);.  
37650 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
37660 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62  tErrmsg(p, pVtab
37670 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74 65 78  );.  if( sContex
37680 74 2e 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20  t.isError ){.   
37690 20 72 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e 69   rc = sContext.i
376a0 73 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71  sError;.  }.  sq
376b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
376c0 6e 63 6f 64 69 6e 67 28 70 44 65 73 74 2c 20 65  ncoding(pDest, e
376d0 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 52 45 47 49  ncoding);.  REGI
376e0 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e  STER_TRACE(pOp->
376f0 70 33 2c 20 70 44 65 73 74 29 3b 0a 20 20 55 50  p3, pDest);.  UP
37700 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
37710 45 28 70 44 65 73 74 29 3b 0a 0a 20 20 69 66 28  E(pDest);..  if(
37720 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 54   sqlite3VdbeMemT
37730 6f 6f 42 69 67 28 70 44 65 73 74 29 20 29 7b 0a  ooBig(pDest) ){.
37740 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67      goto too_big
37750 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
37760 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
37770 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61  to_error;.  brea
37780 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
37790 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
377a0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
377b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
377c0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
377d0 4f 70 63 6f 64 65 3a 20 56 4e 65 78 74 20 50 31  Opcode: VNext P1
377e0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
377f0 41 64 76 61 6e 63 65 20 76 69 72 74 75 61 6c 20  Advance virtual 
37800 74 61 62 6c 65 20 50 31 20 74 6f 20 74 68 65 20  table P1 to the 
37810 6e 65 78 74 20 72 6f 77 20 69 6e 20 69 74 73 20  next row in its 
37820 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 0a 2a  result set and.*
37830 2a 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75  * jump to instru
37840 63 74 69 6f 6e 20 50 32 2e 20 20 4f 72 2c 20 69  ction P2.  Or, i
37850 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
37860 62 6c 65 20 68 61 73 20 72 65 61 63 68 65 64 0a  ble has reached.
37870 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 69 74  ** the end of it
37880 73 20 72 65 73 75 6c 74 20 73 65 74 2c 20 74 68  s result set, th
37890 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  en fall through 
378a0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
378b0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65  ruction..*/.case
378c0 20 4f 50 5f 56 4e 65 78 74 3a 20 7b 20 20 20 2f   OP_VNext: {   /
378d0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 73 71 6c 69  * jump */.  sqli
378e0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
378f0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
37900 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
37910 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 56  ;.  int res;.  V
37920 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
37930 0a 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 70  ..  res = 0;.  p
37940 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
37950 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
37960 74 28 20 70 43 75 72 2d 3e 65 43 75 72 54 79 70  t( pCur->eCurTyp
37970 65 3d 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e==CURTYPE_VTAB 
37980 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e  );.  if( pCur->n
37990 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 62 72  ullRow ){.    br
379a0 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62  eak;.  }.  pVtab
379b0 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75   = pCur->uc.pVCu
379c0 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
379d0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
379e0 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  dule;.  assert( 
379f0 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 20 29  pModule->xNext )
37a00 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
37a10 68 65 20 78 4e 65 78 74 28 29 20 6d 65 74 68 6f  he xNext() metho
37a20 64 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2e  d of the module.
37a30 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   There is no way
37a40 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 75 6e   for the.  ** un
37a50 64 65 72 6c 79 69 6e 67 20 69 6d 70 6c 65 6d 65  derlying impleme
37a60 6e 74 61 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  ntation to retur
37a70 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6f 6e  n an error if on
37a80 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  e occurs during.
37a90 20 20 2a 2a 20 78 4e 65 78 74 28 29 2e 20 49 6e    ** xNext(). In
37aa0 73 74 65 61 64 2c 20 69 66 20 61 6e 20 65 72 72  stead, if an err
37ab0 6f 72 20 6f 63 63 75 72 73 2c 20 74 72 75 65 20  or occurs, true 
37ac0 69 73 20 72 65 74 75 72 6e 65 64 20 28 69 6e 64  is returned (ind
37ad0 69 63 61 74 69 6e 67 20 74 68 61 74 20 0a 20 20  icating that .  
37ae0 2a 2a 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  ** data is avail
37af0 61 62 6c 65 29 20 61 6e 64 20 74 68 65 20 65 72  able) and the er
37b00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
37b10 64 20 77 68 65 6e 20 78 43 6f 6c 75 6d 6e 20 6f  d when xColumn o
37b20 72 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 74 68 65  r.  ** some othe
37b30 72 20 6d 65 74 68 6f 64 20 69 73 20 6e 65 78 74  r method is next
37b40 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20   invoked on the 
37b50 73 61 76 65 20 76 69 72 74 75 61 6c 20 74 61 62  save virtual tab
37b60 6c 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 0a  le cursor..  */.
37b70 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e    rc = pModule->
37b80 78 4e 65 78 74 28 70 43 75 72 2d 3e 75 63 2e 70  xNext(pCur->uc.p
37b90 56 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  VCur);.  sqlite3
37ba0 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
37bb0 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
37bc0 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
37bd0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
37be0 20 20 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d    res = pModule-
37bf0 3e 78 45 6f 66 28 70 43 75 72 2d 3e 75 63 2e 70  >xEof(pCur->uc.p
37c00 56 43 75 72 29 3b 0a 20 20 56 64 62 65 42 72 61  VCur);.  VdbeBra
37c10 6e 63 68 54 61 6b 65 6e 28 21 72 65 73 2c 32 29  nchTaken(!res,2)
37c20 3b 0a 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a  ;.  if( !res ){.
37c30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
37c40 69 73 20 64 61 74 61 2c 20 6a 75 6d 70 20 74 6f  is data, jump to
37c50 20 50 32 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20   P2 */.    goto 
37c60 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63  jump_to_p2_and_c
37c70 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
37c80 70 74 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 63  pt;.  }.  goto c
37c90 68 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75  heck_for_interru
37ca0 70 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  pt;.}.#endif /* 
37cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
37cc0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
37cd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37ce0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
37cf0 20 4f 70 63 6f 64 65 3a 20 56 52 65 6e 61 6d 65   Opcode: VRename
37d00 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
37d10 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
37d20 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
37d30 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
37d40 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
37d50 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73  ructure..** This
37d60 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20   opcode invokes 
37d70 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37d80 67 20 78 52 65 6e 61 6d 65 20 6d 65 74 68 6f 64  g xRename method
37d90 2e 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  . The value.** i
37da0 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
37db0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 7a   passed as the z
37dc0 4e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  Name argument to
37dd0 20 74 68 65 20 78 52 65 6e 61 6d 65 20 6d 65 74   the xRename met
37de0 68 6f 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  hod..*/.case OP_
37df0 56 52 65 6e 61 6d 65 3a 20 7b 0a 20 20 73 71 6c  VRename: {.  sql
37e00 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
37e10 3b 0a 20 20 4d 65 6d 20 2a 70 4e 61 6d 65 3b 0a  ;.  Mem *pName;.
37e20 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  .  pVtab = pOp->
37e30 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
37e40 0a 20 20 70 4e 61 6d 65 20 3d 20 26 61 4d 65 6d  .  pName = &aMem
37e50 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
37e60 65 72 74 28 20 70 56 74 61 62 2d 3e 70 4d 6f 64  ert( pVtab->pMod
37e70 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 3b 0a  ule->xRename );.
37e80 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
37e90 61 6c 69 64 28 70 4e 61 6d 65 29 20 29 3b 0a 20  alid(pName) );. 
37ea0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64   assert( p->read
37eb0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 52 45 47  Only==0 );.  REG
37ec0 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
37ed0 3e 70 31 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 61  >p1, pName);.  a
37ee0 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 66 6c  ssert( pName->fl
37ef0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
37f00 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 61  .  testcase( pNa
37f10 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  me->enc==SQLITE_
37f20 55 54 46 38 20 29 3b 0a 20 20 74 65 73 74 63 61  UTF8 );.  testca
37f30 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63 3d 3d  se( pName->enc==
37f40 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
37f50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e  ;.  testcase( pN
37f60 61 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  ame->enc==SQLITE
37f70 5f 55 54 46 31 36 4c 45 20 29 3b 0a 20 20 72 63  _UTF16LE );.  rc
37f80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
37f90 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70 4e 61  angeEncoding(pNa
37fa0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  me, SQLITE_UTF8)
37fb0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
37fc0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
37fd0 72 72 6f 72 3b 0a 20 20 72 63 20 3d 20 70 56 74  rror;.  rc = pVt
37fe0 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52 65  ab->pModule->xRe
37ff0 6e 61 6d 65 28 70 56 74 61 62 2c 20 70 4e 61 6d  name(pVtab, pNam
38000 65 2d 3e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  e->z);.  sqlite3
38010 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
38020 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 70 2d  (p, pVtab);.  p-
38030 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20  >expired = 0;.  
38040 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
38050 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
38060 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
38070 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
38080 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
38090 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
380a0 20 56 55 70 64 61 74 65 20 50 31 20 50 32 20 50   VUpdate P1 P2 P
380b0 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
380c0 73 69 73 3a 20 64 61 74 61 3d 72 5b 50 33 40 50  sis: data=r[P3@P
380d0 32 5d 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  2].**.** P4 is a
380e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 76 69   pointer to a vi
380f0 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
38100 63 74 2c 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  ct, an sqlite3_v
38110 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  tab structure..*
38120 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6e  * This opcode in
38130 76 6f 6b 65 73 20 74 68 65 20 63 6f 72 72 65 73  vokes the corres
38140 70 6f 6e 64 69 6e 67 20 78 55 70 64 61 74 65 20  ponding xUpdate 
38150 6d 65 74 68 6f 64 2e 20 50 32 20 76 61 6c 75 65  method. P2 value
38160 73 0a 2a 2a 20 61 72 65 20 63 6f 6e 74 69 67 75  s.** are contigu
38170 6f 75 73 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  ous memory cells
38180 20 73 74 61 72 74 69 6e 67 20 61 74 20 50 33 20   starting at P3 
38190 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 78  to pass to the x
381a0 55 70 64 61 74 65 20 0a 2a 2a 20 69 6e 76 6f 63  Update .** invoc
381b0 61 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65  ation. The value
381c0 20 69 6e 20 72 65 67 69 73 74 65 72 20 28 50 33   in register (P3
381d0 2b 50 32 2d 31 29 20 63 6f 72 72 65 73 70 6f 6e  +P2-1) correspon
381e0 64 73 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 32  ds to the .** p2
381f0 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  th element of th
38200 65 20 61 72 67 76 20 61 72 72 61 79 20 70 61 73  e argv array pas
38210 73 65 64 20 74 6f 20 78 55 70 64 61 74 65 2e 0a  sed to xUpdate..
38220 2a 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64 61 74  **.** The xUpdat
38230 65 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 64 6f  e method will do
38240 20 61 20 44 45 4c 45 54 45 20 6f 72 20 61 6e 20   a DELETE or an 
38250 49 4e 53 45 52 54 20 6f 72 20 62 6f 74 68 2e 0a  INSERT or both..
38260 2a 2a 20 54 68 65 20 61 72 67 76 5b 30 5d 20 65  ** The argv[0] e
38270 6c 65 6d 65 6e 74 20 28 77 68 69 63 68 20 63 6f  lement (which co
38280 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6d 65 6d  rresponds to mem
38290 6f 72 79 20 63 65 6c 6c 20 50 33 29 0a 2a 2a 20  ory cell P3).** 
382a0 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  is the rowid of 
382b0 61 20 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e  a row to delete.
382c0 20 20 49 66 20 61 72 67 76 5b 30 5d 20 69 73 20    If argv[0] is 
382