/ Hex Artifact Content
Login

Artifact 3771a25dd8164669ae75716382bf9a4029da727be1c9394ba952003b182856d8:


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 20 20 2f 2a 20 54 45 58 54 2d 3e 4e 55 4d  }.  /* TEXT->NUM
26d0: 45 52 49 43 20 69 73 20 6d 61 6e 79 2d 3e 6f 6e  ERIC is many->on
26e0: 65 2e 20 20 48 65 6e 63 65 2c 20 69 74 20 69 73  e.  Hence, it is
26f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 69 6e   important to in
2700: 76 61 6c 69 64 61 74 65 20 74 68 65 0a 20 20 2a  validate the.  *
2710: 2a 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  * string represe
2720: 6e 74 61 74 69 6f 6e 20 61 66 74 65 72 20 63 6f  ntation after co
2730: 6d 70 75 74 69 6e 67 20 61 20 6e 75 6d 65 72 69  mputing a numeri
2740: 63 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 62 65  c equivalent, be
2750: 63 61 75 73 65 20 74 68 65 0a 20 20 2a 2a 20 73  cause the.  ** s
2760: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2770: 74 69 6f 6e 20 6d 69 67 68 74 20 6e 6f 74 20 62  tion might not b
2780: 65 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  e the canonical 
2790: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
27a0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 65  or the.  ** nume
27b0: 72 69 63 20 76 61 6c 75 65 2e 20 20 54 69 63 6b  ric value.  Tick
27c0: 65 74 20 5b 33 34 33 36 33 34 39 34 32 64 64 35  et [343634942dd5
27d0: 34 61 62 35 37 62 37 30 32 34 5d 20 32 30 31 38  4ab57b7024] 2018
27e0: 2d 30 31 2d 33 31 2e 20 2a 2f 0a 20 20 70 52 65  -01-31. */.  pRe
27f0: 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4d 45 4d  c->flags &= ~MEM
2800: 5f 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  _Str;.}../*.** P
2810: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 64 65 74  rocessing is det
2820: 65 72 6d 69 6e 65 20 62 79 20 74 68 65 20 61 66  ermine by the af
2830: 66 69 6e 69 74 79 20 70 61 72 61 6d 65 74 65 72  finity parameter
2840: 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  :.**.** SQLITE_A
2850: 46 46 5f 49 4e 54 45 47 45 52 3a 0a 2a 2a 20 53  FF_INTEGER:.** S
2860: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 0a  QLITE_AFF_REAL:.
2870: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
2880: 4d 45 52 49 43 3a 0a 2a 2a 20 20 20 20 54 72 79  MERIC:.**    Try
2890: 20 74 6f 20 63 6f 6e 76 65 72 74 20 70 52 65 63   to convert pRec
28a0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 72   to an integer r
28b0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 72  epresentation or
28c0: 20 61 20 0a 2a 2a 20 20 20 20 66 6c 6f 61 74 69   a .**    floati
28d0: 6e 67 2d 70 6f 69 6e 74 20 72 65 70 72 65 73 65  ng-point represe
28e0: 6e 74 61 74 69 6f 6e 20 69 66 20 61 6e 20 69 6e  ntation if an in
28f0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2900: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 6e 6f  tion.**    is no
2910: 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 4e 6f 74  t possible.  Not
2920: 65 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 67  e that the integ
2930: 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  er representatio
2940: 6e 20 69 73 0a 2a 2a 20 20 20 20 61 6c 77 61 79  n is.**    alway
2950: 73 20 70 72 65 66 65 72 72 65 64 2c 20 65 76 65  s preferred, eve
2960: 6e 20 69 66 20 74 68 65 20 61 66 66 69 6e 69 74  n if the affinit
2970: 79 20 69 73 20 52 45 41 4c 2c 20 62 65 63 61 75  y is REAL, becau
2980: 73 65 0a 2a 2a 20 20 20 20 61 6e 20 69 6e 74 65  se.**    an inte
2990: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
29a0: 6f 6e 20 69 73 20 6d 6f 72 65 20 73 70 61 63 65  on is more space
29b0: 20 65 66 66 69 63 69 65 6e 74 20 6f 6e 20 64 69   efficient on di
29c0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  sk..**.** SQLITE
29d0: 5f 41 46 46 5f 54 45 58 54 3a 0a 2a 2a 20 20 20  _AFF_TEXT:.**   
29e0: 20 43 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f   Convert pRec to
29f0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
2a00: 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51  tation..**.** SQ
2a10: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a  LITE_AFF_BLOB:.*
2a20: 2a 20 20 20 20 4e 6f 2d 6f 70 2e 20 20 70 52 65  *    No-op.  pRe
2a30: 63 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  c is unchanged..
2a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2a50: 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a 20 20  pplyAffinity(.  
2a60: 4d 65 6d 20 2a 70 52 65 63 2c 20 20 20 20 20 20  Mem *pRec,      
2a70: 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
2a80: 20 74 6f 20 61 70 70 6c 79 20 61 66 66 69 6e 69   to apply affini
2a90: 74 79 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20  ty to */.  char 
2aa0: 61 66 66 69 6e 69 74 79 2c 20 20 20 20 20 20 2f  affinity,      /
2ab0: 2a 20 54 68 65 20 61 66 66 69 6e 69 74 79 20 74  * The affinity t
2ac0: 6f 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a  o be applied */.
2ad0: 20 20 75 38 20 65 6e 63 20 20 20 20 20 20 20 20    u8 enc        
2ae0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
2af0: 73 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  s text encoding 
2b00: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61 66 66 69  */.){.  if( affi
2b10: 6e 69 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46  nity>=SQLITE_AFF
2b20: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
2b30: 61 73 73 65 72 74 28 20 61 66 66 69 6e 69 74 79  assert( affinity
2b40: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
2b50: 45 47 45 52 20 7c 7c 20 61 66 66 69 6e 69 74 79  EGER || affinity
2b60: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
2b70: 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  L.             |
2b80: 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  | affinity==SQLI
2b90: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
2ba0: 3b 0a 20 20 20 20 69 66 28 20 28 70 52 65 63 2d  ;.    if( (pRec-
2bb0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
2bc0: 29 3d 3d 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49  )==0 ){ /*OPTIMI
2bd0: 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a  ZATION-IF-FALSE*
2be0: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65  /.      if( (pRe
2bf0: 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  c->flags & MEM_R
2c00: 65 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eal)==0 ){.     
2c10: 20 20 20 69 66 28 20 70 52 65 63 2d 3e 66 6c 61     if( pRec->fla
2c20: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 20 61  gs & MEM_Str ) a
2c30: 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e  pplyNumericAffin
2c40: 69 74 79 28 70 52 65 63 2c 31 29 3b 0a 20 20 20  ity(pRec,1);.   
2c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74    sqlite3VdbeInt
2c70: 65 67 65 72 41 66 66 69 6e 69 74 79 28 70 52 65  egerAffinity(pRe
2c80: 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2c90: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66  }.  }else if( af
2ca0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2cb0: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 2f  FF_TEXT ){.    /
2cc0: 2a 20 4f 6e 6c 79 20 61 74 74 65 6d 70 74 20 74  * Only attempt t
2cd0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
2ce0: 20 54 45 58 54 20 69 66 20 74 68 65 72 65 20 69   TEXT if there i
2cf0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  s an integer or 
2d00: 72 65 61 6c 0a 20 20 20 20 2a 2a 20 72 65 70 72  real.    ** repr
2d10: 65 73 65 6e 74 61 74 69 6f 6e 20 28 62 6c 6f 62  esentation (blob
2d20: 20 61 6e 64 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74   and NULL do not
2d30: 20 67 65 74 20 63 6f 6e 76 65 72 74 65 64 29 20   get converted) 
2d40: 62 75 74 20 6e 6f 20 73 74 72 69 6e 67 0a 20 20  but no string.  
2d50: 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74    ** representat
2d60: 69 6f 6e 2e 20 20 49 74 20 77 6f 75 6c 64 20 62  ion.  It would b
2d70: 65 20 68 61 72 6d 6c 65 73 73 20 74 6f 20 72 65  e harmless to re
2d80: 70 65 61 74 20 74 68 65 20 63 6f 6e 76 65 72 73  peat the convers
2d90: 69 6f 6e 20 69 66 20 0a 20 20 20 20 2a 2a 20 74  ion if .    ** t
2da0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
2db0: 61 20 73 74 72 69 6e 67 20 72 65 70 2c 20 62 75  a string rep, bu
2dc0: 74 20 69 74 20 69 73 20 70 6f 69 6e 74 6c 65 73  t it is pointles
2dd0: 73 20 74 6f 20 77 61 73 74 65 20 74 68 6f 73 65  s to waste those
2de0: 0a 20 20 20 20 2a 2a 20 43 50 55 20 63 79 63 6c  .    ** CPU cycl
2df0: 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 30  es. */.    if( 0
2e00: 3d 3d 28 70 52 65 63 2d 3e 66 6c 61 67 73 26 4d  ==(pRec->flags&M
2e10: 45 4d 5f 53 74 72 29 20 29 7b 20 2f 2a 4f 50 54  EM_Str) ){ /*OPT
2e20: 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46 41 4c  IMIZATION-IF-FAL
2e30: 53 45 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  SE*/.      if( (
2e40: 70 52 65 63 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  pRec->flags&(MEM
2e50: 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20  _Real|MEM_Int)) 
2e60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e70: 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67 69  e3VdbeMemStringi
2e80: 66 79 28 70 52 65 63 2c 20 65 6e 63 2c 20 31 29  fy(pRec, enc, 1)
2e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ea0: 20 20 20 20 70 52 65 63 2d 3e 66 6c 61 67 73 20      pRec->flags 
2eb0: 26 3d 20 7e 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  &= ~(MEM_Real|ME
2ec0: 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  M_Int);.  }.}../
2ed0: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 63 6f 6e 76  *.** Try to conv
2ee0: 65 72 74 20 74 68 65 20 74 79 70 65 20 6f 66 20  ert the type of 
2ef0: 61 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  a function argum
2f00: 65 6e 74 20 6f 72 20 61 20 72 65 73 75 6c 74 20  ent or a result 
2f10: 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61  column.** into a
2f20: 20 6e 75 6d 65 72 69 63 20 72 65 70 72 65 73 65   numeric represe
2f30: 6e 74 61 74 69 6f 6e 2e 20 20 55 73 65 20 65 69  ntation.  Use ei
2f40: 74 68 65 72 20 49 4e 54 45 47 45 52 20 6f 72 20  ther INTEGER or 
2f50: 52 45 41 4c 20 77 68 69 63 68 65 76 65 72 0a 2a  REAL whichever.*
2f60: 2a 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  * is appropriate
2f70: 2e 20 20 42 75 74 20 6f 6e 6c 79 20 64 6f 20 74  .  But only do t
2f80: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 66  he conversion if
2f90: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2fa0: 77 69 74 68 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20  without.** loss 
2fb0: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  of information a
2fc0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
2fd0: 76 69 73 65 64 20 74 79 70 65 20 6f 66 20 74 68  vised type of th
2fe0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  e argument..*/.i
2ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
3000: 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 73 71  _numeric_type(sq
3010: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
3020: 6c 29 7b 0a 20 20 69 6e 74 20 65 54 79 70 65 20  l){.  int eType 
3030: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3040: 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 69 66  type(pVal);.  if
3050: 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
3060: 54 45 58 54 20 29 7b 0a 20 20 20 20 4d 65 6d 20  TEXT ){.    Mem 
3070: 2a 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 70 56  *pMem = (Mem*)pV
3080: 61 6c 3b 0a 20 20 20 20 61 70 70 6c 79 4e 75 6d  al;.    applyNum
3090: 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 4d 65  ericAffinity(pMe
30a0: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 54 79 70 65  m, 0);.    eType
30b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30c0: 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20 20 7d  _type(pVal);.  }
30d0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
30e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74  .}../*.** Export
30f0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 61 70  ed version of ap
3100: 70 6c 79 41 66 66 69 6e 69 74 79 28 29 2e 20 54  plyAffinity(). T
3110: 68 69 73 20 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e  his one works on
3120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2c   sqlite3_value*,
3130: 20 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 69 6e 74   .** not the int
3140: 65 72 6e 61 6c 20 4d 65 6d 2a 20 74 79 70 65 2e  ernal Mem* type.
3150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3160: 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
3170: 74 79 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ty(.  sqlite3_va
3180: 6c 75 65 20 2a 70 56 61 6c 2c 20 0a 20 20 75 38  lue *pVal, .  u8
3190: 20 61 66 66 69 6e 69 74 79 2c 20 0a 20 20 75 38   affinity, .  u8
31a0: 20 65 6e 63 0a 29 7b 0a 20 20 61 70 70 6c 79 41   enc.){.  applyA
31b0: 66 66 69 6e 69 74 79 28 28 4d 65 6d 20 2a 29 70  ffinity((Mem *)p
31c0: 56 61 6c 2c 20 61 66 66 69 6e 69 74 79 2c 20 65  Val, affinity, e
31d0: 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d  nc);.}../*.** pM
31e0: 65 6d 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  em currently onl
31f0: 79 20 68 6f 6c 64 73 20 61 20 73 74 72 69 6e 67  y holds a string
3200: 20 74 79 70 65 20 28 6f 72 20 6d 61 79 62 65 20   type (or maybe 
3210: 61 20 42 4c 4f 42 20 74 68 61 74 20 77 65 20 63  a BLOB that we c
3220: 61 6e 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74 20  an.** interpret 
3230: 61 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 77  as a string if w
3240: 65 20 77 61 6e 74 20 74 6f 29 2e 20 20 43 6f 6d  e want to).  Com
3250: 70 75 74 65 20 69 74 73 20 63 6f 72 72 65 73 70  pute its corresp
3260: 6f 6e 64 69 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69  onding.** numeri
3270: 63 20 74 79 70 65 2c 20 69 66 20 68 61 73 20 6f  c type, if has o
3280: 6e 65 2e 20 20 53 65 74 20 74 68 65 20 70 4d 65  ne.  Set the pMe
3290: 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d 2d  m->u.r and pMem-
32a0: 3e 75 2e 69 20 66 69 65 6c 64 73 0a 2a 2a 20 61  >u.i fields.** a
32b0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73  ccordingly..*/.s
32c0: 74 61 74 69 63 20 75 31 36 20 53 51 4c 49 54 45  tatic u16 SQLITE
32d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 63 6f 6d 70 75 74  _NOINLINE comput
32e0: 65 4e 75 6d 65 72 69 63 54 79 70 65 28 4d 65 6d  eNumericType(Mem
32f0: 20 2a 70 4d 65 6d 29 7b 0a 20 20 61 73 73 65 72   *pMem){.  asser
3300: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
3310: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3320: 65 61 6c 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  eal))==0 );.  as
3330: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
3340: 67 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45  gs & (MEM_Str|ME
3350: 4d 5f 42 6c 6f 62 29 29 21 3d 30 20 29 3b 0a 20  M_Blob))!=0 );. 
3360: 20 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46   if( sqlite3AtoF
3370: 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d  (pMem->z, &pMem-
3380: 3e 75 2e 72 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70  >u.r, pMem->n, p
3390: 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a  Mem->enc)==0 ){.
33a0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
33b0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
33c0: 74 6f 69 36 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26  toi64(pMem->z, &
33d0: 70 4d 65 6d 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d  pMem->u.i, pMem-
33e0: 3e 6e 2c 20 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d  >n, pMem->enc)==
33f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3400: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 0a 20 20 72  MEM_Int;.  }.  r
3410: 65 74 75 72 6e 20 4d 45 4d 5f 52 65 61 6c 3b 0a  eturn MEM_Real;.
3420: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3430: 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
3440: 20 66 6f 72 20 70 4d 65 6d 2c 20 65 69 74 68 65   for pMem, eithe
3450: 72 20 4d 45 4d 5f 49 6e 74 20 6f 72 20 4d 45 4d  r MEM_Int or MEM
3460: 5f 52 65 61 6c 20 6f 72 20 62 6f 74 68 20 6f 72  _Real or both or
3470: 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a 2a 2a 0a 2a  .** none.  .**.*
3480: 2a 20 55 6e 6c 69 6b 65 20 61 70 70 6c 79 4e 75  * Unlike applyNu
3490: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 29 2c  mericAffinity(),
34a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
34b0: 65 73 20 6e 6f 74 20 6d 6f 64 69 66 79 20 70 4d  es not modify pM
34c0: 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 42 75  em->flags..** Bu
34d0: 74 20 69 74 20 64 6f 65 73 20 73 65 74 20 70 4d  t it does set pM
34e0: 65 6d 2d 3e 75 2e 72 20 61 6e 64 20 70 4d 65 6d  em->u.r and pMem
34f0: 2d 3e 75 2e 69 20 61 70 70 72 6f 70 72 69 61 74  ->u.i appropriat
3500: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ely..*/.static u
3510: 31 36 20 6e 75 6d 65 72 69 63 54 79 70 65 28 4d  16 numericType(M
3520: 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 69 66 28  em *pMem){.  if(
3530: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28   pMem->flags & (
3540: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
3550: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3560: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3570: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
3580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65 6d  ;.  }.  if( pMem
3590: 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ->flags & (MEM_S
35a0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 7b 0a  tr|MEM_Blob) ){.
35b0: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75      return compu
35c0: 74 65 4e 75 6d 65 72 69 63 54 79 70 65 28 70 4d  teNumericType(pM
35d0: 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  em);.  }.  retur
35e0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
35f0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
3600: 2a 20 57 72 69 74 65 20 61 20 6e 69 63 65 20 73  * Write a nice s
3610: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
3620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 74  tion of the cont
3630: 65 6e 74 73 20 6f 66 20 63 65 6c 6c 20 70 4d 65  ents of cell pMe
3640: 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75 66 66 65 72  m.** into buffer
3650: 20 7a 42 75 66 2c 20 6c 65 6e 67 74 68 20 6e 42   zBuf, length nB
3660: 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  uf..*/.void sqli
3670: 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74 74 79  te3VdbeMemPretty
3680: 50 72 69 6e 74 28 4d 65 6d 20 2a 70 4d 65 6d 2c  Print(Mem *pMem,
3690: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
36a0: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 42 75  char *zCsr = zBu
36b0: 66 3b 0a 20 20 69 6e 74 20 66 20 3d 20 70 4d 65  f;.  int f = pMe
36c0: 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 20 73 74 61  m->flags;..  sta
36d0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
36e0: 63 6f 6e 73 74 20 65 6e 63 6e 61 6d 65 73 5b 5d  const encnames[]
36f0: 20 3d 20 7b 22 28 58 29 22 2c 20 22 28 38 29 22   = {"(X)", "(8)"
3700: 2c 20 22 28 31 36 4c 45 29 22 2c 20 22 28 31 36  , "(16LE)", "(16
3710: 42 45 29 22 7d 3b 0a 0a 20 20 69 66 28 20 66 26  BE)"};..  if( f&
3720: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
3730: 69 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20  int i;.    char 
3740: 63 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d  c;.    if( f & M
3750: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
3760: 63 20 3d 20 27 7a 27 3b 0a 20 20 20 20 20 20 61  c = 'z';.      a
3770: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3780: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 45 70 68 65  _Static|MEM_Ephe
3790: 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  m))==0 );.    }e
37a0: 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f  lse if( f & MEM_
37b0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
37c0: 63 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  c = 't';.      a
37d0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
37e0: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
37f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3800: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3810: 65 6d 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20  em ){.      c = 
3820: 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  'e';.      asser
3830: 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61  t( (f & (MEM_Sta
3840: 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d 30  tic|MEM_Dyn))==0
3850: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
3860: 20 20 20 20 20 63 20 3d 20 27 73 27 3b 0a 20 20       c = 's';.  
3870: 20 20 7d 0a 20 20 20 20 2a 28 7a 43 73 72 2b 2b    }.    *(zCsr++
3880: 29 20 3d 20 63 3b 0a 20 20 20 20 73 71 6c 69 74  ) = c;.    sqlit
3890: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c  e3_snprintf(100,
38a0: 20 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d   zCsr, "%d[", pM
38b0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72  em->n);.    zCsr
38c0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
38d0: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66  n30(zCsr);.    f
38e0: 6f 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20  or(i=0; i<16 && 
38f0: 69 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pMem->n; i++){
3900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3910: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3920: 72 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74  r, "%02X", ((int
3930: 29 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78  )pMem->z[i] & 0x
3940: 46 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72  FF));.      zCsr
3950: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
3960: 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d  n30(zCsr);.    }
3970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3980: 31 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b  16 && i<pMem->n;
3990: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
39a0: 72 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d  r z = pMem->z[i]
39b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32  ;.      if( z<32
39c0: 20 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73   || z>126 ) *zCs
39d0: 72 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20  r++ = '.';.     
39e0: 20 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20   else *zCsr++ = 
39f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a  z;.    }.    *(z
3a00: 43 73 72 2b 2b 29 20 3d 20 27 5d 27 3b 0a 20 20  Csr++) = ']';.  
3a10: 20 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 5a 65    if( f & MEM_Ze
3a20: 72 6f 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ro ){.      sqli
3a30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30  te3_snprintf(100
3a40: 2c 20 7a 43 73 72 2c 22 2b 25 64 7a 22 2c 70 4d  , zCsr,"+%dz",pM
3a50: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 29 3b 0a 20 20  em->u.nZero);.  
3a60: 20 20 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69      zCsr += sqli
3a70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 73 72  te3Strlen30(zCsr
3a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43  );.    }.    *zC
3a90: 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c  sr = '\0';.  }el
3aa0: 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 53  se if( f & MEM_S
3ab0: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 2c  tr ){.    int j,
3ac0: 20 6b 3b 0a 20 20 20 20 7a 42 75 66 5b 30 5d 20   k;.    zBuf[0] 
3ad0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 66  = ' ';.    if( f
3ae0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3af0: 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27 7a      zBuf[1] = 'z
3b00: 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ';.      assert(
3b10: 20 28 66 20 26 20 28 4d 45 4d 5f 53 74 61 74 69   (f & (MEM_Stati
3b20: 63 7c 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30  c|MEM_Ephem))==0
3b30: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
3b40: 28 20 66 20 26 20 4d 45 4d 5f 53 74 61 74 69 63  ( f & MEM_Static
3b50: 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31   ){.      zBuf[1
3b60: 5d 20 3d 20 27 74 27 3b 0a 20 20 20 20 20 20 61  ] = 't';.      a
3b70: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3b80: 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68 65 6d 29 29  _Dyn|MEM_Ephem))
3b90: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ==0 );.    }else
3ba0: 20 69 66 28 20 66 20 26 20 4d 45 4d 5f 45 70 68   if( f & MEM_Eph
3bb0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  em ){.      zBuf
3bc0: 5b 31 5d 20 3d 20 27 65 27 3b 0a 20 20 20 20 20  [1] = 'e';.     
3bd0: 20 61 73 73 65 72 74 28 20 28 66 20 26 20 28 4d   assert( (f & (M
3be0: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79  EM_Static|MEM_Dy
3bf0: 6e 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  n))==0 );.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b  lse{.      zBuf[
3c10: 31 5d 20 3d 20 27 73 27 3b 0a 20 20 20 20 7d 0a  1] = 's';.    }.
3c20: 20 20 20 20 6b 20 3d 20 32 3b 0a 20 20 20 20 73      k = 2;.    s
3c30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3c40: 31 30 30 2c 20 26 7a 42 75 66 5b 6b 5d 2c 20 22  100, &zBuf[k], "
3c50: 25 64 22 2c 20 70 4d 65 6d 2d 3e 6e 29 3b 0a 20  %d", pMem->n);. 
3c60: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3c70: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3c80: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3c90: 20 3d 20 27 5b 27 3b 0a 20 20 20 20 66 6f 72 28   = '[';.    for(
3ca0: 6a 3d 30 3b 20 6a 3c 31 35 20 26 26 20 6a 3c 70  j=0; j<15 && j<p
3cb0: 4d 65 6d 2d 3e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Mem->n; j++){.  
3cc0: 20 20 20 20 75 38 20 63 20 3d 20 70 4d 65 6d 2d      u8 c = pMem-
3cd0: 3e 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  >z[j];.      if(
3ce0: 20 63 3e 3d 30 78 32 30 20 26 26 20 63 3c 30 78   c>=0x20 && c<0x
3cf0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42  7f ){.        zB
3d00: 75 66 5b 6b 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  uf[k++] = c;.   
3d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d20: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 2e    zBuf[k++] = '.
3d30: 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ';.      }.    }
3d40: 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d  .    zBuf[k++] =
3d50: 20 27 5d 27 3b 0a 20 20 20 20 73 71 6c 69 74 65   ']';.    sqlite
3d60: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 26  3_snprintf(100,&
3d70: 7a 42 75 66 5b 6b 5d 2c 20 65 6e 63 6e 61 6d 65  zBuf[k], encname
3d80: 73 5b 70 4d 65 6d 2d 3e 65 6e 63 5d 29 3b 0a 20  s[pMem->enc]);. 
3d90: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
3da0: 74 72 6c 65 6e 33 30 28 26 7a 42 75 66 5b 6b 5d  trlen30(&zBuf[k]
3db0: 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6b 2b 2b 5d  );.    zBuf[k++]
3dc0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
3dd0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
3de0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
3df0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
3e00: 20 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20   a register for 
3e10: 74 72 61 63 69 6e 67 20 70 75 72 70 6f 73 65 73  tracing purposes
3e20: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  :.*/.static void
3e30: 20 6d 65 6d 54 72 61 63 65 50 72 69 6e 74 28 4d   memTracePrint(M
3e40: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
3e50: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 55 6e 64  >flags & MEM_Und
3e60: 65 66 69 6e 65 64 20 29 7b 0a 20 20 20 20 70 72  efined ){.    pr
3e70: 69 6e 74 66 28 22 20 75 6e 64 65 66 69 6e 65 64  intf(" undefined
3e80: 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
3e90: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  p->flags & MEM_N
3ea0: 75 6c 6c 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ull ){.    print
3eb0: 66 28 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  f(p->flags & MEM
3ec0: 5f 5a 65 72 6f 20 3f 20 22 20 4e 55 4c 4c 2d 6e  _Zero ? " NULL-n
3ed0: 6f 63 68 6e 67 22 20 3a 20 22 20 4e 55 4c 4c 22  ochng" : " NULL"
3ee0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
3ef0: 70 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  p->flags & (MEM_
3f00: 49 6e 74 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 28  Int|MEM_Str))==(
3f10: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3f20: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
3f30: 20 73 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75 2e   si:%lld", p->u.
3f40: 69 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  i);.  }else if( 
3f50: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  p->flags & MEM_I
3f60: 6e 74 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  nt ){.    printf
3f70: 28 22 20 69 3a 25 6c 6c 64 22 2c 20 70 2d 3e 75  (" i:%lld", p->u
3f80: 2e 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  .i);.#ifndef SQL
3f90: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
3fa0: 47 5f 50 4f 49 4e 54 0a 20 20 7d 65 6c 73 65 20  G_POINT.  }else 
3fb0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3fc0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 70  EM_Real ){.    p
3fd0: 72 69 6e 74 66 28 22 20 72 3a 25 67 22 2c 20 70  rintf(" r:%g", p
3fe0: 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ->u.r);.#endif. 
3ff0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
4000: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
4010: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
4020: 20 28 72 6f 77 73 65 74 29 22 29 3b 0a 20 20 7d   (rowset)");.  }
4030: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
4040: 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71  Buf[200];.    sq
4050: 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72 65 74  lite3VdbeMemPret
4060: 74 79 50 72 69 6e 74 28 70 2c 20 7a 42 75 66 29  tyPrint(p, zBuf)
4070: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 25  ;.    printf(" %
4080: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 20  s", zBuf);.  }. 
4090: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
40a0: 4d 45 4d 5f 53 75 62 74 79 70 65 20 29 20 70 72  MEM_Subtype ) pr
40b0: 69 6e 74 66 28 22 20 73 75 62 74 79 70 65 3d 30  intf(" subtype=0
40c0: 78 25 30 32 78 22 2c 20 70 2d 3e 65 53 75 62 74  x%02x", p->eSubt
40d0: 79 70 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ype);.}.static v
40e0: 6f 69 64 20 72 65 67 69 73 74 65 72 54 72 61 63  oid registerTrac
40f0: 65 28 69 6e 74 20 69 52 65 67 2c 20 4d 65 6d 20  e(int iReg, Mem 
4100: 2a 70 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 52  *p){.  printf("R
4110: 45 47 5b 25 64 5d 20 3d 20 22 2c 20 69 52 65 67  EG[%d] = ", iReg
4120: 29 3b 0a 20 20 6d 65 6d 54 72 61 63 65 50 72 69  );.  memTracePri
4130: 6e 74 28 70 29 3b 0a 20 20 70 72 69 6e 74 66 28  nt(p);.  printf(
4140: 22 5c 6e 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  "\n");.  sqlite3
4150: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
4160: 72 69 61 6e 74 73 28 70 29 3b 0a 7d 0a 23 65 6e  riants(p);.}.#en
4170: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4180: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4190: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
41a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
41b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
41c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
41d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
41e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
41f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4200: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4210: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4220: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4230: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4240: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4250: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4260: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4270: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4290: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
42a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
42b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
42c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
42d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
42e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
42f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4300: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4310: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4320: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4330: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4350: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4360: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4370: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4380: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4390: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
43a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
43b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
43c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
43d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
43e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
43f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4400: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4410: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4420: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4430: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4440: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4450: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4460: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4470: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4480: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4490: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
44a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
44b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
44c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
44d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
44e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
44f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4500: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4510: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4520: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4530: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4540: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4550: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4570: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4580: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4590: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
45a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
45b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
45c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
45d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
45e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
45f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4600: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4610: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4620: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4630: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4640: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4650: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4660: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4670: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4680: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4690: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
46a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
46b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
46c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
46d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
46e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
46f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4700: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4710: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4720: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4730: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4740: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4750: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4760: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4770: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4780: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4790: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
47a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
47b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
47c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
47d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
47e0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
47f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4800: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4810: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4820: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4830: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4840: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4860: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4870: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4880: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4890: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
48a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
48b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
48c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
48d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
48e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
48f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4900: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4910: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4920: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4930: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4950: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4960: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4970: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4980: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4990: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
49a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
49b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
49c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
49d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
49e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4a00: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4a10: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4a20: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4a30: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4a40: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4a50: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4a70: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4a80: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4a90: 72 6f 67 72 65 73 73 4c 69 6d 69 74 3b 20 20 20  rogressLimit;   
4aa0: 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67 72  /* Invoke xProgr
4ab0: 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53 74  ess() when nVmSt
4ac0: 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73 20  ep reaches this 
4ad0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d 20  */.#endif.  Mem 
4ae0: 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *aMem = p->aMem;
4af0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
4b00: 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20 4d  f p->aMem */.  M
4b10: 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20 20  em *pIn1 = 0;   
4b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73 74            /* 1st
4b30: 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20 2a   input operand *
4b40: 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d 20  /.  Mem *pIn2 = 
4b50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
4b60: 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65 72  * 2nd input oper
4b70: 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49  and */.  Mem *pI
4b80: 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  n3 = 0;         
4b90: 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75 74      /* 3rd input
4ba0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d 65   operand */.  Me
4bb0: 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20 20  m *pOut = 0;    
4bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
4bd0: 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 23 69  ut operand */.#i
4be0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
4bf0: 45 0a 20 20 75 36 34 20 73 74 61 72 74 3b 20 20  E.  u64 start;  
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c10: 2a 20 43 50 55 20 63 6c 6f 63 6b 20 63 6f 75 6e  * CPU clock coun
4c20: 74 20 61 74 20 73 74 61 72 74 20 6f 66 20 6f 70  t at start of op
4c30: 63 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  code */.#endif. 
4c40: 20 2f 2a 2a 2a 20 49 4e 53 45 52 54 20 53 54 41   /*** INSERT STA
4c50: 43 4b 20 55 4e 49 4f 4e 20 48 45 52 45 20 2a 2a  CK UNION HERE **
4c60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
4c70: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
4c80: 49 43 5f 52 55 4e 20 29 3b 20 20 2f 2a 20 73 71  IC_RUN );  /* sq
4c90: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 76 65 72  lite3_step() ver
4ca0: 69 66 69 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ifies this */.  
4cb0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
4cc0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  (p);.  if( p->rc
4cd0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
4ce0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
4cf0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
4d00: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
4d10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
4d20: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
4d30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
4d40: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
4d50: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 67 6f 74  led.  */.    got
4d60: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20  o no_mem;.  }.  
4d70: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
4d80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
4d90: 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
4da0: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
4db0: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
4dc0: 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 21 3d  || p->readOnly!=
4dd0: 30 20 29 3b 0a 20 20 70 2d 3e 69 43 75 72 72 65  0 );.  p->iCurre
4de0: 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 61 73  ntTime = 0;.  as
4df0: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
4e00: 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 52 65 73  ==0 );.  p->pRes
4e10: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 20 20 64 62  ultSet = 0;.  db
4e20: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
4e30: 75 73 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 64  usy = 0;.  if( d
4e40: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
4e50: 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  ted ) goto abort
4e60: 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75 70  _due_to_interrup
4e70: 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
4e80: 49 4f 54 72 61 63 65 53 71 6c 28 70 29 3b 0a 23  IOTraceSql(p);.#
4e90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4ea0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
4eb0: 42 41 43 4b 0a 20 20 69 66 28 20 64 62 2d 3e 78  BACK.  if( db->x
4ec0: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
4ed0: 75 33 32 20 69 50 72 69 6f 72 20 3d 20 70 2d 3e  u32 iPrior = p->
4ee0: 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f  aCounter[SQLITE_
4ef0: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
4f00: 45 50 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  EP];.    assert(
4f10: 20 30 20 3c 20 64 62 2d 3e 6e 50 72 6f 67 72 65   0 < db->nProgre
4f20: 73 73 4f 70 73 20 29 3b 0a 20 20 20 20 6e 50 72  ssOps );.    nPr
4f30: 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 64 62  ogressLimit = db
4f40: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d  ->nProgressOps -
4f50: 20 28 69 50 72 69 6f 72 20 25 20 64 62 2d 3e 6e   (iPrior % db->n
4f60: 50 72 6f 67 72 65 73 73 4f 70 73 29 3b 0a 20 20  ProgressOps);.  
4f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 6f 67  }else{.    nProg
4f80: 72 65 73 73 4c 69 6d 69 74 20 3d 20 30 78 66 66  ressLimit = 0xff
4f90: 66 66 66 66 66 66 3b 0a 20 20 7d 0a 23 65 6e 64  ffffff;.  }.#end
4fa0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4fb0: 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
4fc0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4fd0: 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 63  c();.  if( p->pc
4fe0: 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e 64 62  ==0.   && (p->db
4ff0: 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ->flags & (SQLIT
5000: 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c 53 51  E_VdbeListing|SQ
5010: 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53 51 4c  LITE_VdbeEQP|SQL
5020: 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 29 21  ITE_VdbeTrace))!
5030: 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  =0.  ){.    int 
5040: 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  i;.    int once 
5050: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
5060: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70 29 3b  VdbePrintSql(p);
5070: 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  .    if( p->db->
5080: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
5090: 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a 20 20  dbeListing ){.  
50a0: 20 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45      printf("VDBE
50b0: 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67   Program Listing
50c0: 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  :\n");.      for
50d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
50e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
50f0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
5100: 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61 4f 70  (stdout, i, &aOp
5110: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
5120: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64    }.    if( p->d
5130: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5140: 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20 20 20  E_VdbeEQP ){.   
5150: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
5160: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
5170: 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d 2e 6f      if( aOp[i].o
5180: 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c 61 69  pcode==OP_Explai
5190: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
51a0: 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e 74 66  f( once ) printf
51b0: 28 22 56 44 42 45 20 51 75 65 72 79 20 50 6c 61  ("VDBE Query Pla
51c0: 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  n:\n");.        
51d0: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
51e0: 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b 0a 20   aOp[i].p4.z);. 
51f0: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
5200: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5210: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
5220: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5230: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61  & SQLITE_VdbeTra
5240: 63 65 20 29 20 20 70 72 69 6e 74 66 28 22 56 44  ce )  printf("VD
5250: 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a 20  BE Trace:\n");. 
5260: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
5270: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
5280: 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f 70 3d  endif.  for(pOp=
5290: 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31 3b 20  &aOp[p->pc]; 1; 
52a0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 45  pOp++){.    /* E
52b0: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
52c0: 65 64 20 62 79 20 69 6e 64 69 76 69 64 75 61 6c  ed by individual
52d0: 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68 20 61   opcodes, with a
52e0: 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20 20 20  n immediate.    
52f0: 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62 6f 72  ** jumps to abor
5300: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 2e 20  t_due_to_error. 
5310: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  */.    assert( r
5320: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
5330: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
5340: 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26 61 4f  >=aOp && pOp<&aO
5350: 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69 66 64  p[p->nOp]);.#ifd
5360: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
5370: 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69      start = sqli
5380: 74 65 33 4e 50 72 6f 66 69 6c 65 43 6e 74 20 3f  te3NProfileCnt ?
5390: 20 73 71 6c 69 74 65 33 4e 50 72 6f 66 69 6c 65   sqlite3NProfile
53a0: 43 6e 74 20 3a 20 73 71 6c 69 74 65 33 48 77 74  Cnt : sqlite3Hwt
53b0: 69 6d 65 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ime();.#endif.  
53c0: 20 20 6e 56 6d 53 74 65 70 2b 2b 3b 0a 23 69 66    nVmStep++;.#if
53d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
53e0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
53f0: 53 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 6e 45  S.    if( p->anE
5400: 78 65 63 20 29 20 70 2d 3e 61 6e 45 78 65 63 5b  xec ) p->anExec[
5410: 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29 5d 2b  (int)(pOp-aOp)]+
5420: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  +;.#endif..    /
5430: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 74 72 61  * Only allow tra
5440: 63 69 6e 67 20 69 66 20 53 51 4c 49 54 45 5f 44  cing if SQLITE_D
5450: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
5460: 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
5470: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
5480: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20  if( db->flags & 
5490: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
54a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
54b0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64  3VdbePrintOp(std
54c0: 6f 75 74 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d  out, (int)(pOp -
54d0: 20 61 4f 70 29 2c 20 70 4f 70 29 3b 0a 20 20 20   aOp), pOp);.   
54e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
54f0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
5500: 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64  o see if we need
5510: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
5520: 69 6e 74 65 72 72 75 70 74 2e 20 20 54 68 69 73  interrupt.  This
5530: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 0a 20 20   only happens.  
5540: 20 20 2a 2a 20 69 66 20 77 65 20 68 61 76 65 20    ** if we have 
5550: 61 20 73 70 65 63 69 61 6c 20 74 65 73 74 20 62  a special test b
5560: 75 69 6c 64 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  uild..    */.#if
5570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
5580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5590: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3e  interrupt_count>
55a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
55b0: 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
55c0: 6e 74 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  nt--;.      if( 
55d0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
55e0: 74 5f 63 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20  t_count==0 ){.  
55f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
5600: 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 20  terrupt(db);.   
5610: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
5620: 66 0a 0a 20 20 20 20 2f 2a 20 53 61 6e 69 74 79  f..    /* Sanity
5630: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 6f 74 68   checking on oth
5640: 65 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 23  er operands */.#
5650: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5660: 55 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 75  UG.    {.      u
5670: 38 20 6f 70 50 72 6f 70 65 72 74 79 20 3d 20 73  8 opProperty = s
5680: 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70  qlite3OpcodeProp
5690: 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65  erty[pOp->opcode
56a0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70  ];.      if( (op
56b0: 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47  Property & OPFLG
56c0: 5f 49 4e 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  _IN1)!=0 ){.    
56d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
56e0: 3e 70 31 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  >p1>0 );.       
56f0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
5700: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
5710: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
5720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
5730: 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70  mIsValid(&aMem[p
5740: 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20 20  Op->p1]) );.    
5750: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
5760: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
5770: 6e 76 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b  nvariants(&aMem[
5780: 70 4f 70 2d 3e 70 31 5d 29 20 29 3b 0a 20 20 20  pOp->p1]) );.   
5790: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
57a0: 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 26 61 4d  ACE(pOp->p1, &aM
57b0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a 20 20  em[pOp->p1]);.  
57c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
57d0: 28 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50  (opProperty & OP
57e0: 46 4c 47 5f 49 4e 32 29 21 3d 30 20 29 7b 0a 20  FLG_IN2)!=0 ){. 
57f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5800: 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20  Op->p2>0 );.    
5810: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5820: 3e 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p2<=(p->nMem+1 
5830: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5840: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5850: 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65   memIsValid(&aMe
5860: 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a 20  m[pOp->p2]) );. 
5870: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5880: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
5890: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 26 61 4d  emInvariants(&aM
58a0: 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 20 29 3b 0a  em[pOp->p2]) );.
58b0: 20 20 20 20 20 20 20 20 52 45 47 49 53 54 45 52          REGISTER
58c0: 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20  _TRACE(pOp->p2, 
58d0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b  &aMem[pOp->p2]);
58e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
58f0: 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79 20 26  f( (opProperty &
5900: 20 4f 50 46 4c 47 5f 49 4e 33 29 21 3d 30 20 29   OPFLG_IN3)!=0 )
5910: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5920: 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20  ( pOp->p3>0 );. 
5930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5940: 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
5950: 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
5960: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5970: 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
5980: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29  aMem[pOp->p3]) )
5990: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
59a0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
59b0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
59c0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20  &aMem[pOp->p3]) 
59d0: 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47 49 53  );.        REGIS
59e0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
59f0: 33 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33  3, &aMem[pOp->p3
5a00: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
5a10: 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74    if( (opPropert
5a20: 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32 29 21  y & OPFLG_OUT2)!
5a30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
5a40: 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20  sert( pOp->p2>0 
5a50: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5a60: 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d 3e  t( pOp->p2<=(p->
5a70: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
5a80: 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  sor) );.        
5a90: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
5aa0: 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  (p, &aMem[pOp->p
5ab0: 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
5ac0: 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72     if( (opProper
5ad0: 74 79 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33 29  ty & OPFLG_OUT3)
5ae0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5af0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
5b00: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5b10: 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d  rt( pOp->p3<=(p-
5b20: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
5b30: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
5b40: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
5b50: 65 28 70 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  e(p, &aMem[pOp->
5b60: 70 33 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p3]);.      }.  
5b70: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
5b80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
5b90: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
5ba0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
5bb0: 20 20 70 4f 72 69 67 4f 70 20 3d 20 70 4f 70 3b    pOrigOp = pOp;
5bc0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 73  .#endif.  .    s
5bd0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f  witch( pOp->opco
5be0: 64 65 20 29 7b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  de ){../********
5bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c30: 2a 2a 2a 2a 2a 0a 2a 2a 20 57 68 61 74 20 66 6f  *****.** What fo
5c40: 6c 6c 6f 77 73 20 69 73 20 61 20 6d 61 73 73 69  llows is a massi
5c50: 76 65 20 73 77 69 74 63 68 20 73 74 61 74 65 6d  ve switch statem
5c60: 65 6e 74 20 77 68 65 72 65 20 65 61 63 68 20 63  ent where each c
5c70: 61 73 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ase implements a
5c80: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 73  .** separate ins
5c90: 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  truction in the 
5ca0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
5cb0: 20 20 49 66 20 77 65 20 66 6f 6c 6c 6f 77 20 74    If we follow t
5cc0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 69 6e 64 65  he usual.** inde
5cd0: 6e 74 61 74 69 6f 6e 20 63 6f 6e 76 65 6e 74 69  ntation conventi
5ce0: 6f 6e 73 2c 20 65 61 63 68 20 63 61 73 65 20 73  ons, each case s
5cf0: 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
5d00: 64 20 62 79 20 36 20 73 70 61 63 65 73 2e 20 20  d by 6 spaces.  
5d10: 42 75 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  But.** that is a
5d20: 20 6c 6f 74 20 6f 66 20 77 61 73 74 65 64 20 73   lot of wasted s
5d30: 70 61 63 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  pace on the left
5d40: 20 6d 61 72 67 69 6e 2e 20 20 53 6f 20 74 68 65   margin.  So the
5d50: 20 63 6f 64 65 20 77 69 74 68 69 6e 0a 2a 2a 20   code within.** 
5d60: 74 68 65 20 73 77 69 74 63 68 20 73 74 61 74 65  the switch state
5d70: 6d 65 6e 74 20 77 69 6c 6c 20 62 72 65 61 6b 20  ment will break 
5d80: 77 69 74 68 20 63 6f 6e 76 65 6e 74 69 6f 6e 20  with convention 
5d90: 61 6e 64 20 62 65 20 66 6c 75 73 68 2d 6c 65 66  and be flush-lef
5da0: 74 2e 20 41 6e 6f 74 68 65 72 0a 2a 2a 20 62 69  t. Another.** bi
5db0: 67 20 63 6f 6d 6d 65 6e 74 20 28 73 69 6d 69 6c  g comment (simil
5dc0: 61 72 20 74 6f 20 74 68 69 73 20 6f 6e 65 29 20  ar to this one) 
5dd0: 77 69 6c 6c 20 6d 61 72 6b 20 74 68 65 20 70 6f  will mark the po
5de0: 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
5df0: 77 68 65 72 65 0a 2a 2a 20 77 65 20 74 72 61 6e  where.** we tran
5e00: 73 69 74 69 6f 6e 20 62 61 63 6b 20 74 6f 20 6e  sition back to n
5e10: 6f 72 6d 61 6c 20 69 6e 64 65 6e 74 61 74 69 6f  ormal indentatio
5e20: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
5e30: 6d 61 74 74 69 6e 67 20 6f 66 20 65 61 63 68 20  matting of each 
5e40: 63 61 73 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  case is importan
5e50: 74 2e 20 20 54 68 65 20 6d 61 6b 65 66 69 6c 65  t.  The makefile
5e60: 20 66 6f 72 20 53 51 4c 69 74 65 0a 2a 2a 20 67   for SQLite.** g
5e70: 65 6e 65 72 61 74 65 73 20 74 77 6f 20 43 20 66  enerates two C f
5e80: 69 6c 65 73 20 22 6f 70 63 6f 64 65 73 2e 68 22  iles "opcodes.h"
5e90: 20 61 6e 64 20 22 6f 70 63 6f 64 65 73 2e 63 22   and "opcodes.c"
5ea0: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
5eb0: 73 0a 2a 2a 20 66 69 6c 65 20 6c 6f 6f 6b 69 6e  s.** file lookin
5ec0: 67 20 66 6f 72 20 6c 69 6e 65 73 20 74 68 61 74  g for lines that
5ed0: 20 62 65 67 69 6e 20 77 69 74 68 20 22 63 61 73   begin with "cas
5ee0: 65 20 4f 50 5f 22 2e 20 20 54 68 65 20 6f 70 63  e OP_".  The opc
5ef0: 6f 64 65 73 2e 68 20 66 69 6c 65 73 0a 2a 2a 20  odes.h files.** 
5f00: 77 69 6c 6c 20 62 65 20 66 69 6c 6c 65 64 20 77  will be filled w
5f10: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
5f20: 74 20 67 69 76 65 20 75 6e 69 71 75 65 20 69 6e  t give unique in
5f30: 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 6f 20  teger values to 
5f40: 65 61 63 68 0a 2a 2a 20 6f 70 63 6f 64 65 20 61  each.** opcode a
5f50: 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 73 2e 63  nd the opcodes.c
5f60: 20 66 69 6c 65 20 69 73 20 66 69 6c 6c 65 64 20   file is filled 
5f70: 77 69 74 68 20 61 6e 20 61 72 72 61 79 20 6f 66  with an array of
5f80: 20 73 74 72 69 6e 67 73 20 77 68 65 72 65 0a 2a   strings where.*
5f90: 2a 20 65 61 63 68 20 73 74 72 69 6e 67 20 69 73  * each string is
5fa0: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
5fb0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  me for the corre
5fc0: 73 70 6f 6e 64 69 6e 67 20 6f 70 63 6f 64 65 2e  sponding opcode.
5fd0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 61 73 65    If the.** case
5fe0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 66 6f   statement is fo
5ff0: 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6d 6d  llowed by a comm
6000: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ent of the form 
6010: 22 2f 23 20 73 61 6d 65 20 61 73 20 2e 2e 2e 20  "/# same as ... 
6020: 23 2f 22 0a 2a 2a 20 74 68 61 74 20 63 6f 6d 6d  #/".** that comm
6030: 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ent is used to d
6040: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 72  etermine the par
6050: 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
6060: 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a   the opcode..**.
6070: 2a 2a 20 4f 74 68 65 72 20 6b 65 79 77 6f 72 64  ** Other keyword
6080: 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  s in the comment
6090: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65 61   that follows ea
60a0: 63 68 20 63 61 73 65 20 61 72 65 20 75 73 65 64  ch case are used
60b0: 20 74 6f 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74   to.** construct
60c0: 20 74 68 65 20 4f 50 46 4c 47 5f 49 4e 49 54 49   the OPFLG_INITI
60d0: 41 4c 49 5a 45 52 20 76 61 6c 75 65 20 74 68 61  ALIZER value tha
60e0: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6f 70  t initializes op
60f0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 5d 2e 0a  codeProperty[]..
6100: 2a 2a 20 4b 65 79 77 6f 72 64 73 20 69 6e 63 6c  ** Keywords incl
6110: 75 64 65 3a 20 69 6e 31 2c 20 69 6e 32 2c 20 69  ude: in1, in2, i
6120: 6e 33 2c 20 6f 75 74 32 2c 20 6f 75 74 33 2e 20  n3, out2, out3. 
6130: 20 53 65 65 0a 2a 2a 20 74 68 65 20 6d 6b 6f 70   See.** the mkop
6140: 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
6150: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
6160: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
6170: 2a 2a 20 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  ** Documentation
6180: 20 61 62 6f 75 74 20 56 44 42 45 20 6f 70 63 6f   about VDBE opco
6190: 64 65 73 20 69 73 20 67 65 6e 65 72 61 74 65 64  des is generated
61a0: 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 69   by scanning thi
61b0: 73 20 66 69 6c 65 0a 2a 2a 20 66 6f 72 20 6c 69  s file.** for li
61c0: 6e 65 73 20 6f 66 20 74 68 61 74 20 63 6f 6e 74  nes of that cont
61d0: 61 69 6e 20 22 4f 70 63 6f 64 65 3a 22 2e 20 20  ain "Opcode:".  
61e0: 54 68 61 74 20 6c 69 6e 65 20 61 6e 64 20 61 6c  That line and al
61f0: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
6200: 63 6f 6d 6d 65 6e 74 20 6c 69 6e 65 73 20 61 72  comment lines ar
6210: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 67 65  e used in the ge
6220: 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  neration of the 
6230: 6f 70 63 6f 64 65 2e 68 74 6d 6c 20 64 6f 63 75  opcode.html docu
6240: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  mentation.** fil
6250: 65 2e 0a 2a 2a 0a 2a 2a 20 53 55 4d 4d 41 52 59  e..**.** SUMMARY
6260: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 6d  :.**.**     Form
6270: 61 74 74 69 6e 67 20 69 73 20 69 6d 70 6f 72 74  atting is import
6280: 61 6e 74 20 74 6f 20 73 63 72 69 70 74 73 20 74  ant to scripts t
6290: 68 61 74 20 73 63 61 6e 20 74 68 69 73 20 66 69  hat scan this fi
62a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 44 6f 20 6e 6f  le..**     Do no
62b0: 74 20 64 65 76 69 61 74 65 20 66 72 6f 6d 20 74  t deviate from t
62c0: 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 73 74  he formatting st
62d0: 79 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  yle currently in
62e0: 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a   use..**.*******
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6330: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  ******/../* Opco
6340: 64 65 3a 20 20 47 6f 74 6f 20 2a 20 50 32 20 2a  de:  Goto * P2 *
6350: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41 6e 20 75 6e   * *.**.** An un
6360: 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70  conditional jump
6370: 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e 0a   to address P2..
6380: 2a 2a 20 54 68 65 20 6e 65 78 74 20 69 6e 73 74  ** The next inst
6390: 72 75 63 74 69 6f 6e 20 65 78 65 63 75 74 65 64  ruction executed
63a0: 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 74 68 65   will be .** the
63b0: 20 6f 6e 65 20 61 74 20 69 6e 64 65 78 20 50 32   one at index P2
63c0: 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
63d0: 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 70 72  ing of.** the pr
63e0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ogram..**.** The
63f0: 20 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73   P1 parameter is
6400: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 75 73   not actually us
6410: 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f 64  ed by this opcod
6420: 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 74 0a  e.  However, it.
6430: 2a 2a 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  ** is sometimes 
6440: 73 65 74 20 74 6f 20 31 20 69 6e 73 74 65 61 64  set to 1 instead
6450: 20 6f 66 20 30 20 61 73 20 61 20 68 69 6e 74 20   of 0 as a hint 
6460: 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  to the command-l
6470: 69 6e 65 20 73 68 65 6c 6c 0a 2a 2a 20 74 68 61  ine shell.** tha
6480: 74 20 74 68 69 73 20 47 6f 74 6f 20 69 73 20 74  t this Goto is t
6490: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 61 20 6c  he bottom of a l
64a0: 6f 6f 70 20 61 6e 64 20 74 68 61 74 20 74 68 65  oop and that the
64b0: 20 6c 69 6e 65 73 20 66 72 6f 6d 20 50 32 20 64   lines from P2 d
64c0: 6f 77 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 63 75  own.** to the cu
64d0: 72 72 65 6e 74 20 6c 69 6e 65 20 73 68 6f 75 6c  rrent line shoul
64e0: 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 66 6f  d be indented fo
64f0: 72 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74  r EXPLAIN output
6500: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 74  ..*/.case OP_Got
6510: 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  o: {            
6520: 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 6a 75 6d 70   /* jump */.jump
6530: 5f 74 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b  _to_p2_and_check
6540: 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3a 0a  _for_interrupt:.
6550: 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70    pOp = &aOp[pOp
6560: 2d 3e 70 32 20 2d 20 31 5d 3b 0a 0a 20 20 2f 2a  ->p2 - 1];..  /*
6570: 20 4f 70 63 6f 64 65 73 20 74 68 61 74 20 61 72   Opcodes that ar
6580: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 62 6f  e used as the bo
6590: 74 74 6f 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 28  ttom of a loop (
65a0: 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
65b0: 2c 0a 20 20 2a 2a 20 4f 50 5f 56 4e 65 78 74 2c  ,.  ** OP_VNext,
65c0: 20 6f 72 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78   or OP_SorterNex
65d0: 74 29 20 61 6c 6c 20 6a 75 6d 70 20 68 65 72 65  t) all jump here
65e0: 20 75 70 6f 6e 0a 20 20 2a 2a 20 63 6f 6d 70 6c   upon.  ** compl
65f0: 65 74 69 6f 6e 2e 20 20 43 68 65 63 6b 20 74 6f  etion.  Check to
6600: 20 73 65 65 20 69 66 20 73 71 6c 69 74 65 33 5f   see if sqlite3_
6610: 69 6e 74 65 72 72 75 70 74 28 29 20 68 61 73 20  interrupt() has 
6620: 62 65 65 6e 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  been called.  **
6630: 20 6f 72 20 69 66 20 74 68 65 20 70 72 6f 67 72   or if the progr
6640: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 6e 65 65  ess callback nee
6650: 64 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ds to be invoked
6660: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  . .  **.  ** Thi
6670: 73 20 63 6f 64 65 20 75 73 65 73 20 75 6e 73 74  s code uses unst
6680: 72 75 63 74 75 72 65 64 20 22 67 6f 74 6f 22 20  ructured "goto" 
6690: 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 64  statements and d
66a0: 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 20 63 6c 65  oes not look cle
66b0: 61 6e 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 61  an..  ** But tha
66c0: 74 20 69 73 20 6e 6f 74 20 64 75 65 20 74 6f 20  t is not due to 
66d0: 73 6c 6f 70 70 79 20 63 6f 64 69 6e 67 20 68 61  sloppy coding ha
66e0: 62 69 74 73 2e 20 54 68 65 20 63 6f 64 65 20 69  bits. The code i
66f0: 73 20 77 72 69 74 74 65 6e 20 74 68 69 73 0a 20  s written this. 
6700: 20 2a 2a 20 77 61 79 20 66 6f 72 20 70 65 72 66   ** way for perf
6710: 6f 72 6d 61 6e 63 65 2c 20 74 6f 20 61 76 6f 69  ormance, to avoi
6720: 64 20 68 61 76 69 6e 67 20 74 6f 20 72 75 6e 20  d having to run 
6730: 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 61 6e  the interrupt an
6740: 64 20 70 72 6f 67 72 65 73 73 0a 20 20 2a 2a 20  d progress.  ** 
6750: 63 68 65 63 6b 73 20 6f 6e 20 65 76 65 72 79 20  checks on every 
6760: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 68 65  opcode.  This he
6770: 6c 70 73 20 73 71 6c 69 74 65 33 5f 73 74 65 70  lps sqlite3_step
6780: 28 29 20 74 6f 20 72 75 6e 20 61 62 6f 75 74 20  () to run about 
6790: 31 2e 35 25 0a 20 20 2a 2a 20 66 61 73 74 65 72  1.5%.  ** faster
67a0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 22 76   according to "v
67b0: 61 6c 67 72 69 6e 64 20 2d 2d 74 6f 6f 6c 3d 63  algrind --tool=c
67c0: 61 63 68 65 67 72 69 6e 64 22 20 2a 2f 0a 63 68  achegrind" */.ch
67d0: 65 63 6b 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70  eck_for_interrup
67e0: 74 3a 0a 20 20 69 66 28 20 64 62 2d 3e 75 31 2e  t:.  if( db->u1.
67f0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 20  isInterrupted ) 
6800: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
6810: 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 23 69 66  o_interrupt;.#if
6820: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6830: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
6840: 43 4b 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  CK.  /* Call the
6850: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
6860: 63 6b 20 69 66 20 69 74 20 69 73 20 63 6f 6e 66  ck if it is conf
6870: 69 67 75 72 65 64 20 61 6e 64 20 74 68 65 20 72  igured and the r
6880: 65 71 75 69 72 65 64 20 6e 75 6d 62 65 72 0a 20  equired number. 
6890: 20 2a 2a 20 6f 66 20 56 44 42 45 20 6f 70 73 20   ** of VDBE ops 
68a0: 68 61 76 65 20 62 65 65 6e 20 65 78 65 63 75 74  have been execut
68b0: 65 64 20 28 65 69 74 68 65 72 20 73 69 6e 63 65  ed (either since
68c0: 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69 6f 6e   this invocation
68d0: 20 6f 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   of.  ** sqlite3
68e0: 56 64 62 65 45 78 65 63 28 29 20 6f 72 20 73 69  VdbeExec() or si
68f0: 6e 63 65 20 6c 61 73 74 20 74 69 6d 65 20 74 68  nce last time th
6900: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6910: 61 63 6b 20 77 61 73 20 63 61 6c 6c 65 64 29 2e  ack was called).
6920: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 72 6f  .  ** If the pro
6930: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 72  gress callback r
6940: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
6950: 20 65 78 69 74 20 74 68 65 20 76 69 72 74 75 61   exit the virtua
6960: 6c 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 20  l machine with. 
6970: 20 2a 2a 20 61 20 72 65 74 75 72 6e 20 63 6f 64   ** a return cod
6980: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 2e 0a  e SQLITE_ABORT..
6990: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 56 6d 53 74    */.  if( nVmSt
69a0: 65 70 3e 3d 6e 50 72 6f 67 72 65 73 73 4c 69 6d  ep>=nProgressLim
69b0: 69 74 20 26 26 20 64 62 2d 3e 78 50 72 6f 67 72  it && db->xProgr
69c0: 65 73 73 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ess!=0 ){.    as
69d0: 73 65 72 74 28 20 64 62 2d 3e 6e 50 72 6f 67 72  sert( db->nProgr
69e0: 65 73 73 4f 70 73 21 3d 30 20 29 3b 0a 20 20 20  essOps!=0 );.   
69f0: 20 6e 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20   nProgressLimit 
6a00: 3d 20 6e 56 6d 53 74 65 70 20 2b 20 64 62 2d 3e  = nVmStep + db->
6a10: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 2d 20 28  nProgressOps - (
6a20: 6e 56 6d 53 74 65 70 25 64 62 2d 3e 6e 50 72 6f  nVmStep%db->nPro
6a30: 67 72 65 73 73 4f 70 73 29 3b 0a 20 20 20 20 69  gressOps);.    i
6a40: 66 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73  f( db->xProgress
6a50: 28 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72  (db->pProgressAr
6a60: 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
6a70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6a80: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 62  T;.      goto ab
6a90: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
6aa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6ab0: 69 66 0a 20 20 0a 20 20 62 72 65 61 6b 3b 0a 7d  if.  .  break;.}
6ac0: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f  ../* Opcode:  Go
6ad0: 73 75 62 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  sub P1 P2 * * *.
6ae0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
6af0: 63 75 72 72 65 6e 74 20 61 64 64 72 65 73 73 20  current address 
6b00: 6f 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 31  onto register P1
6b10: 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6a 75 6d  .** and then jum
6b20: 70 20 74 6f 20 61 64 64 72 65 73 73 20 50 32 2e  p to address P2.
6b30: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 6f 73 75  .*/.case OP_Gosu
6b40: 62 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  b: {            
6b50: 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  /* jump */.  ass
6b60: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
6b70: 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e  & pOp->p1<=(p->n
6b80: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
6b90: 6f 72 29 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20  or) );.  pIn1 = 
6ba0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
6bb0: 20 20 61 73 73 65 72 74 28 20 56 64 62 65 4d 65    assert( VdbeMe
6bc0: 6d 44 79 6e 61 6d 69 63 28 70 49 6e 31 29 3d 3d  mDynamic(pIn1)==
6bd0: 30 20 29 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54  0 );.  memAboutT
6be0: 6f 43 68 61 6e 67 65 28 70 2c 20 70 49 6e 31 29  oChange(p, pIn1)
6bf0: 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
6c00: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 49 6e  = MEM_Int;.  pIn
6c10: 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74 29 28 70  1->u.i = (int)(p
6c20: 4f 70 2d 61 4f 70 29 3b 0a 20 20 52 45 47 49 53  Op-aOp);.  REGIS
6c30: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
6c40: 31 2c 20 70 49 6e 31 29 3b 0a 0a 20 20 2f 2a 20  1, pIn1);..  /* 
6c50: 4d 6f 73 74 20 6a 75 6d 70 20 6f 70 65 72 61 74  Most jump operat
6c60: 69 6f 6e 73 20 64 6f 20 61 20 67 6f 74 6f 20 74  ions do a goto t
6c70: 6f 20 74 68 69 73 20 73 70 6f 74 20 69 6e 20 6f  o this spot in o
6c80: 72 64 65 72 20 74 6f 20 75 70 64 61 74 65 0a 20  rder to update. 
6c90: 20 2a 2a 20 74 68 65 20 70 4f 70 20 70 6f 69 6e   ** the pOp poin
6ca0: 74 65 72 2e 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f  ter. */.jump_to_
6cb0: 70 32 3a 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70  p2:.  pOp = &aOp
6cc0: 5b 70 4f 70 2d 3e 70 32 20 2d 20 31 5d 3b 0a 20  [pOp->p2 - 1];. 
6cd0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
6ce0: 63 6f 64 65 3a 20 20 52 65 74 75 72 6e 20 50 31  code:  Return P1
6cf0: 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a   * * * *.**.** J
6d00: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
6d10: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 66 74 65  instruction afte
6d20: 72 20 74 68 65 20 61 64 64 72 65 73 73 20 69 6e  r the address in
6d30: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 41   register P1.  A
6d40: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 75 6d 70  fter.** the jump
6d50: 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62 65  , register P1 be
6d60: 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64 2e  comes undefined.
6d70: 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 74 75  .*/.case OP_Retu
6d80: 72 6e 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  rn: {           
6d90: 2f 2a 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  /* in1 */.  pIn1
6da0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
6db0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
6dc0: 31 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e  1->flags==MEM_In
6dd0: 74 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61 4f  t );.  pOp = &aO
6de0: 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20 20  p[pIn1->u.i];.  
6df0: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pIn1->flags = ME
6e00: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 62  M_Undefined;.  b
6e10: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
6e20: 64 65 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e  de: InitCoroutin
6e30: 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  e P1 P2 P3 * *.*
6e40: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 72 65 67 69  *.** Set up regi
6e50: 73 74 65 72 20 50 31 20 73 6f 20 74 68 61 74 20  ster P1 so that 
6e60: 69 74 20 77 69 6c 6c 20 59 69 65 6c 64 20 74 6f  it will Yield to
6e70: 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65 0a 2a   the coroutine.*
6e80: 2a 20 6c 6f 63 61 74 65 64 20 61 74 20 61 64 64  * located at add
6e90: 72 65 73 73 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 49  ress P3..**.** I
6ea0: 66 20 50 32 21 3d 30 20 74 68 65 6e 20 74 68 65  f P2!=0 then the
6eb0: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
6ec0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6d 6d 65 64 69  mentation immedi
6ed0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 0a 2a 2a  ately follows.**
6ee0: 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 20 20 53   this opcode.  S
6ef0: 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
6f00: 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
6f10: 65 6e 74 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 61  entation to.** a
6f20: 64 64 72 65 73 73 20 50 32 2e 0a 2a 2a 0a 2a 2a  ddress P2..**.**
6f30: 20 53 65 65 20 61 6c 73 6f 3a 20 45 6e 64 43 6f   See also: EndCo
6f40: 72 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20  routine.*/.case 
6f50: 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
6f60: 3a 20 7b 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20  : {     /* jump 
6f70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
6f80: 2d 3e 70 31 3e 30 20 26 26 20 20 70 4f 70 2d 3e  ->p1>0 &&  pOp->
6f90: 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p1<=(p->nMem+1 -
6fa0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
6fb0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
6fc0: 32 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c  2>=0 && pOp->p2<
6fd0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 61 73 73 65  p->nOp );.  asse
6fe0: 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26  rt( pOp->p3>=0 &
6ff0: 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 4f 70  & pOp->p3<p->nOp
7000: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
7010: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
7020: 73 73 65 72 74 28 20 21 56 64 62 65 4d 65 6d 44  ssert( !VdbeMemD
7030: 79 6e 61 6d 69 63 28 70 4f 75 74 29 20 29 3b 0a  ynamic(pOut) );.
7040: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 70 4f    pOut->u.i = pO
7050: 70 2d 3e 70 33 20 2d 20 31 3b 0a 20 20 70 4f 75  p->p3 - 1;.  pOu
7060: 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  t->flags = MEM_I
7070: 6e 74 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  nt;.  if( pOp->p
7080: 32 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f  2 ) goto jump_to
7090: 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  _p2;.  break;.}.
70a0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 45 6e 64  ./* Opcode:  End
70b0: 43 6f 72 6f 75 74 69 6e 65 20 50 31 20 2a 20 2a  Coroutine P1 * *
70c0: 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69   * *.**.** The i
70d0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20 74 68  nstruction at th
70e0: 65 20 61 64 64 72 65 73 73 20 69 6e 20 72 65 67  e address in reg
70f0: 69 73 74 65 72 20 50 31 20 69 73 20 61 20 59 69  ister P1 is a Yi
7100: 65 6c 64 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  eld..** Jump to 
7110: 74 68 65 20 50 32 20 70 61 72 61 6d 65 74 65 72  the P2 parameter
7120: 20 6f 66 20 74 68 61 74 20 59 69 65 6c 64 2e 0a   of that Yield..
7130: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 75 6d  ** After the jum
7140: 70 2c 20 72 65 67 69 73 74 65 72 20 50 31 20 62  p, register P1 b
7150: 65 63 6f 6d 65 73 20 75 6e 64 65 66 69 6e 65 64  ecomes undefined
7160: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
7170: 3a 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a  : InitCoroutine.
7180: 2a 2f 0a 63 61 73 65 20 4f 50 5f 45 6e 64 43 6f  */.case OP_EndCo
7190: 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 20  routine: {      
71a0: 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a 20       /* in1 */. 
71b0: 20 56 64 62 65 4f 70 20 2a 70 43 61 6c 6c 65 72   VdbeOp *pCaller
71c0: 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ;.  pIn1 = &aMem
71d0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
71e0: 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73  ert( pIn1->flags
71f0: 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 61  ==MEM_Int );.  a
7200: 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 75 2e 69  ssert( pIn1->u.i
7210: 3e 3d 30 20 26 26 20 70 49 6e 31 2d 3e 75 2e 69  >=0 && pIn1->u.i
7220: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 43 61  <p->nOp );.  pCa
7230: 6c 6c 65 72 20 3d 20 26 61 4f 70 5b 70 49 6e 31  ller = &aOp[pIn1
7240: 2d 3e 75 2e 69 5d 3b 0a 20 20 61 73 73 65 72 74  ->u.i];.  assert
7250: 28 20 70 43 61 6c 6c 65 72 2d 3e 6f 70 63 6f 64  ( pCaller->opcod
7260: 65 3d 3d 4f 50 5f 59 69 65 6c 64 20 29 3b 0a 20  e==OP_Yield );. 
7270: 20 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72   assert( pCaller
7280: 2d 3e 70 32 3e 3d 30 20 26 26 20 70 43 61 6c 6c  ->p2>=0 && pCall
7290: 65 72 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  er->p2<p->nOp );
72a0: 0a 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 43  .  pOp = &aOp[pC
72b0: 61 6c 6c 65 72 2d 3e 70 32 20 2d 20 31 5d 3b 0a  aller->p2 - 1];.
72c0: 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d 20    pIn1->flags = 
72d0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
72e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
72f0: 63 6f 64 65 3a 20 20 59 69 65 6c 64 20 50 31 20  code:  Yield P1 
7300: 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53  P2 * * *.**.** S
7310: 77 61 70 20 74 68 65 20 70 72 6f 67 72 61 6d 20  wap the program 
7320: 63 6f 75 6e 74 65 72 20 77 69 74 68 20 74 68 65  counter with the
7330: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
7340: 65 72 20 50 31 2e 20 20 54 68 69 73 0a 2a 2a 20  er P1.  This.** 
7350: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
7360: 66 20 79 69 65 6c 64 69 6e 67 20 74 6f 20 61 20  f yielding to a 
7370: 63 6f 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  coroutine..**.**
7380: 20 49 66 20 74 68 65 20 63 6f 72 6f 75 74 69 6e   If the coroutin
7390: 65 20 74 68 61 74 20 69 73 20 6c 61 75 6e 63 68  e that is launch
73a0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72  ed by this instr
73b0: 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74 68  uction ends with
73c0: 0a 2a 2a 20 59 69 65 6c 64 20 6f 72 20 52 65 74  .** Yield or Ret
73d0: 75 72 6e 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  urn then continu
73e0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  e to the next in
73f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74 20  struction.  But 
7400: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 72 6f 75 74  if.** the corout
7410: 69 6e 65 20 6c 61 75 6e 63 68 65 64 20 62 79 20  ine launched by 
7420: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
7430: 20 65 6e 64 73 20 77 69 74 68 0a 2a 2a 20 45 6e   ends with.** En
7440: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  dCoroutine, then
7450: 20 6a 75 6d 70 20 74 6f 20 50 32 20 72 61 74 68   jump to P2 rath
7460: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 6e 75 69  er than continui
7470: 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 6e  ng with the.** n
7480: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
7490: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
74a0: 20 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 0a 2a   InitCoroutine.*
74b0: 2f 0a 63 61 73 65 20 4f 50 5f 59 69 65 6c 64 3a  /.case OP_Yield:
74c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
74d0: 20 69 6e 31 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20   in1, jump */.  
74e0: 69 6e 74 20 70 63 44 65 73 74 3b 0a 20 20 70 49  int pcDest;.  pI
74f0: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
7500: 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 56  p1];.  assert( V
7510: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 49  dbeMemDynamic(pI
7520: 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 31  n1)==0 );.  pIn1
7530: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7540: 74 3b 0a 20 20 70 63 44 65 73 74 20 3d 20 28 69  t;.  pcDest = (i
7550: 6e 74 29 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20  nt)pIn1->u.i;.  
7560: 70 49 6e 31 2d 3e 75 2e 69 20 3d 20 28 69 6e 74  pIn1->u.i = (int
7570: 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
7580: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
7590: 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b 0a 20  Op->p1, pIn1);. 
75a0: 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 63 44 65   pOp = &aOp[pcDe
75b0: 73 74 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  st];.  break;.}.
75c0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
75d0: 74 49 66 4e 75 6c 6c 20 20 50 31 20 50 32 20 50  tIfNull  P1 P2 P
75e0: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
75f0: 73 69 73 3a 20 69 66 20 72 5b 50 33 5d 3d 6e 75  sis: if r[P3]=nu
7600: 6c 6c 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 43 68  ll halt.**.** Ch
7610: 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eck the value in
7620: 20 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 49   register P3.  I
7630: 66 20 69 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  f it is NULL the
7640: 6e 20 48 61 6c 74 20 75 73 69 6e 67 0a 2a 2a 20  n Halt using.** 
7650: 70 61 72 61 6d 65 74 65 72 20 50 31 2c 20 50 32  parameter P1, P2
7660: 2c 20 61 6e 64 20 50 34 20 61 73 20 69 66 20 74  , and P4 as if t
7670: 68 69 73 20 77 65 72 65 20 61 20 48 61 6c 74 20  his were a Halt 
7680: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49 66  instruction.  If
7690: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 6e   the.** value in
76a0: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
76b0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
76c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
76d0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 50   no-op..** The P
76e0: 35 20 70 61 72 61 6d 65 74 65 72 20 73 68 6f 75  5 parameter shou
76f0: 6c 64 20 62 65 20 31 2e 0a 2a 2f 0a 63 61 73 65  ld be 1..*/.case
7700: 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 3a 20   OP_HaltIfNull: 
7710: 7b 20 20 20 20 20 20 2f 2a 20 69 6e 33 20 2a 2f  {      /* in3 */
7720: 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
7730: 70 4f 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66  pOp->p3];.#ifdef
7740: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7750: 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f  if( pOp->p2==OE_
7760: 41 62 6f 72 74 20 29 7b 20 73 71 6c 69 74 65 33  Abort ){ sqlite3
7770: 56 64 62 65 41 73 73 65 72 74 41 62 6f 72 74 61  VdbeAssertAborta
7780: 62 6c 65 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66  ble(p); }.#endif
7790: 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c  .  if( (pIn3->fl
77a0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
77b0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a  =0 ) break;.  /*
77c0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
77d0: 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a  to OP_Halt */.}.
77e0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
77f0: 74 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  t P1 P2 * P4 P5.
7800: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
7810: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
7820: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
7830: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
7840: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
7850: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
7860: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
7870: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
7880: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
7890: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
78a0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
78b0: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
78c0: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
78d0: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
78e0: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
78f0: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
7900: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
7910: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
7920: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
7930: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7940: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
7950: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7960: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
7970: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
7980: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
7990: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
79a0: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
79b0: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
79c0: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
79d0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
79e0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
79f0: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
7a00: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
7a10: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
7a20: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7a30: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
7a40: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
7a50: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
7a60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
7a70: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69  ring..**.** P5 i
7a80: 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
7a90: 6e 20 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75  n 0 and 4, inclu
7aa0: 73 69 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66  sive, that modif
7ab0: 69 65 73 20 74 68 65 20 50 34 20 73 74 72 69 6e  ies the P4 strin
7ac0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  g..**.**    0:  
7ad0: 28 6e 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20  (no change).**  
7ae0: 20 20 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63    1:  NOT NULL c
7af0: 6f 6e 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  ontraint failed:
7b00: 20 50 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e   P4.**    2:  UN
7b10: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
7b20: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20  failed: P4.**   
7b30: 20 33 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74   3:  CHECK const
7b40: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
7b50: 0a 2a 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49  .**    4:  FOREI
7b60: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
7b70: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a  t failed: P4.**.
7b80: 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20  ** If P5 is not 
7b90: 7a 65 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e  zero and P4 is N
7ba0: 55 4c 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74  ULL, then everyt
7bb0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 22  hing after the "
7bc0: 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64  :" is.** omitted
7bd0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
7be0: 20 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c   an implied "Hal
7bf0: 74 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63  t 0 0 0" instruc
7c00: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74  tion inserted at
7c10: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
7c20: 0a 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61  .** every progra
7c30: 6d 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61  m.  So a jump pa
7c40: 73 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  st the last inst
7c50: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ruction of the p
7c60: 72 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65  rogram.** is the
7c70: 20 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69   same as executi
7c80: 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  ng Halt..*/.case
7c90: 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64   OP_Halt: {.  Vd
7ca0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
7cb0: 0a 20 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70  .  int pcx;..  p
7cc0: 63 78 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  cx = (int)(pOp -
7cd0: 20 61 4f 70 29 3b 0a 23 69 66 64 65 66 20 53 51   aOp);.#ifdef SQ
7ce0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
7cf0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
7d00: 72 74 20 29 7b 20 73 71 6c 69 74 65 33 56 64 62  rt ){ sqlite3Vdb
7d10: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65  eAssertAbortable
7d20: 28 70 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  (p); }.#endif.  
7d30: 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  if( pOp->p1==SQL
7d40: 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 46 72  ITE_OK && p->pFr
7d50: 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 48 61  ame ){.    /* Ha
7d60: 6c 74 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  lt the sub-progr
7d70: 61 6d 2e 20 52 65 74 75 72 6e 20 63 6f 6e 74 72  am. Return contr
7d80: 6f 6c 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ol to the parent
7d90: 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 70   frame. */.    p
7da0: 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d  Frame = p->pFram
7db0: 65 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  e;.    p->pFrame
7dc0: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65   = pFrame->pPare
7dd0: 6e 74 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d  nt;.    p->nFram
7de0: 65 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e--;.    sqlite3
7df0: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
7e00: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
7e10: 20 20 20 20 70 63 78 20 3d 20 73 71 6c 69 74 65      pcx = sqlite
7e20: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
7e30: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 69  e(pFrame);.    i
7e40: 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 49  f( pOp->p2==OE_I
7e50: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 2f  gnore ){.      /
7e60: 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 70 63  * Instruction pc
7e70: 78 20 69 73 20 74 68 65 20 4f 50 5f 50 72 6f 67  x is the OP_Prog
7e80: 72 61 6d 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ram that invoked
7e90: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
7ea0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
7eb0: 6e 74 6c 79 20 62 65 69 6e 67 20 68 61 6c 74 65  ntly being halte
7ec0: 64 2e 20 49 66 20 74 68 65 20 70 32 20 69 6e 73  d. If the p2 ins
7ed0: 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 69 73  truction of this
7ee0: 20 4f 50 5f 48 61 6c 74 0a 20 20 20 20 20 20 2a   OP_Halt.      *
7ef0: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  * instruction is
7f00: 20 73 65 74 20 74 6f 20 4f 45 5f 49 67 6e 6f 72   set to OE_Ignor
7f10: 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 2d  e, then the sub-
7f20: 70 72 6f 67 72 61 6d 20 69 73 20 74 68 72 6f 77  program is throw
7f30: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ing.      ** an 
7f40: 49 47 4e 4f 52 45 20 65 78 63 65 70 74 69 6f 6e  IGNORE exception
7f50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
7f60: 75 6d 70 20 74 6f 20 74 68 65 20 61 64 64 72 65  ump to the addre
7f70: 73 73 20 73 70 65 63 69 66 69 65 64 0a 20 20 20  ss specified.   
7f80: 20 20 20 2a 2a 20 61 73 20 74 68 65 20 70 32 20     ** as the p2 
7f90: 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 4f  of the calling O
7fa0: 50 5f 50 72 6f 67 72 61 6d 2e 20 20 2a 2f 0a 20  P_Program.  */. 
7fb0: 20 20 20 20 20 70 63 78 20 3d 20 70 2d 3e 61 4f       pcx = p->aO
7fc0: 70 5b 70 63 78 5d 2e 70 32 2d 31 3b 0a 20 20 20  p[pcx].p2-1;.   
7fd0: 20 7d 0a 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e   }.    aOp = p->
7fe0: 61 4f 70 3b 0a 20 20 20 20 61 4d 65 6d 20 3d 20  aOp;.    aMem = 
7ff0: 70 2d 3e 61 4d 65 6d 3b 0a 20 20 20 20 70 4f 70  p->aMem;.    pOp
8000: 20 3d 20 26 61 4f 70 5b 70 63 78 5d 3b 0a 20 20   = &aOp[pcx];.  
8010: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70    break;.  }.  p
8020: 2d 3e 72 63 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a  ->rc = pOp->p1;.
8030: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
8040: 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 32 3b 0a   = (u8)pOp->p2;.
8050: 20 20 70 2d 3e 70 63 20 3d 20 70 63 78 3b 0a 20    p->pc = pcx;. 
8060: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
8070: 3c 3d 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  <=4 );.  if( p->
8080: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  rc ){.    if( pO
8090: 70 2d 3e 70 35 20 29 7b 0a 20 20 20 20 20 20 73  p->p5 ){.      s
80a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
80b0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
80c0: 5d 20 3d 20 7b 20 22 4e 4f 54 20 4e 55 4c 4c 22  ] = { "NOT NULL"
80d0: 2c 20 22 55 4e 49 51 55 45 22 2c 20 22 43 48 45  , "UNIQUE", "CHE
80e0: 43 4b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  CK",.           
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 22 20    "FOREIGN KEY" 
8120: 7d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  };.      testcas
8130: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 31 20 29 3b  e( pOp->p5==1 );
8140: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8150: 20 70 4f 70 2d 3e 70 35 3d 3d 32 20 29 3b 0a 20   pOp->p5==2 );. 
8160: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8170: 4f 70 2d 3e 70 35 3d 3d 33 20 29 3b 0a 20 20 20  Op->p5==3 );.   
8180: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70     testcase( pOp
8190: 2d 3e 70 35 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ->p5==4 );.     
81a0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
81b0: 72 28 70 2c 20 22 25 73 20 63 6f 6e 73 74 72 61  r(p, "%s constra
81c0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 20 61 7a 54  int failed", azT
81d0: 79 70 65 5b 70 4f 70 2d 3e 70 35 2d 31 5d 29 3b  ype[pOp->p5-1]);
81e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
81f0: 70 34 2e 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  p4.z ){.        
8200: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
8210: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
8220: 22 25 7a 3a 20 25 73 22 2c 20 70 2d 3e 7a 45 72  "%z: %s", p->zEr
8230: 72 4d 73 67 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  rMsg, pOp->p4.z)
8240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8250: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8260: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
8270: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
8280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8290: 65 33 5f 6c 6f 67 28 70 4f 70 2d 3e 70 31 2c 20  e3_log(pOp->p1, 
82a0: 22 61 62 6f 72 74 20 61 74 20 25 64 20 69 6e 20  "abort at %d in 
82b0: 5b 25 73 5d 3a 20 25 73 22 2c 20 70 63 78 2c 20  [%s]: %s", pcx, 
82c0: 70 2d 3e 7a 53 71 6c 2c 20 70 2d 3e 7a 45 72 72  p->zSql, p->zErr
82d0: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  Msg);.  }.  rc =
82e0: 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
82f0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  (p);.  assert( r
8300: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c  c==SQLITE_BUSY |
8310: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
8320: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  || rc==SQLITE_ER
8330: 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ROR );.  if( rc=
8340: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
8350: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
8360: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
8370: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
8380: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
8390: 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
83a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
83b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
83c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 64  ==SQLITE_OK || d
83d0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
83e0: 3e 30 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72  >0 || db->nDefer
83f0: 72 65 64 49 6d 6d 43 6f 6e 73 3e 30 20 29 3b 0a  redImmCons>0 );.
8400: 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 20 3f      rc = p->rc ?
8410: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20   SQLITE_ERROR : 
8420: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8430: 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74  .  goto vdbe_ret
8440: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  urn;.}../* Opcod
8450: 65 3a 20 49 6e 74 65 67 65 72 20 50 31 20 50 32  e: Integer P1 P2
8460: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
8470: 69 73 3a 20 72 5b 50 32 5d 3d 50 31 0a 2a 2a 0a  is: r[P2]=P1.**.
8480: 2a 2a 20 54 68 65 20 33 32 2d 62 69 74 20 69 6e  ** The 32-bit in
8490: 74 65 67 65 72 20 76 61 6c 75 65 20 50 31 20 69  teger value P1 i
84a0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 72  s written into r
84b0: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
84c0: 61 73 65 20 4f 50 5f 49 6e 74 65 67 65 72 3a 20  ase OP_Integer: 
84d0: 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
84e0: 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75  2 */.  pOut = ou
84f0: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
8500: 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e  pOp);.  pOut->u.
8510: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 62  i = pOp->p1;.  b
8520: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
8530: 64 65 3a 20 49 6e 74 36 34 20 2a 20 50 32 20 2a  de: Int64 * P2 *
8540: 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69   P4 *.** Synopsi
8550: 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a  s: r[P2]=P4.**.*
8560: 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
8570: 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20 69 6e  r to a 64-bit in
8580: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 20  teger value..** 
8590: 57 72 69 74 65 20 74 68 61 74 20 76 61 6c 75 65  Write that value
85a0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
85b0: 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e  2..*/.case OP_In
85c0: 74 36 34 3a 20 7b 20 20 20 20 20 20 20 20 20 20  t64: {          
85d0: 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f   /* out2 */.  pO
85e0: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
85f0: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 61  ase(p, pOp);.  a
8600: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 70  ssert( pOp->p4.p
8610: 49 36 34 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74  I64!=0 );.  pOut
8620: 2d 3e 75 2e 69 20 3d 20 2a 70 4f 70 2d 3e 70 34  ->u.i = *pOp->p4
8630: 2e 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a  .pI64;.  break;.
8640: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8650: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
8660: 50 4f 49 4e 54 0a 2f 2a 20 4f 70 63 6f 64 65 3a  POINT./* Opcode:
8670: 20 52 65 61 6c 20 2a 20 50 32 20 2a 20 50 34 20   Real * P2 * P4 
8680: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
8690: 5b 50 32 5d 3d 50 34 0a 2a 2a 0a 2a 2a 20 50 34  [P2]=P4.**.** P4
86a0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
86b0: 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
86c0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a  ng point value..
86d0: 2a 2a 20 57 72 69 74 65 20 74 68 61 74 20 76 61  ** Write that va
86e0: 6c 75 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65  lue into registe
86f0: 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  r P2..*/.case OP
8700: 5f 52 65 61 6c 3a 20 7b 20 20 20 20 20 20 20 20  _Real: {        
8710: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8720: 4b 5f 46 4c 4f 41 54 2c 20 6f 75 74 32 20 2a 2f  K_FLOAT, out2 */
8730: 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
8740: 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
8750: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
8760: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 61 73  = MEM_Real;.  as
8770: 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73  sert( !sqlite3Is
8780: 4e 61 4e 28 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  NaN(*pOp->p4.pRe
8790: 61 6c 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  al) );.  pOut->u
87a0: 2e 72 20 3d 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  .r = *pOp->p4.pR
87b0: 65 61 6c 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  eal;.  break;.}.
87c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
87d0: 65 3a 20 53 74 72 69 6e 67 38 20 2a 20 50 32 20  e: String8 * P2 
87e0: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
87f0: 69 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 0a 2a  is: r[P2]='P4'.*
8800: 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20 74  *.** P4 points t
8810: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
8820: 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 2e  ed UTF-8 string.
8830: 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
8840: 74 72 61 6e 73 66 6f 72 6d 65 64 20 0a 2a 2a 20  transformed .** 
8850: 69 6e 74 6f 20 61 20 53 74 72 69 6e 67 20 6f 70  into a String op
8860: 63 6f 64 65 20 62 65 66 6f 72 65 20 69 74 20 69  code before it i
8870: 73 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74  s executed for t
8880: 68 65 20 66 69 72 73 74 20 74 69 6d 65 2e 20 20  he first time.  
8890: 44 75 72 69 6e 67 0a 2a 2a 20 74 68 69 73 20 74  During.** this t
88a0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 74  ransformation, t
88b0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 73 74 72  he length of str
88c0: 69 6e 67 20 50 34 20 69 73 20 63 6f 6d 70 75 74  ing P4 is comput
88d0: 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a 2a 2a  ed and stored.**
88e0: 20 61 73 20 74 68 65 20 50 31 20 70 61 72 61 6d   as the P1 param
88f0: 65 74 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  eter..*/.case OP
8900: 5f 53 74 72 69 6e 67 38 3a 20 7b 20 20 20 20 20  _String8: {     
8910: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
8920: 4b 5f 53 54 52 49 4e 47 2c 20 6f 75 74 32 20 2a  K_STRING, out2 *
8930: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
8940: 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20 70 4f  >p4.z!=0 );.  pO
8950: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
8960: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70  ase(p, pOp);.  p
8970: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
8980: 53 74 72 69 6e 67 3b 0a 20 20 70 4f 70 2d 3e 70  String;.  pOp->p
8990: 31 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  1 = sqlite3Strle
89a0: 6e 33 30 28 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  n30(pOp->p4.z);.
89b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89c0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
89d0: 20 65 6e 63 6f 64 69 6e 67 21 3d 53 51 4c 49 54   encoding!=SQLIT
89e0: 45 5f 55 54 46 38 20 29 7b 0a 20 20 20 20 72 63  E_UTF8 ){.    rc
89f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
8a00: 6d 53 65 74 53 74 72 28 70 4f 75 74 2c 20 70 4f  mSetStr(pOut, pO
8a10: 70 2d 3e 70 34 2e 7a 2c 20 2d 31 2c 20 53 51 4c  p->p4.z, -1, SQL
8a20: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
8a30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 61 73  _STATIC);.    as
8a40: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
8a50: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
8a60: 45 5f 54 4f 4f 42 49 47 20 29 3b 0a 20 20 20 20  E_TOOBIG );.    
8a70: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
8a80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8a90: 45 6e 63 6f 64 69 6e 67 28 70 4f 75 74 2c 20 65  Encoding(pOut, e
8aa0: 6e 63 6f 64 69 6e 67 29 20 29 20 67 6f 74 6f 20  ncoding) ) goto 
8ab0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65  no_mem;.    asse
8ac0: 72 74 28 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c  rt( pOut->szMall
8ad0: 6f 63 3e 30 20 26 26 20 70 4f 75 74 2d 3e 7a 4d  oc>0 && pOut->zM
8ae0: 61 6c 6c 6f 63 3d 3d 70 4f 75 74 2d 3e 7a 20 29  alloc==pOut->z )
8af0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 56 64  ;.    assert( Vd
8b00: 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75  beMemDynamic(pOu
8b10: 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75  t)==0 );.    pOu
8b20: 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  t->szMalloc = 0;
8b30: 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  .    pOut->flags
8b40: 20 7c 3d 20 4d 45 4d 5f 53 74 61 74 69 63 3b 0a   |= MEM_Static;.
8b50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
8b60: 79 70 65 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ype==P4_DYNAMIC 
8b70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8b80: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
8b90: 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p4.z);.    }.   
8ba0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
8bb0: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 20 20 70  4_DYNAMIC;.    p
8bc0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 70 4f 75 74 2d  Op->p4.z = pOut-
8bd0: 3e 7a 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20  >z;.    pOp->p1 
8be0: 3d 20 70 4f 75 74 2d 3e 6e 3b 0a 20 20 7d 0a 20  = pOut->n;.  }. 
8bf0: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
8c00: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29 3b 0a  QLITE_TOOBIG );.
8c10: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4f 70  #endif.  if( pOp
8c20: 2d 3e 70 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ->p1>db->aLimit[
8c30: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
8c40: 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f  GTH] ){.    goto
8c50: 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
8c60: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
8c70: 54 45 5f 4f 4b 20 29 3b 0a 20 20 2f 2a 20 46 61  TE_OK );.  /* Fa
8c80: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
8c90: 65 20 6e 65 78 74 20 63 61 73 65 2c 20 4f 50 5f  e next case, OP_
8ca0: 53 74 72 69 6e 67 20 2a 2f 0a 7d 0a 20 20 0a 2f  String */.}.  ./
8cb0: 2a 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67  * Opcode: String
8cc0: 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
8cd0: 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
8ce0: 32 5d 3d 27 50 34 27 20 28 6c 65 6e 3d 50 31 29  2]='P4' (len=P1)
8cf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 72 69 6e  .**.** The strin
8d00: 67 20 76 61 6c 75 65 20 50 34 20 6f 66 20 6c 65  g value P4 of le
8d10: 6e 67 74 68 20 50 31 20 28 62 79 74 65 73 29 20  ngth P1 (bytes) 
8d20: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
8d30: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
8d40: 49 66 20 50 33 20 69 73 20 6e 6f 74 20 7a 65 72  If P3 is not zer
8d50: 6f 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  o and the conten
8d60: 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 33  t of register P3
8d70: 20 69 73 20 65 71 75 61 6c 20 74 6f 20 50 35 2c   is equal to P5,
8d80: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74   then.** the dat
8d90: 61 74 79 70 65 20 6f 66 20 74 68 65 20 72 65 67  atype of the reg
8da0: 69 73 74 65 72 20 50 32 20 69 73 20 63 6f 6e 76  ister P2 is conv
8db0: 65 72 74 65 64 20 74 6f 20 42 4c 4f 42 2e 20 20  erted to BLOB.  
8dc0: 54 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 0a 2a  The content is.*
8dd0: 2a 20 74 68 65 20 73 61 6d 65 20 73 65 71 75 65  * the same seque
8de0: 6e 63 65 20 6f 66 20 62 79 74 65 73 2c 20 69 74  nce of bytes, it
8df0: 20 69 73 20 6d 65 72 65 6c 79 20 69 6e 74 65 72   is merely inter
8e00: 70 72 65 74 65 64 20 61 73 20 61 20 42 4c 4f 42  preted as a BLOB
8e10: 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 61   instead.** of a
8e20: 20 73 74 72 69 6e 67 2c 20 61 73 20 69 66 20 69   string, as if i
8e30: 74 20 68 61 64 20 62 65 65 6e 20 43 41 53 54 2e  t had been CAST.
8e40: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
8e50: 3a 0a 2a 2a 0a 2a 2a 20 69 66 28 20 50 33 21 3d  :.**.** if( P3!=
8e60: 30 20 61 6e 64 20 72 65 67 5b 50 33 5d 3d 3d 50  0 and reg[P3]==P
8e70: 35 20 29 20 72 65 67 5b 50 32 5d 20 3a 3d 20 43  5 ) reg[P2] := C
8e80: 41 53 54 28 72 65 67 5b 50 32 5d 20 61 73 20 42  AST(reg[P2] as B
8e90: 4c 4f 42 29 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  LOB).*/.case OP_
8ea0: 53 74 72 69 6e 67 3a 20 7b 20 20 20 20 20 20 20  String: {       
8eb0: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
8ec0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
8ed0: 7a 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d  z!=0 );.  pOut =
8ee0: 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
8ef0: 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
8f00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
8f10: 7c 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  |MEM_Static|MEM_
8f20: 54 65 72 6d 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20  Term;.  pOut->z 
8f30: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 70  = pOp->p4.z;.  p
8f40: 4f 75 74 2d 3e 6e 20 3d 20 70 4f 70 2d 3e 70 31  Out->n = pOp->p1
8f50: 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63 20 3d 20  ;.  pOut->enc = 
8f60: 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55 50 44 41  encoding;.  UPDA
8f70: 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
8f80: 70 4f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  pOut);.#ifndef S
8f90: 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e  QLITE_LIKE_DOESN
8fa0: 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20  T_MATCH_BLOBS.  
8fb0: 69 66 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 7b  if( pOp->p3>0 ){
8fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
8fd0: 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
8fe0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
8ff0: 3b 0a 20 20 20 20 70 49 6e 33 20 3d 20 26 61 4d  ;.    pIn3 = &aM
9000: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20  em[pOp->p3];.   
9010: 20 61 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66   assert( pIn3->f
9020: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
9030: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e  ;.    if( pIn3->
9040: 75 2e 69 3d 3d 70 4f 70 2d 3e 70 35 20 29 20 70  u.i==pOp->p5 ) p
9050: 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
9060: 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 61 74 69 63  _Blob|MEM_Static
9070: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 7d 0a 23  |MEM_Term;.  }.#
9080: 65 6e 64 69 66 0a 20 20 62 72 65 61 6b 3b 0a 7d  endif.  break;.}
9090: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
90a0: 6c 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  l P1 P2 P3 * *.*
90b0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
90c0: 2e 2e 50 33 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a 2a  ..P3]=NULL.**.**
90d0: 20 57 72 69 74 65 20 61 20 4e 55 4c 4c 20 69 6e   Write a NULL in
90e0: 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 32 2e  to registers P2.
90f0: 20 20 49 66 20 50 33 20 67 72 65 61 74 65 72 20    If P3 greater 
9100: 74 68 61 6e 20 50 32 2c 20 74 68 65 6e 20 61 6c  than P2, then al
9110: 73 6f 20 77 72 69 74 65 0a 2a 2a 20 4e 55 4c 4c  so write.** NULL
9120: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
9130: 33 20 61 6e 64 20 65 76 65 72 79 20 72 65 67 69  3 and every regi
9140: 73 74 65 72 20 69 6e 20 62 65 74 77 65 65 6e 20  ster in between 
9150: 50 32 20 61 6e 64 20 50 33 2e 20 20 49 66 20 50  P2 and P3.  If P
9160: 33 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  3.** is less tha
9170: 6e 20 50 32 20 28 74 79 70 69 63 61 6c 6c 79 20  n P2 (typically 
9180: 50 33 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  P3 is zero) then
9190: 20 6f 6e 6c 79 20 72 65 67 69 73 74 65 72 20 50   only register P
91a0: 32 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 4e  2 is.** set to N
91b0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ULL..**.** If th
91c0: 65 20 50 31 20 76 61 6c 75 65 20 69 73 20 6e 6f  e P1 value is no
91d0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6c 73  n-zero, then als
91e0: 6f 20 73 65 74 20 74 68 65 20 4d 45 4d 5f 43 6c  o set the MEM_Cl
91f0: 65 61 72 65 64 20 66 6c 61 67 20 73 6f 20 74 68  eared flag so th
9200: 61 74 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  at.** NULL value
9210: 73 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6d 70 61  s will not compa
9220: 72 65 20 65 71 75 61 6c 20 65 76 65 6e 20 69 66  re equal even if
9230: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
9240: 73 20 73 65 74 20 6f 6e 0a 2a 2a 20 4f 50 5f 4e  s set on.** OP_N
9250: 65 20 6f 72 20 4f 50 5f 45 71 2e 0a 2a 2f 0a 63  e or OP_Eq..*/.c
9260: 61 73 65 20 4f 50 5f 4e 75 6c 6c 3a 20 7b 20 20  ase OP_Null: {  
9270: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
9280: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 0a 20   */.  int cnt;. 
9290: 20 75 31 36 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20   u16 nullFlag;. 
92a0: 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
92b0: 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
92c0: 20 20 63 6e 74 20 3d 20 70 4f 70 2d 3e 70 33 2d    cnt = pOp->p3-
92d0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
92e0: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
92f0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
9300: 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e  sor) );.  pOut->
9310: 66 6c 61 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67  flags = nullFlag
9320: 20 3d 20 70 4f 70 2d 3e 70 31 20 3f 20 28 4d 45   = pOp->p1 ? (ME
9330: 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 43 6c 65 61 72  M_Null|MEM_Clear
9340: 65 64 29 20 3a 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ed) : MEM_Null;.
9350: 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a 20    pOut->n = 0;. 
9360: 20 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 29 7b   while( cnt>0 ){
9370: 0a 20 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20  .    pOut++;.   
9380: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9390: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
93a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
93b0: 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 20  tNull(pOut);.   
93c0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e   pOut->flags = n
93d0: 75 6c 6c 46 6c 61 67 3b 0a 20 20 20 20 70 4f 75  ullFlag;.    pOu
93e0: 74 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 63 6e  t->n = 0;.    cn
93f0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  t--;.  }.  break
9400: 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
9410: 53 6f 66 74 4e 75 6c 6c 20 50 31 20 2a 20 2a 20  SoftNull P1 * * 
9420: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
9430: 20 72 5b 50 31 5d 3d 4e 55 4c 4c 0a 2a 2a 0a 2a   r[P1]=NULL.**.*
9440: 2a 20 53 65 74 20 72 65 67 69 73 74 65 72 20 50  * Set register P
9450: 31 20 74 6f 20 68 61 76 65 20 74 68 65 20 76 61  1 to have the va
9460: 6c 75 65 20 4e 55 4c 4c 20 61 73 20 73 65 65 6e  lue NULL as seen
9470: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
9480: 65 63 6f 72 64 0a 2a 2a 20 69 6e 73 74 72 75 63  ecord.** instruc
9490: 74 69 6f 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  tion, but do not
94a0: 20 66 72 65 65 20 61 6e 79 20 73 74 72 69 6e 67   free any string
94b0: 20 6f 72 20 62 6c 6f 62 20 6d 65 6d 6f 72 79 20   or blob memory 
94c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
94d0: 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 2c  ** the register,
94e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
94f0: 76 61 6c 75 65 20 77 61 73 20 61 20 73 74 72 69  value was a stri
9500: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 68 61 74 20  ng or blob that 
9510: 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
9520: 79 20 63 6f 70 69 65 64 20 75 73 69 6e 67 20 4f  y copied using O
9530: 50 5f 53 43 6f 70 79 2c 20 74 68 65 20 63 6f 70  P_SCopy, the cop
9540: 69 65 73 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  ies will continu
9550: 65 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 0a 2a  e to be valid..*
9560: 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 66 74 4e 75  /.case OP_SoftNu
9570: 6c 6c 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  ll: {.  assert( 
9580: 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70  pOp->p1>0 && pOp
9590: 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p1<=(p->nMem+1
95a0: 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
95b0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d  ;.  pOut = &aMem
95c0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75  [pOp->p1];.  pOu
95d0: 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 4f 75 74  t->flags = (pOut
95e0: 2d 3e 66 6c 61 67 73 26 7e 28 4d 45 4d 5f 55 6e  ->flags&~(MEM_Un
95f0: 64 65 66 69 6e 65 64 7c 4d 45 4d 5f 41 66 66 4d  defined|MEM_AffM
9600: 61 73 6b 29 29 7c 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ask))|MEM_Null;.
9610: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
9620: 70 63 6f 64 65 3a 20 42 6c 6f 62 20 50 31 20 50  pcode: Blob P1 P
9630: 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f  2 * P4 *.** Syno
9640: 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 20 28  psis: r[P2]=P4 (
9650: 6c 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 50 34  len=P1).**.** P4
9660: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 6c 6f   points to a blo
9670: 62 20 6f 66 20 64 61 74 61 20 50 31 20 62 79 74  b of data P1 byt
9680: 65 73 20 6c 6f 6e 67 2e 20 20 53 74 6f 72 65 20  es long.  Store 
9690: 74 68 69 73 0a 2a 2a 20 62 6c 6f 62 20 69 6e 20  this.** blob in 
96a0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a  register P2..*/.
96b0: 63 61 73 65 20 4f 50 5f 42 6c 6f 62 3a 20 7b 20  case OP_Blob: { 
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96d0: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65  * out2 */.  asse
96e0: 72 74 28 20 70 4f 70 2d 3e 70 31 20 3c 3d 20 53  rt( pOp->p1 <= S
96f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
9700: 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   );.  pOut = out
9710: 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
9720: 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Op);.  sqlite3Vd
9730: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f 75 74  beMemSetStr(pOut
9740: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 70 4f 70  , pOp->p4.z, pOp
9750: 2d 3e 70 31 2c 20 30 2c 20 30 29 3b 0a 20 20 70  ->p1, 0, 0);.  p
9760: 4f 75 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64  Out->enc = encod
9770: 69 6e 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ing;.  UPDATE_MA
9780: 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29  X_BLOBSIZE(pOut)
9790: 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
97a0: 20 4f 70 63 6f 64 65 3a 20 56 61 72 69 61 62 6c   Opcode: Variabl
97b0: 65 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  e P1 P2 * P4 *.*
97c0: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
97d0: 5d 3d 70 61 72 61 6d 65 74 65 72 28 50 31 2c 50  ]=parameter(P1,P
97e0: 34 29 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  4).**.** Transfe
97f0: 72 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  r the values of 
9800: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
9810: 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  P1 into register
9820: 20 50 32 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   P2.**.** If the
9830: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 61   parameter is na
9840: 6d 65 64 2c 20 74 68 65 6e 20 69 74 73 20 6e 61  med, then its na
9850: 6d 65 20 61 70 70 65 61 72 73 20 69 6e 20 50 34  me appears in P4
9860: 2e 0a 2a 2a 20 54 68 65 20 50 34 20 76 61 6c 75  ..** The P4 valu
9870: 65 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  e is used by sql
9880: 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
9890: 74 65 72 5f 6e 61 6d 65 28 29 2e 0a 2a 2f 0a 63  ter_name()..*/.c
98a0: 61 73 65 20 4f 50 5f 56 61 72 69 61 62 6c 65 3a  ase OP_Variable:
98b0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {            /*
98c0: 20 6f 75 74 32 20 2a 2f 0a 20 20 4d 65 6d 20 2a   out2 */.  Mem *
98d0: 70 56 61 72 3b 20 20 20 20 20 20 20 2f 2a 20 56  pVar;       /* V
98e0: 61 6c 75 65 20 62 65 69 6e 67 20 74 72 61 6e 73  alue being trans
98f0: 66 65 72 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73  ferred */..  ass
9900: 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26  ert( pOp->p1>0 &
9910: 26 20 70 4f 70 2d 3e 70 31 3c 3d 70 2d 3e 6e 56  & pOp->p1<=p->nV
9920: 61 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ar );.  assert( 
9930: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 30 20 7c 7c 20  pOp->p4.z==0 || 
9940: 70 4f 70 2d 3e 70 34 2e 7a 3d 3d 73 71 6c 69 74  pOp->p4.z==sqlit
9950: 65 33 56 4c 69 73 74 4e 75 6d 54 6f 4e 61 6d 65  e3VListNumToName
9960: 28 70 2d 3e 70 56 4c 69 73 74 2c 70 4f 70 2d 3e  (p->pVList,pOp->
9970: 70 31 29 20 29 3b 0a 20 20 70 56 61 72 20 3d 20  p1) );.  pVar = 
9980: 26 70 2d 3e 61 56 61 72 5b 70 4f 70 2d 3e 70 31  &p->aVar[pOp->p1
9990: 20 2d 20 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c   - 1];.  if( sql
99a0: 69 74 65 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69  ite3VdbeMemTooBi
99b0: 67 28 70 56 61 72 29 20 29 7b 0a 20 20 20 20 67  g(pVar) ){.    g
99c0: 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d  oto too_big;.  }
99d0: 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
99e0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69  pOp->p2];.  sqli
99f0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
9a00: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
9a10: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
9a20: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
9a30: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
9a40: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9a50: 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33  e: Move P1 P2 P3
9a60: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9a70: 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40  : r[P2@P3]=r[P1@
9a80: 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  P3].**.** Move t
9a90: 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 6e 20  he P3 values in 
9aa0: 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b  register P1..P1+
9ab0: 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a  P3-1 over into.*
9ac0: 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  * registers P2..
9ad0: 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74  P2+P3-1.  Regist
9ae0: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  ers P1..P1+P3-1 
9af0: 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64  are.** left hold
9b00: 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  ing a NULL.  It 
9b10: 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
9b20: 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a  register ranges.
9b30: 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61  ** P1..P1+P3-1 a
9b40: 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74  nd P2..P2+P3-1 t
9b50: 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 20 69  o overlap.  It i
9b60: 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f  s an error.** fo
9b70: 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 73 20  r P3 to be less 
9b80: 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20  than 1..*/.case 
9b90: 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74  OP_Move: {.  int
9ba0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n;           /*
9bb0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
9bc0: 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f 70  ters left to cop
9bd0: 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20  y */.  int p1;  
9be0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
9bf0: 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d  ter to copy from
9c00: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
9c10: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9c20: 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f  er to copy to */
9c30: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ..  n = pOp->p3;
9c40: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
9c50: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26  .  assert( n>0 &
9c70: 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29  & p1>0 && p2>0 )
9c80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e  ;.  assert( p1+n
9c90: 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31  <=p2 || p2+n<=p1
9ca0: 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   );..  pIn1 = &a
9cb0: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
9cc0: 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64  = &aMem[p2];.  d
9cd0: 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
9ce0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e  Out<=&aMem[(p->n
9cf0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9d00: 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  or)] );.    asse
9d10: 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b  rt( pIn1<=&aMem[
9d20: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9d30: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9d40: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
9d50: 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
9d60: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9d70: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
9d80: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
9d90: 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a  ve(pOut, pIn1);.
9da0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9db0: 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f 75 74  BUG.    if( pOut
9dc0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61  ->pScopyFrom>=&a
9dd0: 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d  Mem[p1] && pOut-
9de0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74  >pScopyFrom<pOut
9df0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
9e00: 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f  pScopyFrom += pO
9e10: 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20 20  p->p2 - p1;.    
9e20: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 65 65  }.#endif.    Dee
9e30: 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
9e40: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
9e50: 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74  TRACE(p2++, pOut
9e60: 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
9e70: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68     pOut++;.  }wh
9e80: 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72  ile( --n );.  br
9e90: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9ea0: 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33  e: Copy P1 P2 P3
9eb0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9ec0: 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50  : r[P2@P3+1]=r[P
9ed0: 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61  1@P3+1].**.** Ma
9ee0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67  ke a copy of reg
9ef0: 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33  isters P1..P1+P3
9f00: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
9f10: 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a  P2..P2+P3..**.**
9f20: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
9f30: 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63  n makes a deep c
9f40: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
9f50: 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a  .  A duplicate.*
9f60: 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79  * is made of any
9f70: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9f80: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61  constant.  See a
9f90: 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  lso OP_SCopy..*/
9fa0: 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b  .case OP_Copy: {
9fb0: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
9fc0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31   pOp->p3;.  pIn1
9fd0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
9fe0: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
9ff0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
a000: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
a010: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
a020: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a030: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
a040: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
a050: 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65 65 70  Ephem);.    Deep
a060: 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
a070: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
a080: 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e  DEBUG.    pOut->
a090: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
a0a0: 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47 49 53  #endif.    REGIS
a0b0: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
a0c0: 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75  2+pOp->p3-n, pOu
a0d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d  t);.    if( (n--
a0e0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
a0f0: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49    pOut++;.    pI
a100: 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
a110: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a120: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
a130: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
a140: 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]=r[P1].**.*
a150: 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  * Make a shallow
a160: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
a170: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a180: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a190: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
a1a0: 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  kes a shallow co
a1b0: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
a1c0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
a1d0: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72  * is a string or
a1e0: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65 20   blob, then the 
a1f0: 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20 70  copy is only a p
a200: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
a210: 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68 65   original and he
a220: 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  nce if the origi
a230: 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20 77  nal changes so w
a240: 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a  ill the copy..**
a250: 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20 6f   Worse, if the o
a260: 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c  riginal is deall
a270: 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70 79  ocated, the copy
a280: 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64   becomes invalid
a290: 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70 72  ..** Thus the pr
a2a0: 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72 61  ogram must guara
a2b0: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f 72  ntee that the or
a2c0: 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  iginal will not 
a2d0: 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67  change.** during
a2e0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
a2f0: 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65 20   the copy.  Use 
a300: 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20  OP_Copy to make 
a310: 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f  a complete.** co
a320: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  py..*/.case OP_S
a330: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
a340: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a350: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
a360: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
a370: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a380: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
a390: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
a3a0: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
a3b0: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
a3c0: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64  MEM_Ephem);.#ifd
a3d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a3e0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f    if( pOut->pSco
a3f0: 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74  pyFrom==0 ) pOut
a400: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70  ->pScopyFrom = p
a410: 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72  In1;.#endif.  br
a420: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a430: 65 3a 20 49 6e 74 43 6f 70 79 20 50 31 20 50 32  e: IntCopy P1 P2
a440: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
a450: 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a  is: r[P2]=r[P1].
a460: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
a470: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
a480: 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65   held in registe
a490: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a4a0: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a4b0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
a4c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f  d version of SCo
a4d0: 70 79 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e  py that works on
a4e0: 6c 79 20 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ly for integer.*
a4f0: 2a 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73  * values..*/.cas
a500: 65 20 4f 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20  e OP_IntCopy: { 
a510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a520: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
a530: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a540: 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e   assert( (pIn1->
a550: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
a560: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  !=0 );.  pOut = 
a570: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a590: 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 70  SetInt64(pOut, p
a5a0: 49 6e 31 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In1->u.i);.  bre
a5b0: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
a5c0: 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50  : ResultRow P1 P
a5d0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
a5e0: 73 69 73 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31  sis: output=r[P1
a5f0: 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  @P2].**.** The r
a600: 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72 6f  egisters P1 thro
a610: 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74  ugh P1+P2-1 cont
a620: 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ain a single row
a630: 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20   of.** results. 
a640: 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75 73  This opcode caus
a650: 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  es the sqlite3_s
a660: 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74 65  tep() call to te
a670: 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20  rminate.** with 
a680: 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72 65  an SQLITE_ROW re
a690: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69 74  turn code and it
a6a0: 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71 6c   sets up the sql
a6b0: 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72  ite3_stmt.** str
a6c0: 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69 64  ucture to provid
a6d0: 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  e access to the 
a6e0: 72 28 50 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31  r(P1)..r(P1+P2-1
a6f0: 29 20 76 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74  ) values as.** t
a700: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a  he result row..*
a710: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74  /.case OP_Result
a720: 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  Row: {.  Mem *pM
a730: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
a740: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f  ssert( p->nResCo
a750: 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b  lumn==pOp->p2 );
a760: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a770: 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p1>0 );.  assert
a780: 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  ( pOp->p1+pOp->p
a790: 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  2<=(p->nMem+1 - 
a7a0: 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
a7b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a7c0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
a7d0: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 52 75 6e  ALLBACK.  /* Run
a7e0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 6f   the progress co
a7f0: 75 6e 74 65 72 20 6a 75 73 74 20 62 65 66 6f 72  unter just befor
a800: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
a810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  /.  if( db->xPro
a820: 67 72 65 73 73 21 3d 30 0a 20 20 20 26 26 20 6e  gress!=0.   && n
a830: 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73  VmStep>=nProgres
a840: 73 4c 69 6d 69 74 20 0a 20 20 20 26 26 20 64 62  sLimit .   && db
a850: 2d 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e  ->xProgress(db->
a860: 70 50 72 6f 67 72 65 73 73 41 72 67 29 21 3d 30  pProgressArg)!=0
a870: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  .  ){.    rc = S
a880: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
a890: 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f  .    goto abort_
a8a0: 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
a8b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
a8c0: 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
a8d0: 20 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d   has violated im
a8e0: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
a8f0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  key constraints,
a900: 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74   do.  ** not ret
a910: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
a920: 66 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e  f rows modified.
a930: 20 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45   And do not RELE
a940: 41 53 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ASE the statemen
a950: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
a960: 6f 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  on. It needs to 
a970: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
a980: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
a990: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
a9a0: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
a9b0: 20 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65   0)) ){.    asse
a9c0: 72 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  rt( db->flags&SQ
a9d0: 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29  LITE_CountRows )
a9e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
a9f0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
aa00: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f   );.    goto abo
aa10: 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
aa20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
aa30: 65 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  e SQLITE_CountRo
aa40: 77 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  ws flag is set i
aa50: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
aa60: 6d 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a  mask, then .  **
aa70: 20 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   DML statements 
aa80: 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
aa90: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  de to return the
aaa0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
aab0: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
aac0: 6f 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73  o the user. This
aad0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
aae0: 20 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a   that a VM that.
aaf0: 20 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61    ** opens a sta
ab00: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ab10: 6f 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68  on may invoke th
ab20: 69 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a  is opcode..  **.
ab30: 20 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69    ** In case thi
ab40: 73 20 69 73 20 73 75 63 68 20 61 20 73 74 61 74  s is such a stat
ab50: 65 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79  ement, close any
ab60: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
ab70: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e  action.  ** open
ab80: 65 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 65  ed by this VM be
ab90: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63  fore returning c
aba0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73  ontrol to the us
abb0: 65 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20  er. This is to. 
abc0: 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
abd0: 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
abe0: 63 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79  ctions are alway
abf0: 73 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76  s nested, not ov
ac00: 65 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20  erlapping..  ** 
ac10: 49 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74  If the open stat
ac20: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
ac30: 6e 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20  n is not closed 
ac40: 68 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75  here, then the u
ac50: 73 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65  ser.  ** may ste
ac60: 70 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61  p another VM tha
ac70: 74 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20  t opens its own 
ac80: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
ac90: 63 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a  ction. This.  **
aca0: 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65   may lead to ove
acb0: 72 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65  rlapping stateme
acc0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  nt transactions.
acd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
ace0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
acf0: 74 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20  tion is never a 
ad00: 74 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61  top-level transa
ad10: 63 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20  ction.  Hence.  
ad20: 2a 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 63  ** the RELEASE c
ad30: 61 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65  all below can ne
ad40: 76 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20  ver fail..  */. 
ad50: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
ad60: 74 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d  tement==0 || db-
ad70: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f  >flags&SQLITE_Co
ad80: 75 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20  untRows );.  rc 
ad90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
ada0: 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53  seStatement(p, S
adb0: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
adc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
add0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
ade0: 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61   /* Invalidate a
adf0: 6c 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72  ll ephemeral cur
ae00: 73 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a  sor row caches *
ae10: 2f 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  /.  p->cacheCtr 
ae20: 3d 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b  = (p->cacheCtr +
ae30: 20 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b   2)|1;..  /* Mak
ae40: 65 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c  e sure the resul
ae50: 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ts of the curren
ae60: 74 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74  t row are \000 t
ae70: 65 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61  erminated.  ** a
ae80: 6e 64 20 68 61 76 65 20 61 6e 20 61 73 73 69 67  nd have an assig
ae90: 6e 65 64 20 74 79 70 65 2e 20 20 54 68 65 20 72  ned type.  The r
aea0: 65 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70  esults are de-ep
aeb0: 68 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20  hemeralized as. 
aec0: 20 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65 63   ** a side effec
aed0: 74 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d  t..  */.  pMem =
aee0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
aef0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
af00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
af10: 70 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  p->p2; i++){.   
af20: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
af30: 6c 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b  lid(&pMem[i]) );
af40: 0a 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c  .    Deephemeral
af50: 69 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20  ize(&pMem[i]);. 
af60: 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d     assert( (pMem
af70: 5b 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [i].flags & MEM_
af80: 45 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20  Ephem)==0.      
af90: 20 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69        || (pMem[i
afa0: 5d 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53  ].flags & (MEM_S
afb0: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  tr|MEM_Blob))==0
afc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
afd0: 64 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61  dbeMemNulTermina
afe0: 74 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  te(&pMem[i]);.  
aff0: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
b000: 28 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65  (pOp->p1+i, &pMe
b010: 6d 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  m[i]);.  }.  if(
b020: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b030: 64 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  d ) goto no_mem;
b040: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61  ..  if( db->mTra
b050: 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43  ce & SQLITE_TRAC
b060: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d  E_ROW ){.    db-
b070: 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54  >xTrace(SQLITE_T
b080: 52 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54  RACE_ROW, db->pT
b090: 72 61 63 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a  raceArg, p, 0);.
b0a0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
b0b0: 20 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f   SQLITE_ROW.  */
b0c0: 0a 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29  .  p->pc = (int)
b0d0: 28 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b  (pOp - aOp) + 1;
b0e0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52  .  rc = SQLITE_R
b0f0: 4f 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f  OW;.  goto vdbe_
b100: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70  return;.}../* Op
b110: 63 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20  code: Concat P1 
b120: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
b130: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
b140: 32 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41  2]+r[P1].**.** A
b150: 64 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72  dd the text in r
b160: 65 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20  egister P1 onto 
b170: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
b180: 65 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74  ext in.** regist
b190: 65 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20  er P2 and store 
b1a0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b1b0: 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66  gister P3..** If
b1c0: 20 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f   either the P1 o
b1d0: 72 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55  r P2 text are NU
b1e0: 4c 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55  LL then store NU
b1f0: 4c 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  LL in P3..**.** 
b200: 20 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a    P3 = P2 || P1.
b210: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  **.** It is ille
b220: 67 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50  gal for P1 and P
b230: 33 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  3 to be the same
b240: 20 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74   register. Somet
b250: 69 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69  imes,.** if P3 i
b260: 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73  s the same regis
b270: 74 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69  ter as P2, the i
b280: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
b290: 20 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69   able.** to avoi
b2a0: 64 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f  d a memcpy()..*/
b2b0: 0a 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a  .case OP_Concat:
b2c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
b2d0: 73 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41  same as TK_CONCA
b2e0: 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  T, in1, in2, out
b2f0: 33 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65  3 */.  i64 nByte
b300: 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  ;..  pIn1 = &aMe
b310: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49  m[pOp->p1];.  pI
b320: 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
b330: 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61  p2];.  pOut = &a
b340: 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20  Mem[pOp->p3];.  
b350: 61 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f  assert( pIn1!=pO
b360: 75 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  ut );.  if( (pIn
b370: 31 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d  1->flags | pIn2-
b380: 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75  >flags) & MEM_Nu
b390: 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ll ){.    sqlite
b3a0: 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
b3b0: 70 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b  pOut);.    break
b3c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61  ;.  }.  if( Expa
b3d0: 6e 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20  ndBlob(pIn1) || 
b3e0: 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29  ExpandBlob(pIn2)
b3f0: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
b400: 20 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31    Stringify(pIn1
b410: 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53  , encoding);.  S
b420: 74 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65  tringify(pIn2, e
b430: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74  ncoding);.  nByt
b440: 65 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49  e = pIn1->n + pI
b450: 6e 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79  n2->n;.  if( nBy
b460: 74 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  te>db->aLimit[SQ
b470: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
b480: 48 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  H] ){.    goto t
b490: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66  oo_big;.  }.  if
b4a0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
b4b0: 47 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29  Grow(pOut, (int)
b4c0: 6e 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70  nByte+2, pOut==p
b4d0: 49 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  In2) ){.    goto
b4e0: 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d   no_mem;.  }.  M
b4f0: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f  emSetTypeFlag(pO
b500: 75 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20  ut, MEM_Str);.  
b510: 69 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29  if( pOut!=pIn2 )
b520: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75  {.    memcpy(pOu
b530: 74 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70  t->z, pIn2->z, p
b540: 49 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d  In2->n);.  }.  m
b550: 65 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70  emcpy(&pOut->z[p
b560: 49 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a  In2->n], pIn1->z
b570: 2c 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f  , pIn1->n);.  pO
b580: 75 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a  ut->z[nByte]=0;.
b590: 20 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b    pOut->z[nByte+
b5a0: 31 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e  1] = 0;.  pOut->
b5b0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72  flags |= MEM_Ter
b5c0: 6d 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28  m;.  pOut->n = (
b5d0: 69 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75  int)nByte;.  pOu
b5e0: 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e  t->enc = encodin
b5f0: 67 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  g;.  UPDATE_MAX_
b600: 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a  BLOBSIZE(pOut);.
b610: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
b620: 70 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32  pcode: Add P1 P2
b630: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
b640: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d  sis: r[P3]=r[P1]
b650: 2b 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64  +r[P2].**.** Add
b660: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b670: 67 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65  gister P1 to the
b680: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b690: 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f  er P2.** and sto
b6a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
b6b0: 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a   register P3..**
b6c0: 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74   If either input
b6d0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65   is NULL, the re
b6e0: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f  sult is NULL..*/
b6f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74  ./* Opcode: Mult
b700: 69 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20  iply P1 P2 P3 * 
b710: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
b720: 5b 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d  [P3]=r[P1]*r[P2]
b730: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70  .**.**.** Multip
b740: 6c 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ly the value in 
b750: 72 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74  register P1 by t
b760: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b770: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b780: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b790: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b7a0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b7b0: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b7c0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b7d0: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75  */./* Opcode: Su
b7e0: 62 74 72 61 63 74 20 50 31 20 50 32 20 50 33 20  btract P1 P2 P3 
b7f0: 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
b800: 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50   r[P3]=r[P2]-r[P
b810: 31 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63  1].**.** Subtrac
b820: 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
b830: 65 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20  egister P1 from 
b840: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b850: 69 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20  ister P2.** and 
b860: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
b870: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e   in register P3.
b880: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e  .** If either in
b890: 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  put is NULL, the
b8a0: 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e   result is NULL.
b8b0: 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .*/./* Opcode: D
b8c0: 69 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a  ivide P1 P2 P3 *
b8d0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
b8e0: 72 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31  r[P3]=r[P2]/r[P1
b8f0: 5d 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74  ].**.** Divide t
b900: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b910: 73 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76  ster P1 by the v
b920: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
b930: 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65   P2.** and store
b940: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
b950: 65 67 69 73 74 65 72 20 50 33 20 28 50 33 3d 50  egister P3 (P3=P
b960: 32 2f 50 31 29 2e 20 49 66 20 74 68 65 20 76 61  2/P1). If the va
b970: 6c 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73  lue in .** regis
b980: 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20  ter P1 is zero, 
b990: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
b9a0: 69 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68  is NULL. If eith
b9b0: 65 72 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20  er input is .** 
b9c0: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
b9d0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20   is NULL..*/./* 
b9e0: 4f 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65  Opcode: Remainde
b9f0: 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  r P1 P2 P3 * *.*
ba00: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33  * Synopsis: r[P3
ba10: 5d 3d 72 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a  ]=r[P2]%r[P1].**
ba20: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
ba30: 72 65 6d 61 69 6e 64 65 72 20 61 66 74 65 72 20  remainder after 
ba40: 69 6e 74 65 67 65 72 20 72 65 67 69 73 74 65 72  integer register
ba50: 20 50 32 20 69 73 20 64 69 76 69 64 65 64 20 62   P2 is divided b
ba60: 79 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50  y .** register P
ba70: 31 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  1 and store the 
ba80: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
ba90: 65 72 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68  er P3. .** If th
baa0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
bab0: 74 65 72 20 50 31 20 69 73 20 7a 65 72 6f 20 74  ter P1 is zero t
bac0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
bad0: 4c 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  L..** If either 
bae0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c  operand is NULL,
baf0: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e   the result is N
bb00: 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
bb10: 41 64 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  Add:            
bb20: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
bb30: 73 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20  s TK_PLUS, in1, 
bb40: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
bb50: 65 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20  e OP_Subtract:  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
bb70: 61 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c  ame as TK_MINUS,
bb80: 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20   in1, in2, out3 
bb90: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69  */.case OP_Multi
bba0: 70 6c 79 3a 20 20 20 20 20 20 20 20 20 20 20 20  ply:            
bbb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
bbc0: 53 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  STAR, in1, in2, 
bbd0: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
bbe0: 44 69 76 69 64 65 3a 20 20 20 20 20 20 20 20 20  Divide:         
bbf0: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
bc00: 73 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c  s TK_SLASH, in1,
bc10: 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
bc20: 73 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a  se OP_Remainder:
bc30: 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
bc40: 73 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20  same as TK_REM, 
bc50: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
bc60: 2f 0a 20 20 63 68 61 72 20 62 49 6e 74 69 6e 74  /.  char bIntint
bc70: 3b 20 20 20 2f 2a 20 53 74 61 72 74 65 64 20 6f  ;   /* Started o
bc80: 75 74 20 61 73 20 74 77 6f 20 69 6e 74 65 67 65  ut as two intege
bc90: 72 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20  r operands */.  
bca0: 75 31 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20  u16 flags;      
bcb0: 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f  /* Combined MEM_
bcc0: 2a 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74  * flags from bot
bcd0: 68 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31  h inputs */.  u1
bce0: 36 20 74 79 70 65 31 3b 20 20 20 20 20 20 2f 2a  6 type1;      /*
bcf0: 20 4e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   Numeric type of
bd00: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   left operand */
bd10: 0a 20 20 75 31 36 20 74 79 70 65 32 3b 20 20 20  .  u16 type2;   
bd20: 20 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79     /* Numeric ty
bd30: 70 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72  pe of right oper
bd40: 61 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b  and */.  i64 iA;
bd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
bd60: 67 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66  ger value of lef
bd70: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  t operand */.  i
bd80: 36 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f  64 iB;         /
bd90: 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * Integer value 
bda0: 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  of right operand
bdb0: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b   */.  double rA;
bdc0: 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61        /* Real va
bdd0: 6c 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72  lue of left oper
bde0: 61 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  and */.  double 
bdf0: 72 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c  rB;      /* Real
be00: 20 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20   value of right 
be10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49  operand */..  pI
be20: 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
be30: 70 31 5d 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e  p1];.  type1 = n
be40: 75 6d 65 72 69 63 54 79 70 65 28 70 49 6e 31 29  umericType(pIn1)
be50: 3b 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d  ;.  pIn2 = &aMem
be60: 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70  [pOp->p2];.  typ
be70: 65 32 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65  e2 = numericType
be80: 28 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d  (pIn2);.  pOut =
be90: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
bea0: 0a 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d  .  flags = pIn1-
beb0: 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66  >flags | pIn2->f
bec0: 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 74 79 70  lags;.  if( (typ
bed0: 65 31 20 26 20 74 79 70 65 32 20 26 20 4d 45 4d  e1 & type2 & MEM
bee0: 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
bef0: 69 41 20 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a  iA = pIn1->u.i;.
bf00: 20 20 20 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75      iB = pIn2->u
bf10: 2e 69 3b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20  .i;.    bIntint 
bf20: 3d 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28  = 1;.    switch(
bf30: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
bf40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64        case OP_Ad
bf50: 64 3a 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  d:       if( sql
bf60: 69 74 65 33 41 64 64 49 6e 74 36 34 28 26 69 42  ite3AddInt64(&iB
bf70: 2c 69 41 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d  ,iA) ) goto fp_m
bf80: 61 74 68 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ath;  break;.   
bf90: 20 20 20 63 61 73 65 20 4f 50 5f 53 75 62 74 72     case OP_Subtr
bfa0: 61 63 74 3a 20 20 69 66 28 20 73 71 6c 69 74 65  act:  if( sqlite
bfb0: 33 53 75 62 49 6e 74 36 34 28 26 69 42 2c 69 41  3SubInt64(&iB,iA
bfc0: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  ) ) goto fp_math
bfd0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bfe0: 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  case OP_Multiply
bff0: 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 75  :  if( sqlite3Mu
c000: 6c 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29  lInt64(&iB,iA) )
c010: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20   goto fp_math;  
c020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c030: 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20  e OP_Divide: {. 
c040: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
c050: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
c060: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c070: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
c080: 41 3d 3d 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41  A==-1 && iB==SMA
c090: 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 67 6f  LLEST_INT64 ) go
c0a0: 74 6f 20 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20  to fp_math;.    
c0b0: 20 20 20 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20      iB /= iA;.  
c0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0d0: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
c0e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  lt: {.        if
c0f0: 28 20 69 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61  ( iA==0 ) goto a
c100: 72 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74  rithmetic_result
c110: 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  _is_null;.      
c120: 20 20 69 66 28 20 69 41 3d 3d 2d 31 20 29 20 69    if( iA==-1 ) i
c130: 41 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  A = 1;.        i
c140: 42 20 25 3d 20 69 41 3b 0a 20 20 20 20 20 20 20  B %= iA;.       
c150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c160: 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e      }.    pOut->
c170: 75 2e 69 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65  u.i = iB;.    Me
c180: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
c190: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d  t, MEM_Int);.  }
c1a0: 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
c1b0: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29  & MEM_Null)!=0 )
c1c0: 7b 0a 20 20 20 20 67 6f 74 6f 20 61 72 69 74 68  {.    goto arith
c1d0: 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f  metic_result_is_
c1e0: 6e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  null;.  }else{. 
c1f0: 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 30 3b 0a     bIntint = 0;.
c200: 66 70 5f 6d 61 74 68 3a 0a 20 20 20 20 72 41 20  fp_math:.    rA 
c210: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 61  = sqlite3VdbeRea
c220: 6c 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  lValue(pIn1);.  
c230: 20 20 72 42 20 3d 20 73 71 6c 69 74 65 33 56 64    rB = sqlite3Vd
c240: 62 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 32  beRealValue(pIn2
c250: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  );.    switch( p
c260: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
c270: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a      case OP_Add:
c280: 20 20 20 20 20 20 20 20 20 72 42 20 2b 3d 20 72           rB += r
c290: 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  A;       break;.
c2a0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 75        case OP_Su
c2b0: 62 74 72 61 63 74 3a 20 20 20 20 72 42 20 2d 3d  btract:    rB -=
c2c0: 20 72 41 3b 20 20 20 20 20 20 20 62 72 65 61 6b   rA;       break
c2d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  ;.      case OP_
c2e0: 4d 75 6c 74 69 70 6c 79 3a 20 20 20 20 72 42 20  Multiply:    rB 
c2f0: 2a 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  *= rA;       bre
c300: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c310: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
c320: 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c 65 29 30      /* (double)0
c330: 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51 4c 49   In case of SQLI
c340: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
c350: 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 20  _POINT... */.   
c360: 20 20 20 20 20 69 66 28 20 72 41 3d 3d 28 64 6f       if( rA==(do
c370: 75 62 6c 65 29 30 20 29 20 67 6f 74 6f 20 61 72  uble)0 ) goto ar
c380: 69 74 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f  ithmetic_result_
c390: 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  is_null;.       
c3a0: 20 72 42 20 2f 3d 20 72 41 3b 0a 20 20 20 20 20   rB /= rA;.     
c3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c3c0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
c3d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 41 20 3d 20   {.        iA = 
c3e0: 28 69 36 34 29 72 41 3b 0a 20 20 20 20 20 20 20  (i64)rA;.       
c3f0: 20 69 42 20 3d 20 28 69 36 34 29 72 42 3b 0a 20   iB = (i64)rB;. 
c400: 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d 30         if( iA==0
c410: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
c420: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
c430: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  l;.        if( i
c440: 41 3d 3d 2d 31 20 29 20 69 41 20 3d 20 31 3b 0a  A==-1 ) iA = 1;.
c450: 20 20 20 20 20 20 20 20 72 42 20 3d 20 28 64 6f          rB = (do
c460: 75 62 6c 65 29 28 69 42 20 25 20 69 41 29 3b 0a  uble)(iB % iA);.
c470: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
c490: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c4a0: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
c4b0: 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72     pOut->u.i = r
c4c0: 42 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  B;.    MemSetTyp
c4d0: 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
c4e0: 49 6e 74 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Int);.#else.    
c4f0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  if( sqlite3IsNaN
c500: 28 72 42 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  (rB) ){.      go
c510: 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65  to arithmetic_re
c520: 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20  sult_is_null;.  
c530: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e    }.    pOut->u.
c540: 72 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53  r = rB;.    MemS
c550: 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c  etTypeFlag(pOut,
c560: 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a 20 20 20 20   MEM_Real);.    
c570: 69 66 28 20 28 28 74 79 70 65 31 7c 74 79 70 65  if( ((type1|type
c580: 32 29 26 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20  2)&MEM_Real)==0 
c590: 26 26 20 21 62 49 6e 74 69 6e 74 20 29 7b 0a 20  && !bIntint ){. 
c5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5b0: 49 6e 74 65 67 65 72 41 66 66 69 6e 69 74 79 28  IntegerAffinity(
c5c0: 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pOut);.    }.#en
c5d0: 64 69 66 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  dif.  }.  break;
c5e0: 0a 0a 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  ..arithmetic_res
c5f0: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a 0a 20 20 73  ult_is_null:.  s
c600: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c610: 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 62 72  Null(pOut);.  br
c620: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
c630: 65 3a 20 43 6f 6c 6c 53 65 71 20 50 31 20 2a 20  e: CollSeq P1 * 
c640: 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73  * P4.**.** P4 is
c650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
c660: 43 6f 6c 6c 53 65 71 20 6f 62 6a 65 63 74 2e 20  CollSeq object. 
c670: 49 66 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  If the next call
c680: 20 74 6f 20 61 20 75 73 65 72 20 66 75 6e 63 74   to a user funct
c690: 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67 67 72 65 67  ion.** or aggreg
c6a0: 61 74 65 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ate calls sqlite
c6b0: 33 47 65 74 46 75 6e 63 43 6f 6c 6c 53 65 71 28  3GetFuncCollSeq(
c6c0: 29 2c 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f  ), this collatio
c6d0: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 0a  n sequence will.
c6e0: 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ** be returned. 
c6f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
c700: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
c710: 28 29 2c 20 6d 61 78 28 29 20 61 6e 64 20 6e 75  (), max() and nu
c720: 6c 6c 69 66 28 29 0a 2a 2a 20 66 75 6e 63 74 69  llif().** functi
c730: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 31  ons..**.** If P1
c740: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
c750: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
c760: 74 65 72 20 74 68 61 74 20 61 20 73 75 62 73 65  ter that a subse
c770: 71 75 65 6e 74 20 6d 69 6e 28 29 20 6f 72 0a 2a  quent min() or.*
c780: 2a 20 6d 61 78 28 29 20 61 67 67 72 65 67 61 74  * max() aggregat
c790: 65 20 77 69 6c 6c 20 73 65 74 20 74 6f 20 31 20  e will set to 1 
c7a0: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  if the current r
c7b0: 6f 77 20 69 73 20 6e 6f 74 20 74 68 65 20 6d 69  ow is not the mi
c7c0: 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20 6d 61 78 69  nimum or.** maxi
c7d0: 6d 75 6d 2e 20 20 54 68 65 20 50 31 20 72 65 67  mum.  The P1 reg
c7e0: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
c7f0: 69 7a 65 64 20 74 6f 20 30 20 62 79 20 74 68 69  ized to 0 by thi
c800: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  s instruction..*
c810: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
c820: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ce used by the i
c830: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
c840: 20 74 68 65 20 61 66 6f 72 65 6d 65 6e 74 69 6f   the aforementio
c850: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ned functions.**
c860: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
c870: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c880: 6e 63 65 20 73 65 74 20 62 79 20 74 68 69 73 20  nce set by this 
c890: 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20 61 76  opcode is not av
c8a0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 70 75 62 6c 69  ailable.** publi
c8b0: 63 6c 79 2e 20 20 4f 6e 6c 79 20 62 75 69 6c 74  cly.  Only built
c8c0: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  -in functions ha
c8d0: 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 69  ve access to thi
c8e0: 73 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61  s feature..*/.ca
c8f0: 73 65 20 4f 50 5f 43 6f 6c 6c 53 65 71 3a 20 7b  se OP_CollSeq: {
c900: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
c910: 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c 53  p4type==P4_COLLS
c920: 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  EQ );.  if( pOp-
c930: 3e 70 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >p1 ){.    sqlit
c940: 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
c950: 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  4(&aMem[pOp->p1]
c960: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  , 0);.  }.  brea
c970: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
c980: 20 42 69 74 41 6e 64 20 50 31 20 50 32 20 50 33   BitAnd P1 P2 P3
c990: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
c9a0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b  : r[P3]=r[P1]&r[
c9b0: 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74  P2].**.** Take t
c9c0: 68 65 20 62 69 74 2d 77 69 73 65 20 41 4e 44 20  he bit-wise AND 
c9d0: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
c9e0: 20 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64   register P1 and
c9f0: 20 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65   P2 and.** store
ca00: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72   the result in r
ca10: 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49  egister P3..** I
ca20: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
ca30: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75  s NULL, the resu
ca40: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f  lt is NULL..*/./
ca50: 2a 20 4f 70 63 6f 64 65 3a 20 42 69 74 4f 72 20  * Opcode: BitOr 
ca60: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
ca70: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
ca80: 72 5b 50 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a  r[P1]|r[P2].**.*
ca90: 2a 20 54 61 6b 65 20 74 68 65 20 62 69 74 2d 77  * Take the bit-w
caa0: 69 73 65 20 4f 52 20 6f 66 20 74 68 65 20 76 61  ise OR of the va
cab0: 6c 75 65 73 20 69 6e 20 72 65 67 69 73 74 65 72  lues in register
cac0: 20 50 31 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a   P1 and P2 and.*
cad0: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
cae0: 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  lt in register P
caf0: 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  3..** If either 
cb00: 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74  input is NULL, t
cb10: 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  he result is NUL
cb20: 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  L..*/./* Opcode:
cb30: 20 53 68 69 66 74 4c 65 66 74 20 50 31 20 50 32   ShiftLeft P1 P2
cb40: 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
cb50: 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d  sis: r[P3]=r[P2]
cb60: 3c 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68  <<r[P1].**.** Sh
cb70: 69 66 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  ift the integer 
cb80: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
cb90: 72 20 50 32 20 74 6f 20 74 68 65 20 6c 65 66 74  r P2 to the left
cba0: 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   by the.** numbe
cbb0: 72 20 6f 66 20 62 69 74 73 20 73 70 65 63 69 66  r of bits specif
cbc0: 69 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 67  ied by the integ
cbd0: 65 72 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  er in register P
cbe0: 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  1..** Store the 
cbf0: 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74  result in regist
cc00: 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74  er P3..** If eit
cc10: 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e 55 4c  her input is NUL
cc20: 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  L, the result is
cc30: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63   NULL..*/./* Opc
cc40: 6f 64 65 3a 20 53 68 69 66 74 52 69 67 68 74 20  ode: ShiftRight 
cc50: 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
cc60: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d  Synopsis: r[P3]=
cc70: 72 5b 50 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a  r[P2]>>r[P1].**.
cc80: 2a 2a 20 53 68 69 66 74 20 74 68 65 20 69 6e 74  ** Shift the int
cc90: 65 67 65 72 20 76 61 6c 75 65 20 69 6e 20 72 65  eger value in re
cca0: 67 69 73 74 65 72 20 50 32 20 74 6f 20 74 68 65  gister P2 to the
ccb0: 20 72 69 67 68 74 20 62 79 20 74 68 65 0a 2a 2a   right by the.**
ccc0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
ccd0: 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
cce0: 20 69 6e 74 65 67 65 72 20 69 6e 20 72 65 67 69   integer in regi
ccf0: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72  ster P1..** Stor
cd00: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
cd10: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
cd20: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
cd30: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
cd40: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
cd50: 63 61 73 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20  case OP_BitAnd: 
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42 49  /* same as TK_BI
cd80: 54 41 4e 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20  TAND, in1, in2, 
cd90: 6f 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  out3 */.case OP_
cda0: 42 69 74 4f 72 3a 20 20 20 20 20 20 20 20 20 20  BitOr:          
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
cdc0: 61 73 20 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31  as TK_BITOR, in1
cdd0: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63  , in2, out3 */.c
cde0: 61 73 65 20 4f 50 5f 53 68 69 66 74 4c 65 66 74  ase OP_ShiftLeft
cdf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
ce00: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48  * same as TK_LSH
ce10: 49 46 54 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  IFT, in1, in2, o
ce20: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ut3 */.case OP_S
ce30: 68 69 66 74 52 69 67 68 74 3a 20 7b 20 20 20 20  hiftRight: {    
ce40: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ce50: 73 20 54 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31  s TK_RSHIFT, in1
ce60: 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20  , in2, out3 */. 
ce70: 20 69 36 34 20 69 41 3b 0a 20 20 75 36 34 20 75   i64 iA;.  u64 u
ce80: 41 3b 0a 20 20 69 36 34 20 69 42 3b 0a 20 20 75  A;.  i64 iB;.  u
ce90: 38 20 6f 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  8 op;..  pIn1 = 
cea0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
ceb0: 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
cec0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20  Op->p2];.  pOut 
ced0: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
cee0: 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
cef0: 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61  lags | pIn2->fla
cf00: 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  gs) & MEM_Null )
cf10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cf20: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
cf30: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
cf40: 7d 0a 20 20 69 41 20 3d 20 73 71 6c 69 74 65 33  }.  iA = sqlite3
cf50: 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
cf60: 32 29 3b 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  2);.  iB = sqlit
cf70: 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70  e3VdbeIntValue(p
cf80: 49 6e 31 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70  In1);.  op = pOp
cf90: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 69 66 28 20  ->opcode;.  if( 
cfa0: 6f 70 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b  op==OP_BitAnd ){
cfb0: 0a 20 20 20 20 69 41 20 26 3d 20 69 42 3b 0a 20  .    iA &= iB;. 
cfc0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f   }else if( op==O
cfd0: 50 5f 42 69 74 4f 72 20 29 7b 0a 20 20 20 20 69  P_BitOr ){.    i
cfe0: 41 20 7c 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65  A |= iB;.  }else
cff0: 20 69 66 28 20 69 42 21 3d 30 20 29 7b 0a 20 20   if( iB!=0 ){.  
d000: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
d010: 5f 53 68 69 66 74 52 69 67 68 74 20 7c 7c 20 6f  _ShiftRight || o
d020: 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  p==OP_ShiftLeft 
d030: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 68  );..    /* If sh
d040: 69 66 74 69 6e 67 20 62 79 20 61 20 6e 65 67 61  ifting by a nega
d050: 74 69 76 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69  tive amount, shi
d060: 66 74 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  ft in the other 
d070: 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  direction */.   
d080: 20 69 66 28 20 69 42 3c 30 20 29 7b 0a 20 20 20   if( iB<0 ){.   
d090: 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53 68     assert( OP_Sh
d0a0: 69 66 74 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69  iftRight==OP_Shi
d0b0: 66 74 4c 65 66 74 2b 31 20 29 3b 0a 20 20 20 20  ftLeft+1 );.    
d0c0: 20 20 6f 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66    op = 2*OP_Shif
d0d0: 74 4c 65 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a  tLeft + 1 - op;.
d0e0: 20 20 20 20 20 20 69 42 20 3d 20 69 42 3e 28 2d        iB = iB>(-
d0f0: 36 34 29 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a  64) ? -iB : 64;.
d100: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
d110: 42 3e 3d 36 34 20 29 7b 0a 20 20 20 20 20 20 69  B>=64 ){.      i
d120: 41 20 3d 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70  A = (iA>=0 || op
d130: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 29 20  ==OP_ShiftLeft) 
d140: 3f 20 30 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65  ? 0 : -1;.    }e
d150: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
d160: 79 28 26 75 41 2c 20 26 69 41 2c 20 73 69 7a 65  y(&uA, &iA, size
d170: 6f 66 28 75 41 29 29 3b 0a 20 20 20 20 20 20 69  of(uA));.      i
d180: 66 28 20 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c  f( op==OP_ShiftL
d190: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eft ){.        u
d1a0: 41 20 3c 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20  A <<= iB;.      
d1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
d1c0: 41 20 3e 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20  A >>= iB;.      
d1d0: 20 20 2f 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64    /* Sign-extend
d1e0: 20 6f 6e 20 61 20 72 69 67 68 74 20 73 68 69 66   on a right shif
d1f0: 74 20 6f 66 20 61 20 6e 65 67 61 74 69 76 65 20  t of a negative 
d200: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20  number */.      
d210: 20 20 69 66 28 20 69 41 3c 30 20 29 20 75 41 20    if( iA<0 ) uA 
d220: 7c 3d 20 28 28 28 28 75 36 34 29 30 78 66 66 66  |= ((((u64)0xfff
d230: 66 66 66 66 66 29 3c 3c 33 32 29 7c 30 78 66 66  fffff)<<32)|0xff
d240: 66 66 66 66 66 66 29 20 3c 3c 20 28 36 34 2d 69  ffffff) << (64-i
d250: 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  B);.      }.    
d260: 20 20 6d 65 6d 63 70 79 28 26 69 41 2c 20 26 75    memcpy(&iA, &u
d270: 41 2c 20 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a  A, sizeof(iA));.
d280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74      }.  }.  pOut
d290: 2d 3e 75 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65  ->u.i = iA;.  Me
d2a0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
d2b0: 74 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62  t, MEM_Int);.  b
d2c0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
d2d0: 64 65 3a 20 41 64 64 49 6d 6d 20 20 50 31 20 50  de: AddImm  P1 P
d2e0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
d2f0: 73 69 73 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d  sis: r[P1]=r[P1]
d300: 2b 50 32 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74  +P2.** .** Add t
d310: 68 65 20 63 6f 6e 73 74 61 6e 74 20 50 32 20 74  he constant P2 t
d320: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  o the value in r
d330: 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54  egister P1..** T
d340: 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77  he result is alw
d350: 61 79 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  ays an integer..
d360: 2a 2a 0a 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61  **.** To force a
d370: 6e 79 20 72 65 67 69 73 74 65 72 20 74 6f 20 62  ny register to b
d380: 65 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75  e an integer, ju
d390: 73 74 20 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73  st add 0..*/.cas
d3a0: 65 20 4f 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20  e OP_AddImm: {  
d3b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31            /* in1
d3c0: 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
d3d0: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d  em[pOp->p1];.  m
d3e0: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
d3f0: 70 2c 20 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69  p, pIn1);.  sqli
d400: 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
d410: 72 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 70 49  rify(pIn1);.  pI
d420: 6e 31 2d 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e  n1->u.i += pOp->
d430: 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  p2;.  break;.}..
d440: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42  /* Opcode: MustB
d450: 65 49 6e 74 20 50 31 20 50 32 20 2a 20 2a 20 2a  eInt P1 P2 * * *
d460: 0a 2a 2a 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68  .** .** Force th
d470: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
d480: 74 65 72 20 50 31 20 74 6f 20 62 65 20 61 6e 20  ter P1 to be an 
d490: 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65  integer.  If the
d4a0: 20 76 61 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20   value.** in P1 
d4b0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
d4c0: 72 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20  r and cannot be 
d4d0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
d4e0: 6e 20 69 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74  n integer.** wit
d4f0: 68 6f 75 74 20 64 61 74 61 20 6c 6f 73 73 2c 20  hout data loss, 
d500: 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
d510: 61 74 65 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20  ately to P2, or 
d520: 69 66 20 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73  if P2==0.** rais
d530: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d  e an SQLITE_MISM
d540: 41 54 43 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a  ATCH exception..
d550: 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 73 74 42  */.case OP_MustB
d560: 65 49 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20  eInt: {         
d570: 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20     /* jump, in1 
d580: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
d590: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
d5a0: 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
d5b0: 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a   MEM_Int)==0 ){.
d5c0: 20 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74      applyAffinit
d5d0: 79 28 70 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41  y(pIn1, SQLITE_A
d5e0: 46 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f  FF_NUMERIC, enco
d5f0: 64 69 6e 67 29 3b 0a 20 20 20 20 56 64 62 65 42  ding);.    VdbeB
d600: 72 61 6e 63 68 54 61 6b 65 6e 28 28 70 49 6e 31  ranchTaken((pIn1
d610: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29  ->flags&MEM_Int)
d620: 3d 3d 30 2c 20 32 29 3b 0a 20 20 20 20 69 66 28  ==0, 2);.    if(
d630: 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
d640: 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
d650: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
d660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
d670: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41  c = SQLITE_MISMA
d680: 54 43 48 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  TCH;.        got
d690: 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
d6a0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rror;.      }els
d6b0: 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  e{.        goto 
d6c0: 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20  jump_to_p2;.    
d6d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d6e0: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
d6f0: 49 6e 31 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20  In1, MEM_Int);. 
d700: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64   break;.}..#ifnd
d710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
d720: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a  LOATING_POINT./*
d730: 20 4f 70 63 6f 64 65 3a 20 52 65 61 6c 41 66 66   Opcode: RealAff
d740: 69 6e 69 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a  inity P1 * * * *
d750: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 69 73 74  .**.** If regist
d760: 65 72 20 50 31 20 68 6f 6c 64 73 20 61 6e 20 69  er P1 holds an i
d770: 6e 74 65 67 65 72 20 63 6f 6e 76 65 72 74 20 69  nteger convert i
d780: 74 20 74 6f 20 61 20 72 65 61 6c 20 76 61 6c 75  t to a real valu
d790: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  e..**.** This op
d7a0: 63 6f 64 65 20 69 73 20 75 73 65 64 20 77 68 65  code is used whe
d7b0: 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 6e 66  n extracting inf
d7c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
d7d0: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68  column that.** h
d7e0: 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
d7f0: 2e 20 20 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76  .  Such column v
d800: 61 6c 75 65 73 20 6d 61 79 20 73 74 69 6c 6c 20  alues may still 
d810: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
d820: 69 6e 74 65 67 65 72 73 2c 20 66 6f 72 20 73 70  integers, for sp
d830: 61 63 65 20 65 66 66 69 63 69 65 6e 63 79 2c 20  ace efficiency, 
d840: 62 75 74 20 61 66 74 65 72 20 65 78 74 72 61 63  but after extrac
d850: 74 69 6f 6e 20 77 65 20 77 61 6e 74 20 74 68 65  tion we want the
d860: 6d 0a 2a 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c  m.** to have onl
d870: 79 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  y a real value..
d880: 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 61 6c 41  */.case OP_RealA
d890: 66 66 69 6e 69 74 79 3a 20 7b 20 20 20 20 20 20  ffinity: {      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
d8b0: 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
d8c0: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
d8d0: 20 69 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73   if( pIn1->flags
d8e0: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
d8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
d900: 52 65 61 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20  Realify(pIn1);. 
d910: 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
d920: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f  LITE_OMIT_CAST./
d940: 2a 20 4f 70 63 6f 64 65 3a 20 43 61 73 74 20 50  * Opcode: Cast P
d950: 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
d960: 6e 6f 70 73 69 73 3a 20 61 66 66 69 6e 69 74 79  nopsis: affinity
d970: 28 72 5b 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f  (r[P1]).**.** Fo
d980: 72 63 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  rce the value in
d990: 20 72 65 67 69 73 74 65 72 20 50 31 20 74 6f 20   register P1 to 
d9a0: 62 65 20 74 68 65 20 74 79 70 65 20 64 65 66 69  be the type defi
d9b0: 6e 65 64 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a  ned by P2..** .*
d9c0: 2a 20 3c 75 6c 3e 0a 2a 2a 20 3c 6c 69 3e 20 50  * <ul>.** <li> P
d9d0: 32 3d 3d 27 41 27 20 26 72 61 72 72 3b 20 42 4c  2=='A' &rarr; BL
d9e0: 4f 42 0a 2a 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27  OB.** <li> P2=='
d9f0: 42 27 20 26 72 61 72 72 3b 20 54 45 58 54 0a 2a  B' &rarr; TEXT.*
da00: 2a 20 3c 6c 69 3e 20 50 32 3d 3d 27 43 27 20 26  * <li> P2=='C' &
da10: 72 61 72 72 3b 20 4e 55 4d 45 52 49 43 0a 2a 2a  rarr; NUMERIC.**
da20: 20 3c 6c 69 3e 20 50 32 3d 3d 27 44 27 20 26 72   <li> P2=='D' &r
da30: 61 72 72 3b 20 49 4e 54 45 47 45 52 0a 2a 2a 20  arr; INTEGER.** 
da40: 3c 6c 69 3e 20 50 32 3d 3d 27 45 27 20 26 72 61  <li> P2=='E' &ra
da50: 72 72 3b 20 52 45 41 4c 0a 2a 2a 20 3c 2f 75 6c  rr; REAL.** </ul
da60: 3e 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 76  >.**.** A NULL v
da70: 61 6c 75 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  alue is not chan
da80: 67 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ged by this rout
da90: 69 6e 65 2e 20 20 49 74 20 72 65 6d 61 69 6e 73  ine.  It remains
daa0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f   NULL..*/.case O
dab0: 50 5f 43 61 73 74 3a 20 7b 20 20 20 20 20 20 20  P_Cast: {       
dac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e             /* in
dad0: 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  1 */.  assert( p
dae0: 4f 70 2d 3e 70 32 3e 3d 53 51 4c 49 54 45 5f 41  Op->p2>=SQLITE_A
daf0: 46 46 5f 42 4c 4f 42 20 26 26 20 70 4f 70 2d 3e  FF_BLOB && pOp->
db00: 70 32 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  p2<=SQLITE_AFF_R
db10: 45 41 4c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  EAL );.  testcas
db20: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
db30: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
db40: 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e   testcase( pOp->
db50: 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  p2==SQLITE_AFF_B
db60: 4c 4f 42 20 29 3b 0a 20 20 74 65 73 74 63 61 73  LOB );.  testcas
db70: 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49  e( pOp->p2==SQLI
db80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
db90: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
dba0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
dbb0: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 74  F_INTEGER );.  t
dbc0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
dbd0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
dbe0: 4c 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  L );.  pIn1 = &a
dbf0: 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
dc00: 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65  memAboutToChange
dc10: 28 70 2c 20 70 49 6e 31 29 3b 0a 20 20 72 63 20  (p, pIn1);.  rc 
dc20: 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e  = ExpandBlob(pIn
dc30: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
dc40: 65 4d 65 6d 43 61 73 74 28 70 49 6e 31 2c 20 70  eMemCast(pIn1, p
dc50: 4f 70 2d 3e 70 32 2c 20 65 6e 63 6f 64 69 6e 67  Op->p2, encoding
dc60: 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f  );.  UPDATE_MAX_
dc70: 42 4c 4f 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a  BLOBSIZE(pIn1);.
dc80: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
dc90: 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
dca0: 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  or;.  break;.}.#
dcb0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
dcc0: 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 0a 2f 2a  OMIT_CAST */../*
dcd0: 20 4f 70 63 6f 64 65 3a 20 45 71 20 50 31 20 50   Opcode: Eq P1 P
dce0: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
dcf0: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
dd00: 3d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f  ==r[P1].**.** Co
dd10: 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
dd20: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
dd30: 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67 28  and P3.  If reg(
dd40: 50 33 29 3d 3d 72 65 67 28 50 31 29 20 74 68 65  P3)==reg(P1) the
dd50: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
dd60: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
dd70: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
dd80: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
dd90: 6e 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 73 74  n P5, then.** st
dda0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ore the result o
ddb0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20  f comparison in 
ddc0: 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a  register P2..**.
ddd0: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41 46  ** The SQLITE_AF
dde0: 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20 6f  F_MASK portion o
ddf0: 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e 20  f P5 must be an 
de00: 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63 74  affinity charact
de10: 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  er -.** SQLITE_A
de20: 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45 5f  FF_TEXT, SQLITE_
de30: 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e 64  AFF_INTEGER, and
de40: 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61 74   so forth. An at
de50: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a 2a  tempt is made .*
de60: 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74 68  * to coerce both
de70: 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69 6e   inputs accordin
de80: 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e 69  g to this affini
de90: 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a  ty before the.**
dea0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
deb0: 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c 49  ade. If the SQLI
dec0: 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20 30  TE_AFF_MASK is 0
ded0: 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  x00, then numeri
dee0: 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69 73  c.** affinity is
def0: 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61 74   used. Note that
df00: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63 6f   the affinity co
df10: 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73 74  nversions are st
df20: 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 74  ored.** back int
df30: 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67 69  o the input regi
df40: 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e  sters P1 and P3.
df50: 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64 65    So this opcode
df60: 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70 65   can cause.** pe
df70: 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65 73  rsistent changes
df80: 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50 31   to registers P1
df90: 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f   and P3..**.** O
dfa0: 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73 69  nce any conversi
dfb0: 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ons have taken p
dfc0: 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68 65  lace, and neithe
dfd0: 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  r value is NULL,
dfe0: 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20   .** the values 
dff0: 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49 66  are compared. If
e000: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
e010: 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d 63   blobs then memc
e020: 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64 20  mp() is.** used 
e030: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
e040: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
e050: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66 20  comparison.  If 
e060: 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20 61  both values.** a
e070: 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74 68  re text, then th
e080: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
e090: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
e0a0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a 2a   specified in.**
e0b0: 20 50 34 20 69 73 20 75 73 65 64 20 74 6f 20 64   P4 is used to d
e0c0: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
e0d0: 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20  .  If P4 is not 
e0e0: 73 70 65 63 69 66 69 65 64 20 74 68 65 6e 0a 2a  specified then.*
e0f0: 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20 75 73  * memcmp() is us
e100: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 65  ed to compare te
e110: 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66 20 62  xt string.  If b
e120: 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 0a 2a  oth values are.*
e130: 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65 6e 20  * numeric, then 
e140: 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70 61 72  a numeric compar
e150: 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20 49 66  ison is used. If
e160: 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
e170: 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66 65 72  ** are of differ
e180: 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65 6e 20  ent types, then 
e190: 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f 6e 73  numbers are cons
e1a0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
e1b0: 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20  .** strings and 
e1c0: 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f 6e 73  strings are cons
e1d0: 69 64 65 72 65 64 20 6c 65 73 73 20 74 68 61 6e  idered less than
e1e0: 20 62 6c 6f 62 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   blobs..**.** If
e1f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 69   SQLITE_NULLEQ i
e200: 73 20 73 65 74 20 69 6e 20 50 35 20 74 68 65 6e  s set in P5 then
e210: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
e220: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 6c 77  omparison is alw
e230: 61 79 73 20 65 69 74 68 65 72 0a 2a 2a 20 74 72  ays either.** tr
e240: 75 65 20 6f 72 20 66 61 6c 73 65 20 61 6e 64 20  ue or false and 
e250: 69 73 20 6e 65 76 65 72 20 4e 55 4c 4c 2e 20 20  is never NULL.  
e260: 49 66 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73  If both operands
e270: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
e280: 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 66 20  he result.** of 
e290: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
e2a0: 75 65 2e 20 20 49 66 20 65 69 74 68 65 72 20 6f  ue.  If either o
e2b0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20 74  perand is NULL t
e2c0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
e2d0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 49 66 20 6e  s false..** If n
e2e0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
e2f0: 73 20 4e 55 4c 4c 20 74 68 65 20 72 65 73 75 6c  s NULL the resul
e300: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
e310: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 66 0a   it would be if.
e320: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 55  ** the SQLITE_NU
e330: 4c 4c 45 51 20 66 6c 61 67 20 77 65 72 65 20 6f  LLEQ flag were o
e340: 6d 69 74 74 65 64 20 66 72 6f 6d 20 50 35 2e 0a  mitted from P5..
e350: 2a 2a 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51  **.** If both SQ
e360: 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64  LITE_STOREP2 and
e370: 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c   SQLITE_KEEPNULL
e380: 20 66 6c 61 67 73 20 61 72 65 20 73 65 74 20 74   flags are set t
e390: 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  hen the.** conte
e3a0: 6e 74 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f  nt of r[P2] is o
e3b0: 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74  nly changed if t
e3c0: 68 65 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20  he new value is 
e3d0: 4e 55 4c 4c 20 6f 72 20 30 20 28 66 61 6c 73 65  NULL or 0 (false
e3e0: 29 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  )..** In other w
e3f0: 6f 72 64 73 2c 20 61 20 70 72 69 6f 72 20 72 5b  ords, a prior r[
e400: 50 32 5d 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e  P2] value will n
e410: 6f 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ot be overwritte
e420: 6e 20 62 79 20 31 20 28 74 72 75 65 29 2e 0a 2a  n by 1 (true)..*
e430: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 20  /./* Opcode: Ne 
e440: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
e450: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
e460: 5b 50 33 5d 21 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]!=r[P1].**.*
e470: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
e480: 74 20 6c 69 6b 65 20 74 68 65 20 45 71 20 6f 70  t like the Eq op
e490: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
e4a0: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
e4b0: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 6f 70 65  en if.** the ope
e4c0: 72 61 6e 64 73 20 69 6e 20 72 65 67 69 73 74 65  rands in registe
e4d0: 72 73 20 50 31 20 61 6e 64 20 50 33 20 61 72 65  rs P1 and P3 are
e4e0: 20 6e 6f 74 20 65 71 75 61 6c 2e 20 20 53 65 65   not equal.  See
e4f0: 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65 20 66   the Eq opcode f
e500: 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c  or.** additional
e510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a   information..**
e520: 0a 2a 2a 20 49 66 20 62 6f 74 68 20 53 51 4c 49  .** If both SQLI
e530: 54 45 5f 53 54 4f 52 45 50 32 20 61 6e 64 20 53  TE_STOREP2 and S
e540: 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66  QLITE_KEEPNULL f
e550: 6c 61 67 73 20 61 72 65 20 73 65 74 20 74 68 65  lags are set the
e560: 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
e570: 20 6f 66 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c   of r[P2] is onl
e580: 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
e590: 20 6e 65 77 20 76 61 6c 75 65 20 69 73 20 4e 55   new value is NU
e5a0: 4c 4c 20 6f 72 20 31 20 28 74 72 75 65 29 2e 0a  LL or 1 (true)..
e5b0: 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
e5c0: 73 2c 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d  s, a prior r[P2]
e5d0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20   value will not 
e5e0: 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
e5f0: 79 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2f 0a  y 0 (false)..*/.
e600: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 74 20 50 31  /* Opcode: Lt P1
e610: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
e620: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
e630: 33 5d 3c 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 43  3]<r[P1].**.** C
e640: 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
e650: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
e660: 20 61 6e 64 20 50 33 2e 20 20 49 66 20 72 65 67   and P3.  If reg
e670: 28 50 33 29 3c 72 65 67 28 50 31 29 20 74 68 65  (P3)<reg(P1) the
e680: 6e 0a 2a 2a 20 6a 75 6d 70 20 74 6f 20 61 64 64  n.** jump to add
e690: 72 65 73 73 20 50 32 2e 20 20 4f 72 20 69 66 20  ress P2.  Or if 
e6a0: 74 68 65 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  the SQLITE_STORE
e6b0: 50 32 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  P2 flag is set i
e6c0: 6e 20 50 35 20 73 74 6f 72 65 0a 2a 2a 20 74 68  n P5 store.** th
e6d0: 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
e6e0: 61 72 69 73 6f 6e 20 28 30 20 6f 72 20 31 20 6f  arison (0 or 1 o
e6f0: 72 20 4e 55 4c 4c 29 20 69 6e 74 6f 20 72 65 67  r NULL) into reg
e700: 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
e710: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4a 55  If the SQLITE_JU
e720: 4d 50 49 46 4e 55 4c 4c 20 62 69 74 20 6f 66 20  MPIFNULL bit of 
e730: 50 35 20 69 73 20 73 65 74 20 61 6e 64 20 65 69  P5 is set and ei
e740: 74 68 65 72 20 72 65 67 28 50 31 29 20 6f 72 0a  ther reg(P1) or.
e750: 2a 2a 20 72 65 67 28 50 33 29 20 69 73 20 4e 55  ** reg(P3) is NU
e760: 4c 4c 20 74 68 65 6e 20 74 68 65 20 74 61 6b 65  LL then the take
e770: 20 74 68 65 20 6a 75 6d 70 2e 20 20 49 66 20 74   the jump.  If t
e780: 68 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  he SQLITE_JUMPIF
e790: 4e 55 4c 4c 20 0a 2a 2a 20 62 69 74 20 69 73 20  NULL .** bit is 
e7a0: 63 6c 65 61 72 20 74 68 65 6e 20 66 61 6c 6c 20  clear then fall 
e7b0: 74 68 72 6f 75 67 68 20 69 66 20 65 69 74 68 65  through if eithe
e7c0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
e7d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  L..**.** The SQL
e7e0: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 70 6f 72  ITE_AFF_MASK por
e7f0: 74 69 6f 6e 20 6f 66 20 50 35 20 6d 75 73 74 20  tion of P5 must 
e800: 62 65 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  be an affinity c
e810: 68 61 72 61 63 74 65 72 20 2d 0a 2a 2a 20 53 51  haracter -.** SQ
e820: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 2c 20 53  LITE_AFF_TEXT, S
e830: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
e840: 52 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  R, and so forth.
e850: 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
e860: 61 64 65 20 0a 2a 2a 20 74 6f 20 63 6f 65 72 63  ade .** to coerc
e870: 65 20 62 6f 74 68 20 69 6e 70 75 74 73 20 61 63  e both inputs ac
e880: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
e890: 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
e8a0: 74 68 65 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  the.** compariso
e8b0: 6e 20 69 73 20 6d 61 64 65 2e 20 49 66 20 74 68  n is made. If th
e8c0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
e8d0: 4b 20 69 73 20 30 78 30 30 2c 20 74 68 65 6e 20  K is 0x00, then 
e8e0: 6e 75 6d 65 72 69 63 0a 2a 2a 20 61 66 66 69 6e  numeric.** affin
e8f0: 69 74 79 20 69 73 20 75 73 65 64 2e 20 4e 6f 74  ity is used. Not
e900: 65 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  e that the affin
e910: 69 74 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ity conversions 
e920: 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 62 61  are stored.** ba
e930: 63 6b 20 69 6e 74 6f 20 74 68 65 20 69 6e 70 75  ck into the inpu
e940: 74 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61  t registers P1 a
e950: 6e 64 20 50 33 2e 20 20 53 6f 20 74 68 69 73 20  nd P3.  So this 
e960: 6f 70 63 6f 64 65 20 63 61 6e 20 63 61 75 73 65  opcode can cause
e970: 0a 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 20 63  .** persistent c
e980: 68 61 6e 67 65 73 20 74 6f 20 72 65 67 69 73 74  hanges to regist
e990: 65 72 73 20 50 31 20 61 6e 64 20 50 33 2e 0a 2a  ers P1 and P3..*
e9a0: 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 79 20 63 6f  *.** Once any co
e9b0: 6e 76 65 72 73 69 6f 6e 73 20 68 61 76 65 20 74  nversions have t
e9c0: 61 6b 65 6e 20 70 6c 61 63 65 2c 20 61 6e 64 20  aken place, and 
e9d0: 6e 65 69 74 68 65 72 20 76 61 6c 75 65 20 69 73  neither value is
e9e0: 20 4e 55 4c 4c 2c 20 0a 2a 2a 20 74 68 65 20 76   NULL, .** the v
e9f0: 61 6c 75 65 73 20 61 72 65 20 63 6f 6d 70 61 72  alues are compar
ea00: 65 64 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  ed. If both valu
ea10: 65 73 20 61 72 65 20 62 6c 6f 62 73 20 74 68 65  es are blobs the
ea20: 6e 20 6d 65 6d 63 6d 70 28 29 20 69 73 0a 2a 2a  n memcmp() is.**
ea30: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
ea40: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ne the results o
ea50: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
ea60: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
ea70: 73 0a 2a 2a 20 61 72 65 20 74 65 78 74 2c 20 74  s.** are text, t
ea80: 68 65 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  hen the appropri
ea90: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ate collating fu
eaa0: 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  nction specified
eab0: 20 69 6e 0a 2a 2a 20 50 34 20 69 73 20 20 75 73   in.** P4 is  us
eac0: 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d  ed to do the com
ead0: 70 61 72 69 73 6f 6e 2e 20 20 49 66 20 50 34 20  parison.  If P4 
eae0: 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  is not specified
eaf0: 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d 63 6d 70 28   then.** memcmp(
eb00: 29 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ) is used to com
eb10: 70 61 72 65 20 74 65 78 74 20 73 74 72 69 6e 67  pare text string
eb20: 2e 20 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65  .  If both value
eb30: 73 20 61 72 65 0a 2a 2a 20 6e 75 6d 65 72 69 63  s are.** numeric
eb40: 2c 20 74 68 65 6e 20 61 20 6e 75 6d 65 72 69 63  , then a numeric
eb50: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 75   comparison is u
eb60: 73 65 64 2e 20 49 66 20 74 68 65 20 74 77 6f 20  sed. If the two 
eb70: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 6f 66  values.** are of
eb80: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
eb90: 2c 20 74 68 65 6e 20 6e 75 6d 62 65 72 73 20 61  , then numbers a
eba0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
ebb0: 73 73 20 74 68 61 6e 0a 2a 2a 20 73 74 72 69 6e  ss than.** strin
ebc0: 67 73 20 61 6e 64 20 73 74 72 69 6e 67 73 20 61  gs and strings a
ebd0: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 6c 65  re considered le
ebe0: 73 73 20 74 68 61 6e 20 62 6c 6f 62 73 2e 0a 2a  ss than blobs..*
ebf0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 65 20  /./* Opcode: Le 
ec00: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
ec10: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72  * Synopsis: IF r
ec20: 5b 50 33 5d 3c 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  [P3]<=r[P1].**.*
ec30: 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
ec40: 74 20 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70  t like the Lt op
ec50: 63 6f 64 65 20 65 78 63 65 70 74 20 74 68 61 74  code except that
ec60: 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
ec70: 65 6e 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e  en if.** the con
ec80: 74 65 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72  tent of register
ec90: 20 50 33 20 69 73 20 6c 65 73 73 20 74 68 61 6e   P3 is less than
eca0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
ecb0: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72   content of.** r
ecc0: 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65 65  egister P1.  See
ecd0: 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 66   the Lt opcode f
ece0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
ecf0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
ed00: 20 4f 70 63 6f 64 65 3a 20 47 74 20 50 31 20 50   Opcode: Gt P1 P
ed10: 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
ed20: 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d  nopsis: IF r[P3]
ed30: 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  >r[P1].**.** Thi
ed40: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
ed50: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
ed60: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
ed70: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
ed80: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
ed90: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
eda0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
edb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
edc0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53   register P1.  S
edd0: 65 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65  ee the Lt opcode
ede0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
edf0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
ee00: 2f 2a 20 4f 70 63 6f 64 65 3a 20 47 65 20 50 31  /* Opcode: Ge P1
ee10: 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
ee20: 53 79 6e 6f 70 73 69 73 3a 20 49 46 20 72 5b 50  Synopsis: IF r[P
ee30: 33 5d 3e 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  3]>=r[P1].**.** 
ee40: 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
ee50: 6c 69 6b 65 20 74 68 65 20 4c 74 20 6f 70 63 6f  like the Lt opco
ee60: 64 65 20 65 78 63 65 70 74 20 74 68 61 74 20 74  de except that t
ee70: 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
ee80: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65   if.** the conte
ee90: 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
eea0: 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  3 is greater tha
eeb0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
eec0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
eed0: 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 53 65  register P1.  Se
eee0: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
eef0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
ef00: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
ef10: 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 20 20  ase OP_Eq:      
ef20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
ef30: 20 61 73 20 54 4b 5f 45 51 2c 20 6a 75 6d 70 2c   as TK_EQ, jump,
ef40: 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73   in1, in3 */.cas
ef50: 65 20 4f 50 5f 4e 65 3a 20 20 20 20 20 20 20 20  e OP_Ne:        
ef60: 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61         /* same a
ef70: 73 20 54 4b 5f 4e 45 2c 20 6a 75 6d 70 2c 20 69  s TK_NE, jump, i
ef80: 6e 31 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20  n1, in3 */.case 
ef90: 4f 50 5f 4c 74 3a 20 20 20 20 20 20 20 20 20 20  OP_Lt:          
efa0: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
efb0: 54 4b 5f 4c 54 2c 20 6a 75 6d 70 2c 20 69 6e 31  TK_LT, jump, in1
efc0: 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
efd0: 5f 4c 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  _Le:            
efe0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
eff0: 5f 4c 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20  _LE, jump, in1, 
f000: 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47  in3 */.case OP_G
f010: 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t:              
f020: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47   /* same as TK_G
f030: 54 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e  T, jump, in1, in
f040: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 47 65 3a  3 */.case OP_Ge:
f050: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   {             /
f060: 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 47 45 2c  * same as TK_GE,
f070: 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20   jump, in1, in3 
f080: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 65  */.  int res, re
f090: 73 32 3b 20 20 20 20 20 20 2f 2a 20 52 65 73 75  s2;      /* Resu
f0a0: 6c 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  lt of the compar
f0b0: 69 73 6f 6e 20 6f 66 20 70 49 6e 31 20 61 67 61  ison of pIn1 aga
f0c0: 69 6e 73 74 20 70 49 6e 33 20 2a 2f 0a 20 20 63  inst pIn3 */.  c
f0d0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
f0e0: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 74     /* Affinity t
f0f0: 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
f100: 69 73 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  ison */.  u16 fl
f110: 61 67 73 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  ags1;         /*
f120: 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   Copy of initial
f130: 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 31 2d 3e   value of pIn1->
f140: 66 6c 61 67 73 20 2a 2f 0a 20 20 75 31 36 20 66  flags */.  u16 f
f150: 6c 61 67 73 33 3b 20 20 20 20 20 20 20 20 20 2f  lags3;         /
f160: 2a 20 43 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  * Copy of initia
f170: 6c 20 76 61 6c 75 65 20 6f 66 20 70 49 6e 33 2d  l value of pIn3-
f180: 3e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 70 49 6e  >flags */..  pIn
f190: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
f1a0: 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d  1];.  pIn3 = &aM
f1b0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 66  em[pOp->p3];.  f
f1c0: 6c 61 67 73 31 20 3d 20 70 49 6e 31 2d 3e 66 6c  lags1 = pIn1->fl
f1d0: 61 67 73 3b 0a 20 20 66 6c 61 67 73 33 20 3d 20  ags;.  flags3 = 
f1e0: 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pIn3->flags;.  i
f1f0: 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c 61  f( (flags1 | fla
f200: 67 73 33 29 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs3)&MEM_Null ){
f210: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 62  .    /* One or b
f220: 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65  oth operands are
f230: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28   NULL */.    if(
f240: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
f250: 45 5f 4e 55 4c 4c 45 51 20 29 7b 0a 20 20 20 20  E_NULLEQ ){.    
f260: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 4e    /* If SQLITE_N
f270: 55 4c 4c 45 51 20 69 73 20 73 65 74 20 28 77 68  ULLEQ is set (wh
f280: 69 63 68 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ich will only ha
f290: 70 70 65 6e 20 69 66 20 74 68 65 20 6f 70 65 72  ppen if the oper
f2a0: 61 74 6f 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ator is.      **
f2b0: 20 4f 50 5f 45 71 20 6f 72 20 4f 50 5f 4e 65 29   OP_Eq or OP_Ne)
f2c0: 20 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a   then take the j
f2d0: 75 6d 70 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e  ump or not depen
f2e0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 0a  ding on whether.
f2f0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 6e 6f 74 20        ** or not 
f300: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72  both operands ar
f310: 65 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  e null..      */
f320: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f330: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45  Op->opcode==OP_E
f340: 71 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  q || pOp->opcode
f350: 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ne );.     
f360: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 31   assert( (flags1
f370: 20 26 20 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d   & MEM_Cleared)=
f380: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
f390: 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  rt( (pOp->p5 & S
f3a0: 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
f3b0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
f3c0: 28 20 28 66 6c 61 67 73 31 26 66 6c 61 67 73 33  ( (flags1&flags3
f3d0: 26 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 0a 20 20  &MEM_Null)!=0.  
f3e0: 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 33 26       && (flags3&
f3f0: 4d 45 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 0a  MEM_Cleared)==0.
f400: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
f410: 20 72 65 73 20 3d 20 30 3b 20 20 2f 2a 20 4f 70   res = 0;  /* Op
f420: 65 72 61 6e 64 73 20 61 72 65 20 65 71 75 61 6c  erands are equal
f430: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
f440: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 31  .        res = 1
f450: 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61  ;  /* Operands a
f460: 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a  re not equal */.
f470: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f480: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  e{.      /* SQLI
f490: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 63 6c 65  TE_NULLEQ is cle
f4a0: 61 72 20 61 6e 64 20 61 74 20 6c 65 61 73 74 20  ar and at least 
f4b0: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
f4c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ULL,.      ** th
f4d0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
f4e0: 20 61 6c 77 61 79 73 20 4e 55 4c 4c 2e 0a 20 20   always NULL..  
f4f0: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 6d 70 20      ** The jump 
f500: 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
f510: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
f520: 4c 20 62 69 74 20 69 73 20 73 65 74 2e 0a 20 20  L bit is set..  
f530: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f540: 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54   pOp->p5 & SQLIT
f550: 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20  E_STOREP2 ){.   
f560: 20 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65       pOut = &aMe
f570: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
f580: 20 20 20 20 69 43 6f 6d 70 61 72 65 20 3d 20 31      iCompare = 1
f590: 3b 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64 73  ;    /* Operands
f5a0: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 20 2a   are not equal *
f5b0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f  /.        memAbo
f5c0: 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
f5d0: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ut);.        Mem
f5e0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
f5f0: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
f600: 20 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52       REGISTER_TR
f610: 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f 75  ACE(pOp->p2, pOu
f620: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
f630: 0a 20 20 20 20 20 20 20 20 56 64 62 65 42 72 61  .        VdbeBra
f640: 6e 63 68 54 61 6b 65 6e 28 32 2c 33 29 3b 0a 20  nchTaken(2,3);. 
f650: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
f660: 70 35 20 26 20 53 51 4c 49 54 45 5f 4a 55 4d 50  p5 & SQLITE_JUMP
f670: 49 46 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  IFNULL ){.      
f680: 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
f690: 5f 70 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _p2;.        }. 
f6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f6b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ak;.    }.  }els
f6c0: 65 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65  e{.    /* Neithe
f6d0: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f6e0: 4c 2e 20 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  L.  Do a compari
f6f0: 73 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 66 66 69  son. */.    affi
f700: 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 35 20 26  nity = pOp->p5 &
f710: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53 4b   SQLITE_AFF_MASK
f720: 3b 0a 20 20 20 20 69 66 28 20 61 66 66 69 6e 69  ;.    if( affini
f730: 74 79 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty>=SQLITE_AFF_N
f740: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
f750: 69 66 28 20 28 66 6c 61 67 73 31 20 7c 20 66 6c  if( (flags1 | fl
f760: 61 67 73 33 29 26 4d 45 4d 5f 53 74 72 20 29 7b  ags3)&MEM_Str ){
f770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 66 6c  .        if( (fl
f780: 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74 7c  ags1 & (MEM_Int|
f790: 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 53 74 72  MEM_Real|MEM_Str
f7a0: 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ))==MEM_Str ){. 
f7b0: 20 20 20 20 20 20 20 20 20 61 70 70 6c 79 4e 75           applyNu
f7c0: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
f7d0: 6e 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  n1,0);.         
f7e0: 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
f7f0: 33 21 3d 70 49 6e 33 2d 3e 66 6c 61 67 73 20 29  3!=pIn3->flags )
f800: 3b 20 2f 2a 20 50 6f 73 73 69 62 6c 65 20 69 66  ; /* Possible if
f810: 20 70 49 6e 31 3d 3d 70 49 6e 33 20 2a 2f 0a 20   pIn1==pIn3 */. 
f820: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 33 20           flags3 
f830: 3d 20 70 49 6e 33 2d 3e 66 6c 61 67 73 3b 0a 20  = pIn3->flags;. 
f840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f850: 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20 28   if( (flags3 & (
f860: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
f870: 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f  |MEM_Str))==MEM_
f880: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
f890: 20 61 70 70 6c 79 4e 75 6d 65 72 69 63 41 66 66   applyNumericAff
f8a0: 69 6e 69 74 79 28 70 49 6e 33 2c 30 29 3b 0a 20  inity(pIn3,0);. 
f8b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f8c0: 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  .      /* Handle
f8d0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
f8e0: 20 6f 66 20 69 6e 74 65 67 65 72 20 63 6f 6d 70   of integer comp
f8f0: 61 72 69 73 6f 6e 20 68 65 72 65 2c 20 61 73 20  arison here, as 
f900: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  an.      ** opti
f910: 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 61 76 6f  mization, to avo
f920: 69 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  id a call to sql
f930: 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
f940: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
f950: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 70 49 6e  In1->flags & pIn
f960: 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
f970: 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
f980: 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20    if( pIn3->u.i 
f990: 3e 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72  > pIn1->u.i ){ r
f9a0: 65 73 20 3d 20 2b 31 3b 20 67 6f 74 6f 20 63 6f  es = +1; goto co
f9b0: 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20  mpare_op; }.    
f9c0: 20 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e      if( pIn3->u.
f9d0: 69 20 3c 20 70 49 6e 31 2d 3e 75 2e 69 20 29 7b  i < pIn1->u.i ){
f9e0: 20 72 65 73 20 3d 20 2d 31 3b 20 67 6f 74 6f 20   res = -1; goto 
f9f0: 63 6f 6d 70 61 72 65 5f 6f 70 3b 20 7d 0a 20 20  compare_op; }.  
fa00: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
fa10: 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 70         goto comp
fa20: 61 72 65 5f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a  are_op;.      }.
fa30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66      }else if( af
fa40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
fa50: 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20  FF_TEXT ){.     
fa60: 20 69 66 28 20 28 66 6c 61 67 73 31 20 26 20 4d   if( (flags1 & M
fa70: 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28 66  EM_Str)==0 && (f
fa80: 6c 61 67 73 31 20 26 20 28 4d 45 4d 5f 49 6e 74  lags1 & (MEM_Int
fa90: 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20 29  |MEM_Real))!=0 )
faa0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
fab0: 73 65 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  se( pIn1->flags 
fac0: 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20  & MEM_Int );.   
fad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
fae0: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
faf0: 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 20  _Real );.       
fb00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fb10: 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c 20 65  tringify(pIn1, e
fb20: 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20 20  ncoding, 1);.   
fb30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
fb40: 66 6c 61 67 73 31 26 4d 45 4d 5f 44 79 6e 29 20  flags1&MEM_Dyn) 
fb50: 21 3d 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 26  != (pIn1->flags&
fb60: 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20 20  MEM_Dyn) );.    
fb70: 20 20 20 20 66 6c 61 67 73 31 20 3d 20 28 70 49      flags1 = (pI
fb80: 6e 31 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45 4d  n1->flags & ~MEM
fb90: 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66 6c  _TypeMask) | (fl
fba0: 61 67 73 31 20 26 20 4d 45 4d 5f 54 79 70 65 4d  ags1 & MEM_TypeM
fbb0: 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ask);.        as
fbc0: 73 65 72 74 28 20 70 49 6e 31 21 3d 70 49 6e 33  sert( pIn1!=pIn3
fbd0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
fbe0: 20 20 69 66 28 20 28 66 6c 61 67 73 33 20 26 20    if( (flags3 & 
fbf0: 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 26 26 20 28  MEM_Str)==0 && (
fc00: 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49 6e  flags3 & (MEM_In
fc10: 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 21 3d 30 20  t|MEM_Real))!=0 
fc20: 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
fc30: 61 73 65 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ase( pIn3->flags
fc40: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
fc50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fc60: 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
fc70: 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20  M_Real );.      
fc80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
fc90: 53 74 72 69 6e 67 69 66 79 28 70 49 6e 33 2c 20  Stringify(pIn3, 
fca0: 65 6e 63 6f 64 69 6e 67 2c 20 31 29 3b 0a 20 20  encoding, 1);.  
fcb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
fcc0: 28 66 6c 61 67 73 33 26 4d 45 4d 5f 44 79 6e 29  (flags3&MEM_Dyn)
fcd0: 20 21 3d 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73   != (pIn3->flags
fce0: 26 4d 45 4d 5f 44 79 6e 29 20 29 3b 0a 20 20 20  &MEM_Dyn) );.   
fcf0: 20 20 20 20 20 66 6c 61 67 73 33 20 3d 20 28 70       flags3 = (p
fd00: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 7e 4d 45  In3->flags & ~ME
fd10: 4d 5f 54 79 70 65 4d 61 73 6b 29 20 7c 20 28 66  M_TypeMask) | (f
fd20: 6c 61 67 73 33 20 26 20 4d 45 4d 5f 54 79 70 65  lags3 & MEM_Type
fd30: 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Mask);.      }. 
fd40: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
fd50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
fd60: 5f 43 4f 4c 4c 53 45 51 20 7c 7c 20 70 4f 70 2d  _COLLSEQ || pOp-
fd70: 3e 70 34 2e 70 43 6f 6c 6c 3d 3d 30 20 29 3b 0a  >p4.pColl==0 );.
fd80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
fd90: 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 49 6e 33  3MemCompare(pIn3
fda0: 2c 20 70 49 6e 31 2c 20 70 4f 70 2d 3e 70 34 2e  , pIn1, pOp->p4.
fdb0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 63 6f 6d 70  pColl);.  }.comp
fdc0: 61 72 65 5f 6f 70 3a 0a 20 20 2f 2a 20 41 74 20  are_op:.  /* At 
fdd0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 72 65 73 20  this point, res 
fde0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
fdf0: 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
fe00: 66 20 72 65 67 5b 50 31 5d 20 69 73 0a 20 20 2a  f reg[P1] is.  *
fe10: 2a 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  * less than, equ
fe20: 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
fe30: 72 20 74 68 61 6e 20 72 65 67 5b 50 33 5d 2c 20  r than reg[P3], 
fe40: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 43  respectively.  C
fe50: 6f 6d 70 75 74 65 0a 20 20 2a 2a 20 74 68 65 20  ompute.  ** the 
fe60: 61 6e 73 77 65 72 20 74 6f 20 74 68 69 73 20 6f  answer to this o
fe70: 70 65 72 61 74 6f 72 20 69 6e 20 72 65 73 32 2c  perator in res2,
fe80: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
fe90: 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  at the compariso
fea0: 6e 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20  n.  ** operator 
feb0: 61 63 74 75 61 6c 6c 79 20 69 73 2e 20 20 54 68  actually is.  Th
fec0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
fed0: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
fee0: 74 68 65 20 66 61 63 74 0a 20 20 2a 2a 20 74 68  the fact.  ** th
fef0: 61 74 20 74 68 65 20 36 20 63 6f 6d 70 61 72 69  at the 6 compari
ff00: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73 20 61 72  son operators ar
ff10: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  e consecutive in
ff20: 74 65 67 65 72 73 20 69 6e 20 74 68 69 73 0a 20  tegers in this. 
ff30: 20 2a 2a 20 6f 72 64 65 72 3a 20 20 4e 45 2c 20   ** order:  NE, 
ff40: 45 51 2c 20 47 54 2c 20 4c 45 2c 20 4c 54 2c 20  EQ, GT, LE, LT, 
ff50: 47 45 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  GE */.  assert( 
ff60: 4f 50 5f 45 71 3d 3d 4f 50 5f 4e 65 2b 31 20 29  OP_Eq==OP_Ne+1 )
ff70: 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47 74 3d  ; assert( OP_Gt=
ff80: 3d 4f 50 5f 4e 65 2b 32 20 29 3b 20 61 73 73 65  =OP_Ne+2 ); asse
ff90: 72 74 28 20 4f 50 5f 4c 65 3d 3d 4f 50 5f 4e 65  rt( OP_Le==OP_Ne
ffa0: 2b 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +3 );.  assert( 
ffb0: 4f 50 5f 4c 74 3d 3d 4f 50 5f 4e 65 2b 34 20 29  OP_Lt==OP_Ne+4 )
ffc0: 3b 20 61 73 73 65 72 74 28 20 4f 50 5f 47 65 3d  ; assert( OP_Ge=
ffd0: 3d 4f 50 5f 4e 65 2b 35 20 29 3b 0a 20 20 69 66  =OP_Ne+5 );.  if
ffe0: 28 20 72 65 73 3c 30 20 29 7b 20 20 20 20 20 20  ( res<0 ){      
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 20 20 2f 2a 20 6e 65 2c 20 65 71 2c 20 67 74 2c    /* ne, eq, gt,
10010 20 6c 65 2c 20 6c 74 2c 20 67 65 20 2a 2f 0a 20   le, lt, ge */. 
10020 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
10030 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4c  unsigned char aL
10040 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30 2c 20  Tb[] = { 1,  0, 
10050 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 30 20 7d   0,  1,  1,  0 }
10060 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 4c 54  ;.    res2 = aLT
10070 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20  b[pOp->opcode - 
10080 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65 20  OP_Ne];.  }else 
10090 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
100a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
100b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 45 51  nsigned char aEQ
100c0 62 5b 5d 20 3d 20 7b 20 30 2c 20 20 31 2c 20 20  b[] = { 0,  1,  
100d0 30 2c 20 20 31 2c 20 20 30 2c 20 20 31 20 7d 3b  0,  1,  0,  1 };
100e0 0a 20 20 20 20 72 65 73 32 20 3d 20 61 45 51 62  .    res2 = aEQb
100f0 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d 20 4f  [pOp->opcode - O
10100 50 5f 4e 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  P_Ne];.  }else{.
10110 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10120 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
10130 47 54 62 5b 5d 20 3d 20 7b 20 31 2c 20 20 30 2c  GTb[] = { 1,  0,
10140 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 31 20    1,  0,  0,  1 
10150 7d 3b 0a 20 20 20 20 72 65 73 32 20 3d 20 61 47  };.    res2 = aG
10160 54 62 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 2d  Tb[pOp->opcode -
10170 20 4f 50 5f 4e 65 5d 3b 0a 20 20 7d 0a 0a 20 20   OP_Ne];.  }..  
10180 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61 6e  /* Undo any chan
10190 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70 6c  ges made by appl
101a0 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20 74  yAffinity() to t
101b0 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65  he input registe
101c0 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rs. */.  assert(
101d0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
101e0 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c 61  MEM_Dyn) == (fla
101f0 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20 29  gs1 & MEM_Dyn) )
10200 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20  ;.  pIn1->flags 
10210 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73 73 65  = flags1;.  asse
10220 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73  rt( (pIn3->flags
10230 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28   & MEM_Dyn) == (
10240 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44 79 6e  flags3 & MEM_Dyn
10250 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c 61  ) );.  pIn3->fla
10260 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a 20 20  gs = flags3;..  
10270 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51  if( pOp->p5 & SQ
10280 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a  LITE_STOREP2 ){.
10290 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d      pOut = &aMem
102a0 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 69  [pOp->p2];.    i
102b0 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b 0a 20  Compare = res;. 
102c0 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20     if( (pOp->p5 
102d0 26 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55 4c  & SQLITE_KEEPNUL
102e0 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  L)!=0 ){.      /
102f0 2a 20 54 68 65 20 4b 45 45 50 4e 55 4c 4c 20 66  * The KEEPNULL f
10300 6c 61 67 20 70 72 65 76 65 6e 74 73 20 4f 50 5f  lag prevents OP_
10310 45 71 20 66 72 6f 6d 20 6f 76 65 72 77 72 69 74  Eq from overwrit
10320 69 6e 67 20 61 20 4e 55 4c 4c 20 77 69 74 68 20  ing a NULL with 
10330 31 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70  1.      ** and p
10340 72 65 76 65 6e 74 73 20 4f 50 5f 4e 65 20 66 72  revents OP_Ne fr
10350 6f 6d 20 6f 76 65 72 77 72 69 74 69 6e 67 20 4e  om overwriting N
10360 55 4c 4c 20 77 69 74 68 20 30 2e 20 20 54 68 69  ULL with 0.  Thi
10370 73 20 66 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  s flag.      ** 
10380 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 6e 20  is only used in 
10390 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 65  contexts where e
103a0 69 74 68 65 72 3a 0a 20 20 20 20 20 20 2a 2a 20  ither:.      ** 
103b0 20 20 28 31 29 20 6f 70 3d 3d 4f 50 5f 45 71 20    (1) op==OP_Eq 
103c0 26 26 20 28 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20  && (r[P2]==NULL 
103d0 7c 7c 20 72 5b 50 32 5d 3d 3d 30 29 0a 20 20 20  || r[P2]==0).   
103e0 20 20 20 2a 2a 20 20 20 28 32 29 20 6f 70 3d 3d     **   (2) op==
103f0 4f 50 5f 4e 65 20 26 26 20 28 72 5b 50 32 5d 3d  OP_Ne && (r[P2]=
10400 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d  =NULL || r[P2]==
10410 31 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  1).      ** Ther
10420 65 66 6f 72 65 20 69 74 20 69 73 20 6e 6f 74 20  efore it is not 
10430 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 68 65  necessary to che
10440 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ck the content o
10450 66 20 72 5b 50 32 5d 20 66 6f 72 0a 20 20 20 20  f r[P2] for.    
10460 20 20 2a 2a 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20    ** NULL. */.  
10470 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
10480 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 7c  >opcode==OP_Ne |
10490 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  | pOp->opcode==O
104a0 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Eq );.      as
104b0 73 65 72 74 28 20 72 65 73 32 3d 3d 30 20 7c 7c  sert( res2==0 ||
104c0 20 72 65 73 32 3d 3d 31 20 29 3b 0a 20 20 20 20   res2==1 );.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 32    testcase( res2
104e0 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70 63 6f  ==0 && pOp->opco
104f0 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20  de==OP_Eq );.   
10500 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73     testcase( res
10510 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f 70 63  2==1 && pOp->opc
10520 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  ode==OP_Eq );.  
10530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
10540 73 32 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 6f 70  s2==0 && pOp->op
10550 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  code==OP_Ne );. 
10560 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
10570 65 73 32 3d 3d 31 20 26 26 20 70 4f 70 2d 3e 6f  es2==1 && pOp->o
10580 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  pcode==OP_Ne );.
10590 20 20 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e        if( (pOp->
105a0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 29 3d 3d  opcode==OP_Eq)==
105b0 72 65 73 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  res2 ) break;.  
105c0 20 20 7d 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74    }.    memAbout
105d0 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74  ToChange(p, pOut
105e0 29 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70  );.    MemSetTyp
105f0 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f  eFlag(pOut, MEM_
10600 49 6e 74 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  Int);.    pOut->
10610 75 2e 69 20 3d 20 72 65 73 32 3b 0a 20 20 20 20  u.i = res2;.    
10620 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
10630 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
10640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
10650 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
10660 3d 30 2c 20 28 70 4f 70 2d 3e 70 35 20 26 20 53  =0, (pOp->p5 & S
10670 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3f 32 3a  QLITE_NULLEQ)?2:
10680 33 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 32  3);.    if( res2
10690 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a   ){.      goto j
106a0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 7d  ump_to_p2;.    }
106b0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
106c0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 45 6c 73 65  ./* Opcode: Else
106d0 4e 6f 74 45 71 20 2a 20 50 32 20 2a 20 2a 20 2a  NotEq * P2 * * *
106e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
106f0 64 65 20 6d 75 73 74 20 69 6d 6d 65 64 69 61 74  de must immediat
10700 65 6c 79 20 66 6f 6c 6c 6f 77 20 61 6e 20 4f 50  ely follow an OP
10710 5f 4c 74 20 6f 72 20 4f 50 5f 47 74 20 63 6f 6d  _Lt or OP_Gt com
10720 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
10730 2e 0a 2a 2a 20 49 66 20 72 65 73 75 6c 74 20 6f  ..** If result o
10740 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d 70 61  f an OP_Eq compa
10750 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 73 61 6d  rison on the sam
10760 65 20 74 77 6f 20 6f 70 65 72 61 6e 64 73 0a 2a  e two operands.*
10770 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 20  * would have be 
10780 4e 55 4c 4c 20 6f 72 20 66 61 6c 73 65 20 28 30  NULL or false (0
10790 29 2c 20 74 68 65 6e 20 74 68 65 6e 20 6a 75 6d  ), then then jum
107a0 70 20 74 6f 20 50 32 2e 20 0a 2a 2a 20 49 66 20  p to P2. .** If 
107b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  the result of an
107c0 20 4f 50 5f 45 71 20 63 6f 6d 70 61 72 69 73 6f   OP_Eq compariso
107d0 6e 20 6f 6e 20 74 68 65 20 74 77 6f 20 70 72 65  n on the two pre
107e0 76 69 6f 75 73 20 6f 70 65 72 61 6e 64 73 0a 2a  vious operands.*
107f0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
10800 6e 20 74 72 75 65 20 28 31 29 2c 20 74 68 65 6e  n true (1), then
10810 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
10820 2f 0a 63 61 73 65 20 4f 50 5f 45 6c 73 65 4e 6f  /.case OP_ElseNo
10830 74 45 71 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20  tEq: {       /* 
10840 73 61 6d 65 20 61 73 20 54 4b 5f 45 53 43 41 50  same as TK_ESCAP
10850 45 2c 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73  E, jump */.  ass
10860 65 72 74 28 20 70 4f 70 3e 61 4f 70 20 29 3b 0a  ert( pOp>aOp );.
10870 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
10880 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4c 74 20  ].opcode==OP_Lt 
10890 7c 7c 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  || pOp[-1].opcod
108a0 65 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73  e==OP_Gt );.  as
108b0 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 35  sert( pOp[-1].p5
108c0 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50   & SQLITE_STOREP
108d0 32 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63  2 );.  VdbeBranc
108e0 68 54 61 6b 65 6e 28 69 43 6f 6d 70 61 72 65 21  hTaken(iCompare!
108f0 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 69 43  =0, 2);.  if( iC
10900 6f 6d 70 61 72 65 21 3d 30 20 29 20 67 6f 74 6f  ompare!=0 ) goto
10910 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62   jump_to_p2;.  b
10920 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63  reak;.}.../* Opc
10930 6f 64 65 3a 20 50 65 72 6d 75 74 61 74 69 6f 6e  ode: Permutation
10940 20 2a 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a   * * * P4 *.**.*
10950 2a 20 53 65 74 20 74 68 65 20 70 65 72 6d 75 74  * Set the permut
10960 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  ation used by th
10970 65 20 4f 50 5f 43 6f 6d 70 61 72 65 20 6f 70 65  e OP_Compare ope
10980 72 61 74 6f 72 20 69 6e 20 74 68 65 20 6e 65 78  rator in the nex
10990 74 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e  t.** instruction
109a0 2e 20 20 54 68 65 20 70 65 72 6d 75 74 61 74 69  .  The permutati
109b0 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  on is stored in 
109c0 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 2e 0a  the P4 operand..
109d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d 75 74  **.** The permut
109e0 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ation is only va
109f0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65  lid until the ne
10a00 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20 74 68  xt OP_Compare th
10a10 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20 4f 50  at has.** the OP
10a20 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74  FLAG_PERMUTE bit
10a30 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79 70 69   set in P5. Typi
10a40 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50 65 72  cally the OP_Per
10a50 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mutation should 
10a60 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65 64 69  .** occur immedi
10a70 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f 20 74  ately prior to t
10a80 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e 0a 2a  he OP_Compare..*
10a90 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 69  *.** The first i
10aa0 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 50 34  nteger in the P4
10ab0 20 69 6e 74 65 67 65 72 20 61 72 72 61 79 20 69   integer array i
10ac0 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  s the length of 
10ad0 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 61 6e 64  the array.** and
10ae0 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f 6d 65   does not become
10af0 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 65 72   part of the per
10b00 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  mutation..*/.cas
10b10 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  e OP_Permutation
10b20 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  : {.  assert( pO
10b30 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
10b40 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73 73 65  TARRAY );.  asse
10b50 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69 20 29  rt( pOp->p4.ai )
10b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
10b70 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  1].opcode==OP_Co
10b80 6d 70 61 72 65 20 29 3b 0a 20 20 61 73 73 65 72  mpare );.  asser
10b90 74 28 20 70 4f 70 5b 31 5d 2e 70 35 20 26 20 4f  t( pOp[1].p5 & O
10ba0 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 29 3b  PFLAG_PERMUTE );
10bb0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
10bc0 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20  Opcode: Compare 
10bd0 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
10be0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31  * Synopsis: r[P1
10bf0 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33  @P3] <-> r[P2@P3
10c00 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ].**.** Compare 
10c10 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
10c20 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
10c30 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
10c40 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
10c50 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
10c60 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
10c70 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
10c80 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
10c90 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
10ca0 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
10cb0 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
10cc0 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
10cd0 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
10ce0 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
10cf0 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
10d00 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72   order of compar
10d10 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72  ison is.** deter
10d20 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  mined by the mos
10d30 74 20 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d  t recent OP_Perm
10d40 75 74 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  utation operator
10d50 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46  .  If the.** OPF
10d60 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
10d70 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72  is clear, then r
10d80 65 67 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70  egister are comp
10d90 61 72 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69  ared in sequenti
10da0 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a  al.** order..**.
10db0 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e  ** P4 is a KeyIn
10dc0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
10dd0 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74  t defines collat
10de0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e  ing sequences an
10df0 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73  d sort.** orders
10e00 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
10e10 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74  son.  The permut
10e20 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f  ation applies to
10e30 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e   registers.** on
10e40 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ly.  The KeyInfo
10e50 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73   elements are us
10e60 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e  ed sequentially.
10e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
10e80 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20  rison is a sort 
10e90 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e  comparison, so N
10ea0 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75  ULLs compare equ
10eb0 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65  al,.** NULLs are
10ec0 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65   less than numbe
10ed0 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  rs, numbers are 
10ee0 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67  less than string
10ef0 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67  s,.** and string
10f00 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
10f10 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  blobs..*/.case O
10f20 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69  P_Compare: {.  i
10f30 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
10f40 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70   int p1;.  int p
10f50 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  2;.  const KeyIn
10f60 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
10f70 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53  int idx;.  CollS
10f80 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
10f90 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
10fa0 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68  nce to use on th
10fb0 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  is term */.  int
10fc0 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
10fd0 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43  /* True for DESC
10fe0 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65  ENDING sort orde
10ff0 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  r */.  int *aPer
11000 6d 75 74 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  mute;     /* The
11010 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 2a 2f 0a   permutation */.
11020 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20  .  if( (pOp->p5 
11030 26 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  & OPFLAG_PERMUTE
11040 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 50 65 72  )==0 ){.    aPer
11050 6d 75 74 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  mute = 0;.  }els
11060 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11070 4f 70 3e 61 4f 70 20 29 3b 0a 20 20 20 20 61 73  Op>aOp );.    as
11080 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
11090 63 6f 64 65 3d 3d 4f 50 5f 50 65 72 6d 75 74 61  code==OP_Permuta
110a0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 61 73 73 65  tion );.    asse
110b0 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 70 34 74 79  rt( pOp[-1].p4ty
110c0 70 65 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20  pe==P4_INTARRAY 
110d0 29 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 20  );.    aPermute 
110e0 3d 20 70 4f 70 5b 2d 31 5d 2e 70 34 2e 61 69 20  = pOp[-1].p4.ai 
110f0 2b 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  + 1;.    assert(
11100 20 61 50 65 72 6d 75 74 65 21 3d 30 20 29 3b 0a   aPermute!=0 );.
11110 20 20 7d 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70    }.  n = pOp->p
11120 33 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  3;.  pKeyInfo = 
11130 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
11140 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
11150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
11160 79 49 6e 66 6f 21 3d 30 20 29 3b 0a 20 20 70 31  yInfo!=0 );.  p1
11170 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 70 32   = pOp->p1;.  p2
11180 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 69 66 64   = pOp->p2;.#ifd
11190 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
111a0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
111b0 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6d 78 20  {.    int k, mx 
111c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
111d0 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69 66 28 20  ; k<n; k++) if( 
111e0 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d 78 20 29  aPermute[k]>mx )
111f0 20 6d 78 20 3d 20 61 50 65 72 6d 75 74 65 5b 6b   mx = aPermute[k
11200 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
11210 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c 3d 28 70  1>0 && p1+mx<=(p
11220 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
11230 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20  ursor)+1 );.    
11240 61 73 73 65 72 74 28 20 70 32 3e 30 20 26 26 20  assert( p2>0 && 
11250 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p2+mx<=(p->nMem+
11260 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b  1 - p->nCursor)+
11270 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1 );.  }else{.  
11280 20 20 61 73 73 65 72 74 28 20 70 31 3e 30 20 26    assert( p1>0 &
11290 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d  & p1+n<=(p->nMem
112a0 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
112b0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
112c0 28 20 70 32 3e 30 20 26 26 20 70 32 2b 6e 3c 3d  ( p2>0 && p2+n<=
112d0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
112e0 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
112f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11300 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20 20 66 6f  TE_DEBUG */.  fo
11310 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
11320 7b 0a 20 20 20 20 69 64 78 20 3d 20 61 50 65 72  {.    idx = aPer
11330 6d 75 74 65 20 3f 20 61 50 65 72 6d 75 74 65 5b  mute ? aPermute[
11340 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61 73 73 65  i] : i;.    asse
11350 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
11360 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29 20 29 3b  aMem[p1+idx]) );
11370 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d  .    assert( mem
11380 49 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 32  IsValid(&aMem[p2
11390 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 52 45  +idx]) );.    RE
113a0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 31 2b  GISTER_TRACE(p1+
113b0 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31 2b 69 64  idx, &aMem[p1+id
113c0 78 5d 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45  x]);.    REGISTE
113d0 52 5f 54 52 41 43 45 28 70 32 2b 69 64 78 2c 20  R_TRACE(p2+idx, 
113e0 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d 29 3b 0a  &aMem[p2+idx]);.
113f0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 4b      assert( i<pK
11400 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
11410 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  d );.    pColl =
11420 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
11430 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  [i];.    bRev = 
11440 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
11450 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f  rder[i];.    iCo
11460 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  mpare = sqlite3M
11470 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b  emCompare(&aMem[
11480 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70  p1+idx], &aMem[p
11490 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a  2+idx], pColl);.
114a0 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65      if( iCompare
114b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 52   ){.      if( bR
114c0 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20 3d 20  ev ) iCompare = 
114d0 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  -iCompare;.     
114e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
114f0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
11500 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31   Opcode: Jump P1
11510 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
11520 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69 6e 73   Jump to the ins
11530 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72  truction at addr
11540 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72 20 50  ess P1, P2, or P
11550 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  3 depending on w
11560 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65  hether.** in the
11570 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f   most recent OP_
11580 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75 63 74  Compare instruct
11590 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63 74 6f  ion the P1 vecto
115a0 72 20 77 61 73 20 6c 65 73 73 20 74 68 61 6e 0a  r was less than.
115b0 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
115c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
115d0 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65 73 70   P2 vector, resp
115e0 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73  ectively..*/.cas
115f0 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20  e OP_Jump: {    
11600 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
11610 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d 70 61   */.  if( iCompa
11620 72 65 3c 30 20 29 7b 0a 20 20 20 20 56 64 62 65  re<0 ){.    Vdbe
11630 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29  BranchTaken(0,3)
11640 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70  ; pOp = &aOp[pOp
11650 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c  ->p1 - 1];.  }el
11660 73 65 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d  se if( iCompare=
11670 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  =0 ){.    VdbeBr
11680 61 6e 63 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20  anchTaken(1,3); 
11690 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e  pOp = &aOp[pOp->
116a0 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65  p2 - 1];.  }else
116b0 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
116c0 54 61 6b 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20  Taken(2,3); pOp 
116d0 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d  = &aOp[pOp->p3 -
116e0 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   1];.  }.  break
116f0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
11700 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
11710 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
11720 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b  P3]=(r[P1] && r[
11730 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
11740 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20  the logical AND 
11750 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
11760 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
11770 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74  d P2 and.** writ
11780 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74  e the result int
11790 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
117a0 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
117b0 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61  1 or P2 is 0 (fa
117c0 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65  lse) then the re
117d0 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69  sult is 0 even i
117e0 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69  f.** the other i
117f0 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
11800 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f   NULL and true o
11810 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65  r two NULLs give
11820 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75  .** a NULL outpu
11830 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t..*/./* Opcode:
11840 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a   Or P1 P2 P3 * *
11850 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
11860 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b  P3]=(r[P1] || r[
11870 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
11880 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f  the logical OR o
11890 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
118a0 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
118b0 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
118c0 74 68 65 20 61 6e 73 77 65 72 20 69 6e 20 72 65  the answer in re
118d0 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
118e0 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
118f0 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28   P2 is nonzero (
11900 74 72 75 65 29 20 74 68 65 6e 20 74 68 65 20 72  true) then the r
11910 65 73 75 6c 74 20 69 73 20 31 20 28 74 72 75 65  esult is 1 (true
11920 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ).** even if the
11930 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
11940 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
11950 64 20 66 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e  d false or two N
11960 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e  ULLs.** give a N
11970 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63  ULL output..*/.c
11980 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20  ase OP_And:     
11990 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
119a0 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c   as TK_AND, in1,
119b0 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
119c0 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20  se OP_Or: {     
119d0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
119e0 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69  as TK_OR, in1, i
119f0 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e  n2, out3 */.  in
11a00 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74  t v1;    /* Left
11a10 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41   operand:  0==FA
11a20 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
11a30 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
11a40 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b 20 20 20   */.  int v2;   
11a50 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
11a60 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  d: 0==FALSE, 1==
11a70 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
11a80 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 76   or NULL */..  v
11a90 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 42  1 = sqlite3VdbeB
11aa0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26 61 4d 65  ooleanValue(&aMe
11ab0 6d 5b 70 4f 70 2d 3e 70 31 5d 2c 20 32 29 3b 0a  m[pOp->p1], 2);.
11ac0 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 64    v2 = sqlite3Vd
11ad0 62 65 42 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 26  beBooleanValue(&
11ae0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 2c 20 32  aMem[pOp->p2], 2
11af0 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  );.  if( pOp->op
11b00 63 6f 64 65 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a  code==OP_And ){.
11b10 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
11b20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
11b30 6e 64 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30  nd_logic[] = { 0
11b40 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 32 2c  , 0, 0, 0, 1, 2,
11b50 20 30 2c 20 32 2c 20 32 20 7d 3b 0a 20 20 20 20   0, 2, 2 };.    
11b60 76 31 20 3d 20 61 6e 64 5f 6c 6f 67 69 63 5b 76  v1 = and_logic[v
11b70 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 65 6c 73 65  1*3+v2];.  }else
11b80 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
11b90 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11ba0 20 6f 72 5f 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20   or_logic[] = { 
11bb0 30 2c 20 31 2c 20 32 2c 20 31 2c 20 31 2c 20 31  0, 1, 2, 1, 1, 1
11bc0 2c 20 32 2c 20 31 2c 20 32 20 7d 3b 0a 20 20 20  , 2, 1, 2 };.   
11bd0 20 76 31 20 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76   v1 = or_logic[v
11be0 31 2a 33 2b 76 32 5d 3b 0a 20 20 7d 0a 20 20 70  1*3+v2];.  }.  p
11bf0 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
11c00 3e 70 33 5d 3b 0a 20 20 69 66 28 20 76 31 3d 3d  >p3];.  if( v1==
11c10 32 20 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  2 ){.    MemSetT
11c20 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45  ypeFlag(pOut, ME
11c30 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  M_Null);.  }else
11c40 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  {.    pOut->u.i 
11c50 3d 20 76 31 3b 0a 20 20 20 20 4d 65 6d 53 65 74  = v1;.    MemSet
11c60 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d  TypeFlag(pOut, M
11c70 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 0a 20 20 62  EM_Int);.  }.  b
11c80 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
11c90 64 65 3a 20 49 73 54 72 75 65 20 50 31 20 50 32  de: IsTrue P1 P2
11ca0 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
11cb0 70 73 69 73 3a 20 72 5b 50 32 5d 20 3d 20 63 6f  psis: r[P2] = co
11cc0 61 6c 65 73 63 65 28 72 5b 50 31 5d 3d 3d 54 52  alesce(r[P1]==TR
11cd0 55 45 2c 50 33 29 20 5e 20 50 34 0a 2a 2a 0a 2a  UE,P3) ^ P4.**.*
11ce0 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 6d  * This opcode im
11cf0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 49 53 20  plements the IS 
11d00 54 52 55 45 2c 20 49 53 20 46 41 4c 53 45 2c 20  TRUE, IS FALSE, 
11d10 49 53 20 4e 4f 54 20 54 52 55 45 2c 20 61 6e 64  IS NOT TRUE, and
11d20 0a 2a 2a 20 49 53 20 4e 4f 54 20 46 41 4c 53 45  .** IS NOT FALSE
11d30 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   operators..**.*
11d40 2a 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20  * Interpret the 
11d50 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
11d60 72 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61  r P1 as a boolea
11d70 6e 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20  n value.  Store 
11d80 74 68 61 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  that.** boolean 
11d90 28 61 20 30 20 6f 72 20 31 29 20 69 6e 20 72 65  (a 0 or 1) in re
11da0 67 69 73 74 65 72 20 50 32 2e 20 20 4f 72 20 69  gister P2.  Or i
11db0 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  f the value in r
11dc0 65 67 69 73 74 65 72 20 50 31 20 69 73 20 0a 2a  egister P1 is .*
11dd0 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  * NULL, then the
11de0 20 50 33 20 69 73 20 73 74 6f 72 65 64 20 69 6e   P3 is stored in
11df0 20 72 65 67 69 73 74 65 72 20 50 32 2e 20 20 49   register P2.  I
11e00 6e 76 65 72 74 20 74 68 65 20 61 6e 73 77 65 72  nvert the answer
11e10 20 69 66 20 50 34 0a 2a 2a 20 69 73 20 31 2e 0a   if P4.** is 1..
11e20 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 67 69 63 20  **.** The logic 
11e30 69 73 20 73 75 6d 6d 61 72 69 7a 65 64 20 6c 69  is summarized li
11e40 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 3c  ke this:.**.** <
11e50 75 6c 3e 20 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20  ul> .** <li> If 
11e60 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d 3d 30 20  P3==0 and P4==0 
11e70 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20   then  r[P2] := 
11e80 72 5b 50 31 5d 20 49 53 20 54 52 55 45 0a 2a 2a  r[P1] IS TRUE.**
11e90 20 3c 6c 69 3e 20 49 66 20 50 33 3d 3d 31 20 61   <li> If P3==1 a
11ea0 6e 64 20 50 34 3d 3d 31 20 20 74 68 65 6e 20 20  nd P4==1  then  
11eb0 72 5b 50 32 5d 20 3a 3d 20 72 5b 50 31 5d 20 49  r[P2] := r[P1] I
11ec0 53 20 46 41 4c 53 45 0a 2a 2a 20 3c 6c 69 3e 20  S FALSE.** <li> 
11ed0 49 66 20 50 33 3d 3d 30 20 61 6e 64 20 50 34 3d  If P3==0 and P4=
11ee0 3d 31 20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20  =1  then  r[P2] 
11ef0 3a 3d 20 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20  := r[P1] IS NOT 
11f00 54 52 55 45 0a 2a 2a 20 3c 6c 69 3e 20 49 66 20  TRUE.** <li> If 
11f10 50 33 3d 3d 31 20 61 6e 64 20 50 34 3d 3d 30 20  P3==1 and P4==0 
11f20 20 74 68 65 6e 20 20 72 5b 50 32 5d 20 3a 3d 20   then  r[P2] := 
11f30 72 5b 50 31 5d 20 49 53 20 4e 4f 54 20 46 41 4c  r[P1] IS NOT FAL
11f40 53 45 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2f 0a 63  SE.** </ul>.*/.c
11f50 61 73 65 20 4f 50 5f 49 73 54 72 75 65 3a 20 7b  ase OP_IsTrue: {
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f70 2a 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f 0a 20  * in1, out2 */. 
11f80 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
11f90 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29  type==P4_INT32 )
11fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
11fb0 3e 70 34 2e 69 3d 3d 30 20 7c 7c 20 70 4f 70 2d  >p4.i==0 || pOp-
11fc0 3e 70 34 2e 69 3d 3d 31 20 29 3b 0a 20 20 61 73  >p4.i==1 );.  as
11fd0 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3d 3d 30  sert( pOp->p3==0
11fe0 20 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 31 20 29   || pOp->p3==1 )
11ff0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
12000 65 6d 53 65 74 49 6e 74 36 34 28 26 61 4d 65 6d  emSetInt64(&aMem
12010 5b 70 4f 70 2d 3e 70 32 5d 2c 0a 20 20 20 20 20  [pOp->p2],.     
12020 20 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c   sqlite3VdbeBool
12030 65 61 6e 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70  eanValue(&aMem[p
12040 4f 70 2d 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33  Op->p1], pOp->p3
12050 29 20 5e 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  ) ^ pOp->p4.i);.
12060 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
12070 70 63 6f 64 65 3a 20 4e 6f 74 20 50 31 20 50 32  pcode: Not P1 P2
12080 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
12090 69 73 3a 20 72 5b 50 32 5d 3d 20 21 72 5b 50 31  is: r[P2]= !r[P1
120a0 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ].**.** Interpre
120b0 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  t the value in r
120c0 65 67 69 73 74 65 72 20 50 31 20 61 73 20 61 20  egister P1 as a 
120d0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20 20  boolean value.  
120e0 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 62 6f 6f  Store the.** boo
120f0 6c 65 61 6e 20 63 6f 6d 70 6c 65 6d 65 6e 74 20  lean complement 
12100 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  in register P2. 
12110 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e   If the value in
12120 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20   register P1 is 
12130 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 61  .** NULL, then a
12140 20 4e 55 4c 4c 20 69 73 20 73 74 6f 72 65 64 20   NULL is stored 
12150 69 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f  in P2..*/.case O
12160 50 5f 4e 6f 74 3a 20 7b 20 20 20 20 20 20 20 20  P_Not: {        
12170 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
12180 61 73 20 54 4b 5f 4e 4f 54 2c 20 69 6e 31 2c 20  as TK_NOT, in1, 
12190 6f 75 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d  out2 */.  pIn1 =
121a0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
121b0 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b  .  pOut = &aMem[
121c0 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 69 66 28 20  pOp->p2];.  if( 
121d0 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn1->flags & M
121e0 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20  EM_Null)==0 ){. 
121f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
12200 6d 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20  mSetInt64(pOut, 
12210 21 73 71 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c  !sqlite3VdbeBool
12220 65 61 6e 56 61 6c 75 65 28 70 49 6e 31 2c 30 29  eanValue(pIn1,0)
12230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12240 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
12250 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20 20 7d  tNull(pOut);.  }
12260 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12270 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20 50  Opcode: BitNot P
12280 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
12290 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20 7e  nopsis: r[P1]= ~
122a0 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74 65  r[P1].**.** Inte
122b0 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65 6e  rpret the conten
122c0 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  t of register P1
122d0 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   as an integer. 
122e0 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f 6e   Store the.** on
122f0 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66  es-complement of
12300 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69 6e   the P1 value in
12310 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  to register P2. 
12320 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a 20   If P1 holds.** 
12330 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f 72  a NULL then stor
12340 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e 0a  e a NULL in P2..
12350 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e 6f  */.case OP_BitNo
12360 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
12370 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 42   /* same as TK_B
12380 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32  ITNOT, in1, out2
12390 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
123a0 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
123b0 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  Out = &aMem[pOp-
123c0 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p2];.  sqlite3V
123d0 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f  dbeMemSetNull(pO
123e0 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  ut);.  if( (pIn1
123f0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
12400 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  ll)==0 ){.    pO
12410 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  ut->flags = MEM_
12420 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75  Int;.    pOut->u
12430 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33 56 64 62  .i = ~sqlite3Vdb
12440 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 3b  eIntValue(pIn1);
12450 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
12460 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63 65  ./* Opcode: Once
12470 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a   P1 P2 * * *.**.
12480 2a 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  ** Fall through 
12490 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
124a0 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 72 73  ruction the firs
124b0 74 20 74 69 6d 65 20 74 68 69 73 20 6f 70 63 6f  t time this opco
124c0 64 65 20 69 73 0a 2a 2a 20 65 6e 63 6f 75 6e 74  de is.** encount
124d0 65 72 65 64 20 6f 6e 20 65 61 63 68 20 69 6e 76  ered on each inv
124e0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ocation of the b
124f0 79 74 65 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d  yte-code program
12500 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 0a 2a 2a  .  Jump to P2.**
12510 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   on the second a
12520 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
12530 74 20 65 6e 63 6f 75 6e 74 65 72 73 20 64 75 72  t encounters dur
12540 69 6e 67 20 74 68 65 20 73 61 6d 65 20 69 6e 76  ing the same inv
12550 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
12560 6f 70 2d 6c 65 76 65 6c 20 70 72 6f 67 72 61 6d  op-level program
12570 73 20 64 65 74 65 72 6d 69 6e 65 20 66 69 72 73  s determine firs
12580 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 62 79 20  t invocation by 
12590 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 50 31  comparing the P1
125a0 0a 2a 2a 20 6f 70 65 72 61 6e 64 20 61 67 61 69  .** operand agai
125b0 6e 73 74 20 74 68 65 20 50 31 20 6f 70 65 72 61  nst the P1 opera
125c0 6e 64 20 6f 6e 20 74 68 65 20 4f 50 5f 49 6e 69  nd on the OP_Ini
125d0 74 20 6f 70 63 6f 64 65 20 61 74 20 74 68 65 20  t opcode at the 
125e0 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 6f 66 20  beginning.** of 
125f0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 49 66  the program.  If
12600 20 74 68 65 20 50 31 20 76 61 6c 75 65 73 20 64   the P1 values d
12610 69 66 66 65 72 2c 20 74 68 65 6e 20 66 61 6c 6c  iffer, then fall
12620 20 74 68 72 6f 75 67 68 20 61 6e 64 20 6d 61 6b   through and mak
12630 65 0a 2a 2a 20 74 68 65 20 50 31 20 6f 66 20 74  e.** the P1 of t
12640 68 69 73 20 6f 70 63 6f 64 65 20 65 71 75 61 6c  his opcode equal
12650 20 74 6f 20 74 68 65 20 50 31 20 6f 66 20 4f 50   to the P1 of OP
12660 5f 49 6e 69 74 2e 20 20 49 66 20 50 31 20 76 61  _Init.  If P1 va
12670 6c 75 65 73 20 61 72 65 0a 2a 2a 20 74 68 65 20  lues are.** the 
12680 73 61 6d 65 20 74 68 65 6e 20 74 61 6b 65 20 74  same then take t
12690 68 65 20 6a 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 46  he jump..**.** F
126a0 6f 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2c 20  or subprograms, 
126b0 74 68 65 72 65 20 69 73 20 61 20 62 69 74 6d 61  there is a bitma
126c0 73 6b 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  sk in the VdbeFr
126d0 61 6d 65 20 74 68 61 74 20 64 65 74 65 72 6d 69  ame that determi
126e0 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
126f0 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 73  r not the jump s
12700 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 2e 20  hould be taken. 
12710 20 54 68 65 20 62 69 74 6d 61 73 6b 20 69 73 20   The bitmask is 
12720 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 62 65 63  necessary.** bec
12730 61 75 73 65 20 74 68 65 20 73 65 6c 66 2d 61 6c  ause the self-al
12740 74 65 72 69 6e 67 20 63 6f 64 65 20 74 72 69 63  tering code tric
12750 6b 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  k does not work 
12760 66 6f 72 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  for recursive.**
12770 20 74 72 69 67 67 65 72 73 2e 0a 2a 2f 0a 63 61   triggers..*/.ca
12780 73 65 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20  se OP_Once: {   
12790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
127a0 70 20 2a 2f 0a 20 20 75 33 32 20 69 41 64 64 72  p */.  u32 iAddr
127b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
127d0 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  his instruction 
127e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
127f0 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  aOp[0].opcode==O
12800 50 5f 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  P_Init );.  if( 
12810 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
12820 20 69 41 64 64 72 20 3d 20 28 69 6e 74 29 28 70   iAddr = (int)(p
12830 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 3b 0a 20 20  Op - p->aOp);.  
12840 20 20 69 66 28 20 28 70 2d 3e 70 46 72 61 6d 65    if( (p->pFrame
12850 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f 38 5d  ->aOnce[iAddr/8]
12860 20 26 20 28 31 3c 3c 28 69 41 64 64 72 20 26 20   & (1<<(iAddr & 
12870 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
12880 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
12890 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 67 6f  (1, 2);.      go
128a0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
128b0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 46 72 61     }.    p->pFra
128c0 6d 65 2d 3e 61 4f 6e 63 65 5b 69 41 64 64 72 2f  me->aOnce[iAddr/
128d0 38 5d 20 7c 3d 20 31 3c 3c 28 69 41 64 64 72 20  8] |= 1<<(iAddr 
128e0 26 20 37 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  & 7);.  }else{. 
128f0 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 30 5d     if( p->aOp[0]
12900 2e 70 31 3d 3d 70 4f 70 2d 3e 70 31 20 29 7b 0a  .p1==pOp->p1 ){.
12910 20 20 20 20 20 20 56 64 62 65 42 72 61 6e 63 68        VdbeBranch
12920 54 61 6b 65 6e 28 31 2c 20 32 29 3b 0a 20 20 20  Taken(1, 2);.   
12930 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
12940 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p2;.    }.  }.  
12950 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
12960 30 2c 20 32 29 3b 0a 20 20 70 4f 70 2d 3e 70 31  0, 2);.  pOp->p1
12970 20 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b   = p->aOp[0].p1;
12980 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
12990 4f 70 63 6f 64 65 3a 20 49 66 20 50 31 20 50 32  Opcode: If P1 P2
129a0 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75   P3 * *.**.** Ju
129b0 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
129c0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
129d0 72 20 50 31 20 69 73 20 74 72 75 65 2e 20 20 54  r P1 is true.  T
129e0 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 63  he value.** is c
129f0 6f 6e 73 69 64 65 72 65 64 20 74 72 75 65 20 69  onsidered true i
12a00 66 20 69 74 20 69 73 20 6e 75 6d 65 72 69 63 20  f it is numeric 
12a10 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49  and non-zero.  I
12a20 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69  f the value.** i
12a30 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65  n P1 is NULL the
12a40 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  n take the jump 
12a50 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50  if and only if P
12a60 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  3 is non-zero..*
12a70 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20 7b  /.case OP_If:  {
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a90 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
12aa0 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 73 71   int c;.  c = sq
12ab0 6c 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e  lite3VdbeBoolean
12ac0 56 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d  Value(&aMem[pOp-
12ad0 3e 70 31 5d 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a  >p1], pOp->p3);.
12ae0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
12af0 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66  n(c!=0, 2);.  if
12b00 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ( c ) goto jump_
12b10 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
12b20 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
12b30 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a  Not P1 P2 P3 * *
12b40 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50  .**.** Jump to P
12b50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  2 if the value i
12b60 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73  n register P1 is
12b70 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76 61 6c   False.  The val
12b80 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ue.** is conside
12b90 72 65 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  red false if it 
12ba0 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20 76 61  has a numeric va
12bb0 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20 49 66  lue of zero.  If
12bc0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69 6e   the value.** in
12bd0 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e   P1 is NULL then
12be0 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
12bf0 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 50 33  f and only if P3
12c00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f   is non-zero..*/
12c10 0a 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20  .case OP_IfNot: 
12c20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  {            /* 
12c30 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69  jump, in1 */.  i
12c40 6e 74 20 63 3b 0a 20 20 63 20 3d 20 21 73 71 6c  nt c;.  c = !sql
12c50 69 74 65 33 56 64 62 65 42 6f 6f 6c 65 61 6e 56  ite3VdbeBooleanV
12c60 61 6c 75 65 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  alue(&aMem[pOp->
12c70 70 31 5d 2c 20 21 70 4f 70 2d 3e 70 33 29 3b 0a  p1], !pOp->p3);.
12c80 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
12c90 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66  n(c!=0, 2);.  if
12ca0 28 20 63 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  ( c ) goto jump_
12cb0 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
12cc0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 73  }../* Opcode: Is
12cd0 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a  Null P1 P2 * * *
12ce0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66  .** Synopsis: if
12cf0 20 72 5b 50 31 5d 3d 3d 4e 55 4c 4c 20 67 6f 74   r[P1]==NULL got
12d00 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20  o P2.**.** Jump 
12d10 74 6f 20 50 32 20 69 66 20 74 68 65 20 76 61 6c  to P2 if the val
12d20 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
12d30 31 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61  1 is NULL..*/.ca
12d40 73 65 20 4f 50 5f 49 73 4e 75 6c 6c 3a 20 7b 20  se OP_IsNull: { 
12d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
12d60 6d 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 2c  me as TK_ISNULL,
12d70 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20   jump, in1 */.  
12d80 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
12d90 2d 3e 70 31 5d 3b 0a 20 20 56 64 62 65 42 72 61  ->p1];.  VdbeBra
12da0 6e 63 68 54 61 6b 65 6e 28 20 28 70 49 6e 31 2d  nchTaken( (pIn1-
12db0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
12dc0 6c 29 21 3d 30 2c 20 32 29 3b 0a 20 20 69 66 28  l)!=0, 2);.  if(
12dd0 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20   (pIn1->flags & 
12de0 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 20 29 7b 0a  MEM_Null)!=0 ){.
12df0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
12e00 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  _p2;.  }.  break
12e10 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
12e20 4e 6f 74 4e 75 6c 6c 20 50 31 20 50 32 20 2a 20  NotNull P1 P2 * 
12e30 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
12e40 20 69 66 20 72 5b 50 31 5d 21 3d 4e 55 4c 4c 20   if r[P1]!=NULL 
12e50 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 4a 75  goto P2.**.** Ju
12e60 6d 70 20 74 6f 20 50 32 20 69 66 20 74 68 65 20  mp to P2 if the 
12e70 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
12e80 72 20 50 31 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  r P1 is not NULL
12e90 2e 20 20 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  .  .*/.case OP_N
12ea0 6f 74 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  otNull: {       
12eb0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
12ec0 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 6a 75 6d 70  TK_NOTNULL, jump
12ed0 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20  , in1 */.  pIn1 
12ee0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
12ef0 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61  ;.  VdbeBranchTa
12f00 6b 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67  ken( (pIn1->flag
12f10 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
12f20 2c 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  , 2);.  if( (pIn
12f30 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12f40 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67  ull)==0 ){.    g
12f50 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
12f60 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12f70 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 4e 75 6c  /* Opcode: IfNul
12f80 6c 52 6f 77 20 50 31 20 50 32 20 50 33 20 2a 20  lRow P1 P2 P3 * 
12f90 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
12fa0 66 20 50 31 2e 6e 75 6c 6c 52 6f 77 20 74 68 65  f P1.nullRow the
12fb0 6e 20 72 5b 50 33 5d 3d 4e 55 4c 4c 2c 20 67 6f  n r[P3]=NULL, go
12fc0 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 43 68 65 63  to P2.**.** Chec
12fd0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20  k the cursor P1 
12fe0 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
12ff0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
13000 6e 67 20 61 74 20 61 20 4e 55 4c 4c 20 72 6f 77  ng at a NULL row
13010 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74  ..** If it is, t
13020 68 65 6e 20 73 65 74 20 72 65 67 69 73 74 65 72  hen set register
13030 20 50 33 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20   P3 to NULL and 
13040 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
13050 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 31   to P2..** If P1
13060 20 69 73 20 6e 6f 74 20 6f 6e 20 61 20 4e 55 4c   is not on a NUL
13070 4c 20 72 6f 77 2c 20 74 68 65 6e 20 66 61 6c 6c  L row, then fall
13080 20 74 68 72 6f 75 67 68 20 77 69 74 68 6f 75 74   through without
13090 20 6d 61 6b 69 6e 67 20 61 6e 79 0a 2a 2a 20 63   making any.** c
130a0 68 61 6e 67 65 73 2e 0a 2a 2f 0a 63 61 73 65 20  hanges..*/.case 
130b0 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 3a 20 7b 20  OP_IfNullRow: { 
130c0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
130d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
130e0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
130f0 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
13100 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
13110 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 21 3d 30 20  Csr[pOp->p1]!=0 
13120 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  );.  if( p->apCs
13130 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 6e 75 6c 6c  r[pOp->p1]->null
13140 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Row ){.    sqlit
13150 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
13160 28 61 4d 65 6d 20 2b 20 70 4f 70 2d 3e 70 33 29  (aMem + pOp->p3)
13170 3b 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f  ;.    goto jump_
13180 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65  to_p2;.  }.  bre
13190 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ak;.}..#ifdef SQ
131a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
131b0 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 20 4f  ET_SQL_FUNC./* O
131c0 70 63 6f 64 65 3a 20 4f 66 66 73 65 74 20 50 31  pcode: Offset P1
131d0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79   P2 P3 * *.** Sy
131e0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 20 3d 20  nopsis: r[P3] = 
131f0 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 28 50 31  sqlite_offset(P1
13200 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e  ).**.** Store in
13210 20 72 65 67 69 73 74 65 72 20 72 5b 50 33 5d 20   register r[P3] 
13220 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
13230 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
13240 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 74  e file that is t
13250 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  he.** start of t
13260 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  he payload for t
13270 68 65 20 72 65 63 6f 72 64 20 61 74 20 77 68 69  he record at whi
13280 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 50  ch that cursor P
13290 31 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  1 is currently.*
132a0 2a 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  * pointing..**.*
132b0 2a 20 50 32 20 69 73 20 74 68 65 20 63 6f 6c 75  * P2 is the colu
132c0 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  mn number for th
132d0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
132e0 65 20 73 71 6c 69 74 65 5f 6f 66 66 73 65 74 28  e sqlite_offset(
132f0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ) function..** T
13300 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
13310 6e 6f 74 20 75 73 65 20 50 32 20 69 74 73 65 6c  not use P2 itsel
13320 66 2c 20 62 75 74 20 74 68 65 20 50 32 20 76 61  f, but the P2 va
13330 6c 75 65 20 69 73 20 75 73 65 64 20 62 79 20 74  lue is used by t
13340 68 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72  he.** code gener
13350 61 74 6f 72 2e 20 20 54 68 65 20 50 31 2c 20 50  ator.  The P1, P
13360 32 2c 20 61 6e 64 20 50 33 20 6f 70 65 72 61 6e  2, and P3 operan
13370 64 73 20 74 6f 20 74 68 69 73 20 6f 70 63 6f 64  ds to this opcod
13380 65 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  e are the.** sam
13390 65 20 61 73 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  e as for OP_Colu
133a0 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  mn..**.** This o
133b0 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 61 76  pcode is only av
133c0 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74  ailable if SQLit
133d0 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
133e0 74 68 20 74 68 65 0a 2a 2a 20 2d 44 53 51 4c 49  th the.** -DSQLI
133f0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
13400 5f 53 51 4c 5f 46 55 4e 43 20 6f 70 74 69 6f 6e  _SQL_FUNC option
13410 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66  ..*/.case OP_Off
13420 73 65 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  set: {          
13430 2f 2a 20 6f 75 74 33 20 2a 2f 0a 20 20 56 64 62  /* out3 */.  Vdb
13440 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
13450 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
13460 6f 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  or */.  assert( 
13470 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
13480 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
13490 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
134a0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
134b0 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
134c0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
134d0 4e 45 56 45 52 28 70 43 3d 3d 30 29 20 7c 7c 20  NEVER(pC==0) || 
134e0 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
134f0 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20  RTYPE_BTREE ){. 
13500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
13510 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
13520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
13530 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e  ite3VdbeMemSetIn
13540 74 36 34 28 70 4f 75 74 2c 20 73 71 6c 69 74 65  t64(pOut, sqlite
13550 33 42 74 72 65 65 4f 66 66 73 65 74 28 70 43 2d  3BtreeOffset(pC-
13560 3e 75 63 2e 70 43 75 72 73 6f 72 29 29 3b 0a 20  >uc.pCursor));. 
13570 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
13580 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13590 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
135a0 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  _FUNC */../* Opc
135b0 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
135c0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
135d0 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 50 58  nopsis: r[P3]=PX
135e0 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
135f0 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 63   the data that c
13600 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20  ursor P1 points 
13610 74 6f 20 61 73 20 61 20 73 74 72 75 63 74 75 72  to as a structur
13620 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  e built using.**
13630 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
13640 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53  instruction.  (S
13650 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ee the MakeRecor
13660 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  d opcode for add
13670 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
13680 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
13690 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64   format of the d
136a0 61 74 61 2e 29 20 20 45 78 74 72 61 63 74 20 74  ata.)  Extract t
136b0 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a  he P2-th column.
136c0 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63  ** from this rec
136d0 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65 20 61  ord.  If there a
136e0 72 65 20 6c 65 73 73 20 74 68 61 74 20 28 50 32  re less that (P2
136f0 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69  +1) .** values i
13700 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78  n the record, ex
13710 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a  tract a NULL..**
13720 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78  .** The value ex
13730 74 72 61 63 74 65 64 20 69 73 20 73 74 6f 72 65  tracted is store
13740 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
13750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
13760 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 73 20 66  ecord contains f
13770 65 77 65 72 20 74 68 61 6e 20 50 32 20 66 69 65  ewer than P2 fie
13780 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63  lds, then extrac
13790 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a  t a NULL.  Or,.*
137a0 2a 20 69 66 20 74 68 65 20 50 34 20 61 72 67 75  * if the P4 argu
137b0 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d  ment is a P4_MEM
137c0 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f   use the value o
137d0 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
137e0 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  t as.** the resu
137f0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
13800 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
13810 48 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e  HE bit is set on
13820 20 50 35 20 61 6e 64 20 50 31 20 69 73 20 61 20   P5 and P1 is a 
13830 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72  pseudo-table cur
13840 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sor,.** then the
13850 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
13860 72 73 6f 72 20 69 73 20 72 65 73 65 74 20 70 72  rsor is reset pr
13870 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74 69 6e  ior to extractin
13880 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  g the column..**
13890 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f 43 6f   The first OP_Co
138a0 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61 20 70  lumn against a p
138b0 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66 74 65  seudo-table afte
138c0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  r the value of t
138d0 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65  he content.** re
138e0 67 69 73 74 65 72 20 68 61 73 20 63 68 61 6e 67  gister has chang
138f0 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  ed should have t
13900 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a 2a 0a  his bit set..**.
13910 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
13920 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64 20 4f  _LENGTHARG and O
13930 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
13940 62 69 74 73 20 61 72 65 20 73 65 74 20 6f 6e 20  bits are set on 
13950 50 35 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 72  P5 then.** the r
13960 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
13970 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65 20 75  eed to only be u
13980 73 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  sed as the argum
13990 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74 68 28  ent of a length(
139a0 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66 28 29  ).** or typeof()
139b0 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73 70 65   function, respe
139c0 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 6c 6f  ctively.  The lo
139d0 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65 20 62  ading of large b
139e0 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a 20 73  lobs can be.** s
139f0 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e 67 74  kipped for lengt
13a00 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f 6e 74  h() and all cont
13a10 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61 6e 20  ent loading can 
13a20 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72 20 74  be skipped for t
13a30 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61 73 65  ypeof()..*/.case
13a40 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
13a50 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
13a60 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
13a70 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
13a80 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
13a90 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
13aa0 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
13ab0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
13ac0 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
13ad0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20  cursor */.  u32 
13ae0 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  *aOffset;      /
13af0 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20  * aOffset[i] is 
13b00 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  offset to start 
13b10 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68  of data for i-th
13b20 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
13b30 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
13b40 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  /* The length of
13b50 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
13b60 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c  data for the col
13b70 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  umn */.  int i; 
13b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13b90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13ba0 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20   Mem *pDest;    
13bb0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13bc0 77 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63  write the extrac
13bd0 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  ted value */.  M
13be0 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20  em sMem;        
13bf0 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67    /* For storing
13c00 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
13c10 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63  g decoded */.  c
13c20 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 20  onst u8 *zData; 
13c30 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65    /* Part of the
13c40 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
13c50 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
13c60 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20 2f 2a   u8 *zHdr;    /*
13c70 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64 20 62   Next unparsed b
13c80 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
13c90 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  r */.  const u8 
13ca0 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50 6f 69  *zEndHdr; /* Poi
13cb0 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 62 79  nter to first by
13cc0 74 65 20 61 66 74 65 72 20 74 68 65 20 68 65 61  te after the hea
13cd0 64 65 72 20 2a 2f 0a 20 20 75 36 34 20 6f 66 66  der */.  u64 off
13ce0 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a 20 36  set64;      /* 6
13cf0 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a 2f 0a  4-bit offset */.
13d00 20 20 75 33 32 20 74 3b 20 20 20 20 20 20 20 20    u32 t;        
13d10 20 20 20 20 20 2f 2a 20 41 20 74 79 70 65 20 63       /* A type c
13d20 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 72 65 63  ode from the rec
13d30 6f 72 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ord header */.  
13d40 4d 65 6d 20 2a 70 52 65 67 3b 20 20 20 20 20 20  Mem *pReg;      
13d50 20 20 20 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c     /* PseudoTabl
13d60 65 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72  e input register
13d70 20 2a 2f 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61   */..  pC = p->a
13d80 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
13d90 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 0a   p2 = pOp->p2;..
13da0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
13db0 6f 72 20 63 61 63 68 65 20 69 73 20 73 74 61 6c  or cache is stal
13dc0 65 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73  e (meaning it is
13dd0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 70   not currently p
13de0 6f 69 6e 74 20 61 74 0a 20 20 2a 2a 20 74 68 65  oint at.  ** the
13df0 20 63 6f 72 72 65 63 74 20 72 6f 77 29 20 74 68   correct row) th
13e00 65 6e 20 62 72 69 6e 67 20 69 74 20 75 70 2d 74  en bring it up-t
13e10 6f 2d 64 61 74 65 20 62 79 20 64 6f 69 6e 67 20  o-date by doing 
13e20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 20  the necessary . 
13e30 20 2a 2a 20 42 2d 54 72 65 65 20 73 65 65 6b 2e   ** B-Tree seek.
13e40 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
13e50 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
13e60 74 6f 28 26 70 43 2c 20 26 70 32 29 3b 0a 20 20  to(&pC, &p2);.  
13e70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
13e80 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
13e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ;..  assert( pOp
13ea0 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p3>0 && pOp->p
13eb0 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  3<=(p->nMem+1 - 
13ec0 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->nCursor) );. 
13ed0 20 70 44 65 73 74 20 3d 20 26 61 4d 65 6d 5b 70   pDest = &aMem[p
13ee0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p3];.  memAb
13ef0 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
13f00 44 65 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  Dest);.  assert(
13f10 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
13f20 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
13f30 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
13f40 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
13f50 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65 6c 64 20  ( p2<pC->nField 
13f60 29 3b 0a 20 20 61 4f 66 66 73 65 74 20 3d 20 70  );.  aOffset = p
13f70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20 20 61 73  C->aOffset;.  as
13f80 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
13f90 70 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42  pe!=CURTYPE_VTAB
13fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
13fb0 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 52 54  ->eCurType!=CURT
13fc0 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c 20 70 43  YPE_PSEUDO || pC
13fd0 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a 20 20 61  ->nullRow );.  a
13fe0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
13ff0 79 70 65 21 3d 43 55 52 54 59 50 45 5f 53 4f 52  ype!=CURTYPE_SOR
14000 54 45 52 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  TER );..  if( pC
14010 2d 3e 63 61 63 68 65 53 74 61 74 75 73 21 3d 70  ->cacheStatus!=p
14020 2d 3e 63 61 63 68 65 43 74 72 20 29 7b 20 20 20  ->cacheCtr ){   
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4f               /*O
14040 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d 46  PTIMIZATION-IF-F
14050 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALSE*/.    if( p
14060 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  C->nullRow ){.  
14070 20 20 20 20 69 66 28 20 70 43 2d 3e 65 43 75 72      if( pC->eCur
14080 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 50 53  Type==CURTYPE_PS
14090 45 55 44 4f 20 29 7b 0a 20 20 20 20 20 20 20 20  EUDO ){.        
140a0 2f 2a 20 46 6f 72 20 74 68 65 20 73 70 65 63 69  /* For the speci
140b0 61 6c 20 63 61 73 65 20 6f 66 20 61 73 20 70 73  al case of as ps
140c0 65 75 64 6f 2d 63 75 72 73 6f 72 2c 20 74 68 65  eudo-cursor, the
140d0 20 73 65 65 6b 52 65 73 75 6c 74 20 66 69 65 6c   seekResult fiel
140e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 64 65  d.        ** ide
140f0 6e 74 69 66 69 65 73 20 74 68 65 20 72 65 67 69  ntifies the regi
14100 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
14110 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
14120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14130 2d 3e 73 65 65 6b 52 65 73 75 6c 74 3e 30 20 29  ->seekResult>0 )
14140 3b 0a 20 20 20 20 20 20 20 20 70 52 65 67 20 3d  ;.        pReg =
14150 20 26 61 4d 65 6d 5b 70 43 2d 3e 73 65 65 6b 52   &aMem[pC->seekR
14160 65 73 75 6c 74 5d 3b 0a 20 20 20 20 20 20 20 20  esult];.        
14170 61 73 73 65 72 74 28 20 70 52 65 67 2d 3e 66 6c  assert( pReg->fl
14180 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
14190 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
141a0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65  ( memIsValid(pRe
141b0 67 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  g) );.        pC
141c0 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 3d 20  ->payloadSize = 
141d0 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 70 52 65 67  pC->szRow = pReg
141e0 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 2d  ->n;.        pC-
141f0 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29 70 52 65  >aRow = (u8*)pRe
14200 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  g->z;.      }els
14210 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14220 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
14230 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 20  (pDest);.       
14240 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f   goto op_column_
14250 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
14260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
14270 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75  rsr = pC->uc.pCu
14280 72 73 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65  rsor;.      asse
14290 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
142a0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
142b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
142c0 20 70 43 72 73 72 20 29 3b 0a 20 20 20 20 20 20   pCrsr );.      
142d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
142e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
142f0 64 28 70 43 72 73 72 29 20 29 3b 0a 20 20 20 20  d(pCrsr) );.    
14300 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a    pC->payloadSiz
14310 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
14320 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 72 73  PayloadSize(pCrs
14330 72 29 3b 0a 20 20 20 20 20 20 70 43 2d 3e 61 52  r);.      pC->aR
14340 6f 77 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ow = sqlite3Btre
14350 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 70 43  ePayloadFetch(pC
14360 72 73 72 2c 20 26 70 43 2d 3e 73 7a 52 6f 77 29  rsr, &pC->szRow)
14370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14380 70 43 2d 3e 73 7a 52 6f 77 3c 3d 70 43 2d 3e 70  pC->szRow<=pC->p
14390 61 79 6c 6f 61 64 53 69 7a 65 20 29 3b 0a 20 20  ayloadSize );.  
143a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
143b0 73 7a 52 6f 77 3c 3d 36 35 35 33 36 20 29 3b 20  szRow<=65536 ); 
143c0 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65   /* Maximum page
143d0 20 73 69 7a 65 20 69 73 20 36 34 4b 69 42 20 2a   size is 64KiB *
143e0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e  /.      if( pC->
143f0 70 61 79 6c 6f 61 64 53 69 7a 65 20 3e 20 28 75  payloadSize > (u
14400 33 32 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  32)db->aLimit[SQ
14410 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
14420 48 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  H] ){.        go
14430 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 20 20  to too_big;.    
14440 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43    }.    }.    pC
14450 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14460 70 2d 3e 63 61 63 68 65 43 74 72 3b 0a 20 20 20  p->cacheCtr;.   
14470 20 70 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 20   pC->iHdrOffset 
14480 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
14490 2d 3e 61 52 6f 77 2c 20 61 4f 66 66 73 65 74 5b  ->aRow, aOffset[
144a0 30 5d 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 48 64  0]);.    pC->nHd
144b0 72 50 61 72 73 65 64 20 3d 20 30 3b 0a 0a 0a 20  rParsed = 0;... 
144c0 20 20 20 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77     if( pC->szRow
144d0 3c 61 4f 66 66 73 65 74 5b 30 5d 20 29 7b 20 20  <aOffset[0] ){  
144e0 20 20 20 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49      /*OPTIMIZATI
144f0 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
14500 20 20 20 20 2f 2a 20 70 43 2d 3e 61 52 6f 77 20      /* pC->aRow 
14510 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
14520 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
14530 20 72 6f 77 2c 20 62 75 74 20 69 74 20 64 6f 65   row, but it doe
14540 73 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  s at least.     
14550 20 2a 2a 20 6e 65 65 64 20 74 6f 20 63 6f 76 65   ** need to cove
14560 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  r the header of 
14570 74 68 65 20 72 65 63 6f 72 64 2e 20 20 49 66 20  the record.  If 
14580 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e 6f  pC->aRow does no
14590 74 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  t contain.      
145a0 2a 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ** the complete 
145b0 68 65 61 64 65 72 2c 20 74 68 65 6e 20 73 65 74  header, then set
145c0 20 69 74 20 74 6f 20 7a 65 72 6f 2c 20 66 6f 72   it to zero, for
145d0 63 69 6e 67 20 74 68 65 20 68 65 61 64 65 72 20  cing the header 
145e0 74 6f 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 64  to be.      ** d
145f0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
14600 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ated. */.      p
14610 43 2d 3e 61 52 6f 77 20 3d 20 30 3b 0a 20 20 20  C->aRow = 0;.   
14620 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20 30     pC->szRow = 0
14630 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ;..      /* Make
14640 20 73 75 72 65 20 61 20 63 6f 72 72 75 70 74 20   sure a corrupt 
14650 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 74  database has not
14660 20 67 69 76 65 6e 20 75 73 20 61 6e 20 6f 76 65   given us an ove
14670 72 73 69 7a 65 20 68 65 61 64 65 72 2e 0a 20 20  rsize header..  
14680 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 6e      ** Do this n
14690 6f 77 20 74 6f 20 61 76 6f 69 64 20 61 6e 20 6f  ow to avoid an o
146a0 76 65 72 73 69 7a 65 20 6d 65 6d 6f 72 79 20 61  versize memory a
146b0 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  llocation..     
146c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 79 70   **.      ** Typ
146d0 65 20 65 6e 74 72 69 65 73 20 63 61 6e 20 62 65  e entries can be
146e0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 35   between 1 and 5
146f0 20 62 79 74 65 73 20 65 61 63 68 2e 20 20 42 75   bytes each.  Bu
14700 74 20 34 20 61 6e 64 20 35 20 62 79 74 65 0a 20  t 4 and 5 byte. 
14710 20 20 20 20 20 2a 2a 20 74 79 70 65 73 20 75 73       ** types us
14720 65 20 73 6f 20 6d 75 63 68 20 64 61 74 61 20 73  e so much data s
14730 70 61 63 65 20 74 68 61 74 20 74 68 65 72 65 20  pace that there 
14740 63 61 6e 20 6f 6e 6c 79 20 62 65 20 34 30 39 36  can only be 4096
14750 20 61 6e 64 20 33 32 20 6f 66 0a 20 20 20 20 20   and 32 of.     
14760 20 2a 2a 20 74 68 65 6d 2c 20 72 65 73 70 65 63   ** them, respec
14770 74 69 76 65 6c 79 2e 20 20 53 6f 20 74 68 65 20  tively.  So the 
14780 6d 61 78 69 6d 75 6d 20 68 65 61 64 65 72 20 6c  maximum header l
14790 65 6e 67 74 68 20 72 65 73 75 6c 74 73 20 66 72  ength results fr
147a0 6f 6d 20 61 0a 20 20 20 20 20 20 2a 2a 20 33 2d  om a.      ** 3-
147b0 62 79 74 65 20 74 79 70 65 20 66 6f 72 20 65 61  byte type for ea
147c0 63 68 20 6f 66 20 74 68 65 20 6d 61 78 69 6d 75  ch of the maximu
147d0 6d 20 6f 66 20 33 32 37 36 38 20 63 6f 6c 75 6d  m of 32768 colum
147e0 6e 73 20 70 6c 75 73 20 74 68 72 65 65 0a 20 20  ns plus three.  
147f0 20 20 20 20 2a 2a 20 65 78 74 72 61 20 62 79 74      ** extra byt
14800 65 73 20 66 6f 72 20 74 68 65 20 68 65 61 64 65  es for the heade
14810 72 20 6c 65 6e 67 74 68 20 69 74 73 65 6c 66 2e  r length itself.
14820 20 20 33 32 37 36 38 2a 33 20 2b 20 33 20 3d 20    32768*3 + 3 = 
14830 39 38 33 30 37 2e 0a 20 20 20 20 20 20 2a 2f 0a  98307..      */.
14840 20 20 20 20 20 20 69 66 28 20 61 4f 66 66 73 65        if( aOffse
14850 74 5b 30 5d 20 3e 20 39 38 33 30 37 20 7c 7c 20  t[0] > 98307 || 
14860 61 4f 66 66 73 65 74 5b 30 5d 20 3e 20 70 43 2d  aOffset[0] > pC-
14870 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29 7b 0a  >payloadSize ){.
14880 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 5f          goto op_
14890 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75 70 74 3b 0a  column_corrupt;.
148a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
148b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
148c0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
148d0 69 6f 6e 2e 20 20 42 79 20 73 6b 69 70 70 69 6e  ion.  By skippin
148e0 67 20 6f 76 65 72 20 74 68 65 20 66 69 72 73 74  g over the first
148f0 20 66 65 77 20 74 65 73 74 73 0a 20 20 20 20 20   few tests.     
14900 20 2a 2a 20 28 65 78 3a 20 70 43 2d 3e 6e 48 64   ** (ex: pC->nHd
14910 72 50 61 72 73 65 64 3c 3d 70 32 29 20 69 6e 20  rParsed<=p2) in 
14920 74 68 65 20 6e 65 78 74 20 73 65 63 74 69 6f 6e  the next section
14930 2c 20 77 65 20 61 63 68 69 65 76 65 20 61 0a 20  , we achieve a. 
14940 20 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 61 62       ** measurab
14950 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  le performance g
14960 61 69 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ain..      **.  
14970 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
14980 63 68 20 69 73 20 74 61 6b 65 6e 20 65 76 65 6e  ch is taken even
14990 20 69 66 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d   if aOffset[0]==
149a0 30 2e 20 20 53 75 63 68 20 61 20 72 65 63 6f 72  0.  Such a recor
149b0 64 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  d is never.     
149c0 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 62 79   ** generated by
149d0 20 53 51 4c 69 74 65 2c 20 61 6e 64 20 63 6f 75   SQLite, and cou
149e0 6c 64 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ld be considered
149f0 20 63 6f 72 72 75 70 74 69 6f 6e 2c 20 62 75 74   corruption, but
14a00 20 77 65 0a 20 20 20 20 20 20 2a 2a 20 61 63 63   we.      ** acc
14a10 65 70 74 20 69 74 20 66 6f 72 20 68 69 73 74 6f  ept it for histo
14a20 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  rical reasons.  
14a30 57 68 65 6e 20 61 4f 66 66 73 65 74 5b 30 5d 3d  When aOffset[0]=
14a40 3d 30 2c 20 74 68 65 20 63 6f 64 65 20 74 68 69  =0, the code thi
14a50 73 0a 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63  s.      ** branc
14a60 68 20 6a 75 6d 70 73 20 74 6f 20 72 65 61 64 73  h jumps to reads
14a70 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
14a80 20 74 68 65 20 72 65 63 6f 72 64 2c 20 62 75 74   the record, but
14a90 20 6e 65 76 65 72 20 6d 6f 72 65 0a 20 20 20 20   never more.    
14aa0 20 20 2a 2a 20 74 68 61 6e 20 61 20 66 65 77 20    ** than a few 
14ab0 62 79 74 65 73 2e 20 20 45 76 65 6e 20 69 66 20  bytes.  Even if 
14ac0 74 68 65 20 72 65 63 6f 72 64 20 6f 63 63 75 72  the record occur
14ad0 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
14ae0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
14af0 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 20  * content area, 
14b00 74 68 65 20 22 70 61 67 65 20 68 65 61 64 65 72  the "page header
14b10 22 20 63 6f 6d 65 73 20 61 66 74 65 72 20 74 68  " comes after th
14b20 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
14b30 6e 64 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 74  nd so.      ** t
14b40 68 69 73 20 6f 76 65 72 72 65 61 64 20 69 73 20  his overread is 
14b50 68 61 72 6d 6c 65 73 73 2e 20 20 53 69 6d 69 6c  harmless.  Simil
14b60 61 72 20 6f 76 65 72 72 65 61 64 73 20 63 61 6e  ar overreads can
14b70 20 6f 63 63 75 72 20 66 6f 72 20 61 20 63 6f 72   occur for a cor
14b80 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 64 61  rupt.      ** da
14b90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
14ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a 44 61 74     */.      zDat
14bb0 61 20 3d 20 70 43 2d 3e 61 52 6f 77 3b 0a 20 20  a = pC->aRow;.  
14bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
14bd0 6e 48 64 72 50 61 72 73 65 64 3c 3d 70 32 20 29  nHdrParsed<=p2 )
14be0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ;         /* Con
14bf0 64 69 74 69 6f 6e 61 6c 20 73 6b 69 70 70 65 64  ditional skipped
14c00 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
14c10 73 65 28 20 61 4f 66 66 73 65 74 5b 30 5d 3d 3d  se( aOffset[0]==
14c20 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 );.      goto 
14c30 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f 68  op_column_read_h
14c40 65 61 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  eader;.    }.  }
14c50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
14c60 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 66 69   at least the fi
14c70 72 73 74 20 70 32 2b 31 20 65 6e 74 72 69 65 73  rst p2+1 entries
14c80 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 68   of the header h
14c90 61 76 65 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61  ave been.  ** pa
14ca0 72 73 65 64 20 61 6e 64 20 76 61 6c 69 64 20 69  rsed and valid i
14cb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e  nformation is in
14cc0 20 61 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 70   aOffset[] and p
14cd0 43 2d 3e 61 54 79 70 65 5b 5d 2e 0a 20 20 2a 2f  C->aType[]..  */
14ce0 0a 20 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50  .  if( pC->nHdrP
14cf0 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20  arsed<=p2 ){.   
14d00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
14d10 6d 6f 72 65 20 68 65 61 64 65 72 20 61 76 61 69  more header avai
14d20 6c 61 62 6c 65 20 66 6f 72 20 70 61 72 73 69 6e  lable for parsin
14d30 67 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 2c  g in the record,
14d40 20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 65   try.    ** to e
14d50 78 74 72 61 63 74 20 61 64 64 69 74 69 6f 6e 61  xtract additiona
14d60 6c 20 66 69 65 6c 64 73 20 75 70 20 74 68 72 6f  l fields up thro
14d70 75 67 68 20 74 68 65 20 70 32 2b 31 2d 74 68 20  ugh the p2+1-th 
14d80 66 69 65 6c 64 20 0a 20 20 20 20 2a 2f 0a 20 20  field .    */.  
14d90 20 20 69 66 28 20 70 43 2d 3e 69 48 64 72 4f 66    if( pC->iHdrOf
14da0 66 73 65 74 3c 61 4f 66 66 73 65 74 5b 30 5d 20  fset<aOffset[0] 
14db0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  ){.      /* Make
14dc0 20 73 75 72 65 20 7a 44 61 74 61 20 70 6f 69 6e   sure zData poin
14dd0 74 73 20 74 6f 20 65 6e 6f 75 67 68 20 6f 66 20  ts to enough of 
14de0 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 63 6f  the record to co
14df0 76 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ver the header. 
14e00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d  */.      if( pC-
14e10 3e 61 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  >aRow==0 ){.    
14e20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4d 65 6d      memset(&sMem
14e30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4d 65 6d  , 0, sizeof(sMem
14e40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
14e50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
14e60 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 75 63 2e  romBtree(pC->uc.
14e70 70 43 75 72 73 6f 72 2c 20 30 2c 20 61 4f 66 66  pCursor, 0, aOff
14e80 73 65 74 5b 30 5d 2c 20 26 73 4d 65 6d 29 3b 0a  set[0], &sMem);.
14e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
14eb0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
14ec0 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7a 44 61  ror;.        zDa
14ed0 74 61 20 3d 20 28 75 38 2a 29 73 4d 65 6d 2e 7a  ta = (u8*)sMem.z
14ee0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14ef0 20 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70         zData = p
14f00 43 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 7d  C->aRow;.      }
14f10 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c  .  .      /* Fil
14f20 6c 20 69 6e 20 70 43 2d 3e 61 54 79 70 65 5b 69  l in pC->aType[i
14f30 5d 20 61 6e 64 20 61 4f 66 66 73 65 74 5b 69 5d  ] and aOffset[i]
14f40 20 76 61 6c 75 65 73 20 74 68 72 6f 75 67 68 20   values through 
14f50 74 68 65 20 70 32 2d 74 68 20 66 69 65 6c 64 2e  the p2-th field.
14f60 20 2a 2f 0a 20 20 20 20 6f 70 5f 63 6f 6c 75 6d   */.    op_colum
14f70 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3a 0a 20  n_read_header:. 
14f80 20 20 20 20 20 69 20 3d 20 70 43 2d 3e 6e 48 64       i = pC->nHd
14f90 72 50 61 72 73 65 64 3b 0a 20 20 20 20 20 20 6f  rParsed;.      o
14fa0 66 66 73 65 74 36 34 20 3d 20 61 4f 66 66 73 65  ffset64 = aOffse
14fb0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 48 64 72  t[i];.      zHdr
14fc0 20 3d 20 7a 44 61 74 61 20 2b 20 70 43 2d 3e 69   = zData + pC->i
14fd0 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  HdrOffset;.     
14fe0 20 7a 45 6e 64 48 64 72 20 3d 20 7a 44 61 74 61   zEndHdr = zData
14ff0 20 2b 20 61 4f 66 66 73 65 74 5b 30 5d 3b 0a 20   + aOffset[0];. 
15000 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 7a       testcase( z
15010 48 64 72 3e 3d 7a 45 6e 64 48 64 72 20 29 3b 0a  Hdr>=zEndHdr );.
15020 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
15030 20 20 69 66 28 20 28 74 20 3d 20 7a 48 64 72 5b    if( (t = zHdr[
15040 30 5d 29 3c 30 78 38 30 20 29 7b 0a 20 20 20 20  0])<0x80 ){.    
15050 20 20 20 20 20 20 7a 48 64 72 2b 2b 3b 0a 20 20        zHdr++;.  
15060 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36 34          offset64
15070 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f   += sqlite3VdbeO
15080 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65  neByteSerialType
15090 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20 20 20  Len(t);.        
150a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
150b0 20 7a 48 64 72 20 2b 3d 20 73 71 6c 69 74 65 33   zHdr += sqlite3
150c0 47 65 74 56 61 72 69 6e 74 33 32 28 7a 48 64 72  GetVarint32(zHdr
150d0 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 20 20 20  , &t);.         
150e0 20 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c   offset64 += sql
150f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15100 70 65 4c 65 6e 28 74 29 3b 0a 20 20 20 20 20 20  peLen(t);.      
15110 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 2d 3e    }.        pC->
15120 61 54 79 70 65 5b 69 2b 2b 5d 20 3d 20 74 3b 0a  aType[i++] = t;.
15130 20 20 20 20 20 20 20 20 61 4f 66 66 73 65 74 5b          aOffset[
15140 69 5d 20 3d 20 28 75 33 32 29 28 6f 66 66 73 65  i] = (u32)(offse
15150 74 36 34 20 26 20 30 78 66 66 66 66 66 66 66 66  t64 & 0xffffffff
15160 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
15170 20 69 3c 3d 70 32 20 26 26 20 7a 48 64 72 3c 7a   i<=p2 && zHdr<z
15180 45 6e 64 48 64 72 20 29 3b 0a 0a 20 20 20 20 20  EndHdr );..     
15190 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 69   /* The record i
151a0 73 20 63 6f 72 72 75 70 74 20 69 66 20 61 6e 79  s corrupt if any
151b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
151c0 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
151d0 20 20 2a 2a 20 28 31 29 20 74 68 65 20 62 79 74    ** (1) the byt
151e0 65 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  es of the header
151f0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
15200 20 64 65 63 6c 61 72 65 64 20 68 65 61 64 65 72   declared header
15210 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 28   size.      ** (
15220 32 29 20 74 68 65 20 65 6e 74 69 72 65 20 68 65  2) the entire he
15230 61 64 65 72 20 77 61 73 20 75 73 65 64 20 62 75  ader was used bu
15240 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61 20 77  t not all data w
15250 61 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  as used.      **
15260 20 28 33 29 20 74 68 65 20 65 6e 64 20 6f 66 20   (3) the end of 
15270 74 68 65 20 64 61 74 61 20 65 78 74 65 6e 64 73  the data extends
15280 20 62 65 79 6f 6e 64 20 74 68 65 20 65 6e 64 20   beyond the end 
15290 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2e 0a 20  of the record.. 
152a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
152b0 28 20 28 7a 48 64 72 3e 3d 7a 45 6e 64 48 64 72  ( (zHdr>=zEndHdr
152c0 20 26 26 20 28 7a 48 64 72 3e 7a 45 6e 64 48 64   && (zHdr>zEndHd
152d0 72 20 7c 7c 20 6f 66 66 73 65 74 36 34 21 3d 70  r || offset64!=p
152e0 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29 29  C->payloadSize))
152f0 0a 20 20 20 20 20 20 20 7c 7c 20 28 6f 66 66 73  .       || (offs
15300 65 74 36 34 20 3e 20 70 43 2d 3e 70 61 79 6c 6f  et64 > pC->paylo
15310 61 64 53 69 7a 65 29 0a 20 20 20 20 20 20 29 7b  adSize).      ){
15320 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4f 66  .        if( aOf
15330 66 73 65 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  fset[0]==0 ){.  
15340 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
15350 20 20 20 20 20 20 20 20 20 7a 48 64 72 20 3d 20           zHdr = 
15360 7a 45 6e 64 48 64 72 3b 0a 20 20 20 20 20 20 20  zEndHdr;.       
15370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15380 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d    if( pC->aRow==
15390 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  0 ) sqlite3VdbeM
153a0 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29  emRelease(&sMem)
153b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
153c0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72 72 75   op_column_corru
153d0 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pt;.        }.  
153e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 43 2d      }..      pC-
153f0 3e 6e 48 64 72 50 61 72 73 65 64 20 3d 20 69 3b  >nHdrParsed = i;
15400 0a 20 20 20 20 20 20 70 43 2d 3e 69 48 64 72 4f  .      pC->iHdrO
15410 66 66 73 65 74 20 3d 20 28 75 33 32 29 28 7a 48  ffset = (u32)(zH
15420 64 72 20 2d 20 7a 44 61 74 61 29 3b 0a 20 20 20  dr - zData);.   
15430 20 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d     if( pC->aRow=
15440 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
15450 4d 65 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d  MemRelease(&sMem
15460 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15470 20 20 20 20 74 20 3d 20 30 3b 0a 20 20 20 20 7d      t = 0;.    }
15480 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 66 74 65  ..    /* If afte
15490 72 20 74 72 79 69 6e 67 20 74 6f 20 65 78 74 72  r trying to extr
154a0 61 63 74 20 6e 65 77 20 65 6e 74 72 69 65 73 20  act new entries 
154b0 66 72 6f 6d 20 74 68 65 20 68 65 61 64 65 72 2c  from the header,
154c0 20 6e 48 64 72 50 61 72 73 65 64 20 69 73 0a 20   nHdrParsed is. 
154d0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 6e 6f 74 20     ** still not 
154e0 75 70 20 74 6f 20 70 32 2c 20 74 68 61 74 20 6d  up to p2, that m
154f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
15500 63 6f 72 64 20 68 61 73 20 66 65 77 65 72 20 74  cord has fewer t
15510 68 61 6e 20 70 32 0a 20 20 20 20 2a 2a 20 63 6f  han p2.    ** co
15520 6c 75 6d 6e 73 2e 20 20 53 6f 20 74 68 65 20 72  lumns.  So the r
15530 65 73 75 6c 74 20 77 69 6c 6c 20 62 65 20 65 69  esult will be ei
15540 74 68 65 72 20 74 68 65 20 64 65 66 61 75 6c 74  ther the default
15550 20 76 61 6c 75 65 20 6f 72 20 61 20 4e 55 4c 4c   value or a NULL
15560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15570 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c   pC->nHdrParsed<
15580 3d 70 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =p2 ){.      if(
15590 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
155a0 5f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  _MEM ){.        
155b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
155c0 61 6c 6c 6f 77 43 6f 70 79 28 70 44 65 73 74 2c  allowCopy(pDest,
155d0 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 2c 20 4d   pOp->p4.pMem, M
155e0 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EM_Static);.    
155f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15600 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
15610 65 74 4e 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20  etNull(pDest);. 
15620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
15630 6f 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 6f 75 74 3b  o op_column_out;
15640 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15650 20 20 20 20 74 20 3d 20 70 43 2d 3e 61 54 79 70      t = pC->aTyp
15660 65 5b 70 32 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e[p2];.  }..  /*
15670 20 45 78 74 72 61 63 74 20 74 68 65 20 63 6f 6e   Extract the con
15680 74 65 6e 74 20 66 6f 72 20 74 68 65 20 70 32 2b  tent for the p2+
15690 31 2d 74 68 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f  1-th column.  Co
156a0 6e 74 72 6f 6c 20 63 61 6e 20 6f 6e 6c 79 0a 20  ntrol can only. 
156b0 20 2a 2a 20 72 65 61 63 68 20 74 68 69 73 20 70   ** reach this p
156c0 6f 69 6e 74 20 69 66 20 61 4f 66 66 73 65 74 5b  oint if aOffset[
156d0 70 32 5d 2c 20 61 4f 66 66 73 65 74 5b 70 32 2b  p2], aOffset[p2+
156e0 31 5d 2c 20 61 6e 64 20 70 43 2d 3e 61 54 79 70  1], and pC->aTyp
156f0 65 5b 70 32 5d 20 61 72 65 0a 20 20 2a 2a 20 61  e[p2] are.  ** a
15700 6c 6c 20 76 61 6c 69 64 2e 0a 20 20 2a 2f 0a 20  ll valid..  */. 
15710 20 61 73 73 65 72 74 28 20 70 32 3c 70 43 2d 3e   assert( p2<pC->
15720 6e 48 64 72 50 61 72 73 65 64 20 29 3b 0a 20 20  nHdrParsed );.  
15730 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
15740 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
15750 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
15760 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
15770 28 70 44 65 73 74 29 20 29 3b 0a 20 20 69 66 28  (pDest) );.  if(
15780 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
15790 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 73 71  pDest) ){.    sq
157a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
157b0 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a  ull(pDest);.  }.
157c0 20 20 61 73 73 65 72 74 28 20 74 3d 3d 70 43 2d    assert( t==pC-
157d0 3e 61 54 79 70 65 5b 70 32 5d 20 29 3b 0a 20 20  >aType[p2] );.  
157e0 69 66 28 20 70 43 2d 3e 73 7a 52 6f 77 3e 3d 61  if( pC->szRow>=a
157f0 4f 66 66 73 65 74 5b 70 32 2b 31 5d 20 29 7b 0a  Offset[p2+1] ){.
15800 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
15810 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
15820 68 65 72 65 20 74 68 65 20 64 65 73 69 72 65 64  here the desired
15830 20 63 6f 6e 74 65 6e 74 20 66 69 74 73 20 6f 6e   content fits on
15840 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
15850 20 20 2a 2a 20 70 61 67 65 20 2d 20 77 68 65 72    ** page - wher
15860 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  e the content is
15870 20 6e 6f 74 20 6f 6e 20 61 6e 20 6f 76 65 72 66   not on an overf
15880 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  low page */.    
15890 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77  zData = pC->aRow
158a0 20 2b 20 61 4f 66 66 73 65 74 5b 70 32 5d 3b 0a   + aOffset[p2];.
158b0 20 20 20 20 69 66 28 20 74 3c 31 32 20 29 7b 0a      if( t<12 ){.
158c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
158d0 65 53 65 72 69 61 6c 47 65 74 28 7a 44 61 74 61  eSerialGet(zData
158e0 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , t, pDest);.   
158f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
15900 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76   If the column v
15910 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
15920 2c 20 77 65 20 6e 65 65 64 20 61 20 70 65 72 73  , we need a pers
15930 69 73 74 65 6e 74 20 76 61 6c 75 65 2c 20 6e 6f  istent value, no
15940 74 0a 20 20 20 20 20 20 2a 2a 20 61 20 4d 45 4d  t.      ** a MEM
15950 5f 45 70 68 65 6d 20 76 61 6c 75 65 2e 20 20 54  _Ephem value.  T
15960 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 20  his branch is a 
15970 66 61 73 74 20 73 68 6f 72 74 2d 63 75 74 20 74  fast short-cut t
15980 68 61 74 20 69 73 20 65 71 75 69 76 61 6c 65 6e  hat is equivalen
15990 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 63 61  t.      ** to ca
159a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  lling sqlite3Vdb
159b0 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
159c0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 65 70   sqlite3VdbeDeep
159d0 68 65 6d 65 72 61 6c 69 7a 65 28 29 2e 0a 20 20  hemeralize()..  
159e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
159f0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
15a00 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
15a10 6f 62 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  ob, MEM_Str|MEM_
15a20 54 65 72 6d 20 7d 3b 0a 20 20 20 20 20 20 70 44  Term };.      pD
15a30 65 73 74 2d 3e 6e 20 3d 20 6c 65 6e 20 3d 20 28  est->n = len = (
15a40 74 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  t-12)/2;.      p
15a50 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
15a60 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 66 28 20  ding;.      if( 
15a70 70 44 65 73 74 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  pDest->szMalloc 
15a80 3c 20 6c 65 6e 2b 32 20 29 7b 0a 20 20 20 20 20  < len+2 ){.     
15a90 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
15aa0 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
15ab0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
15ac0 64 62 65 4d 65 6d 47 72 6f 77 28 70 44 65 73 74  dbeMemGrow(pDest
15ad0 2c 20 6c 65 6e 2b 32 2c 20 30 29 20 29 20 67 6f  , len+2, 0) ) go
15ae0 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20  to no_mem;.     
15af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15b00 70 44 65 73 74 2d 3e 7a 20 3d 20 70 44 65 73 74  pDest->z = pDest
15b10 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 20  ->zMalloc;.     
15b20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28   }.      memcpy(
15b30 70 44 65 73 74 2d 3e 7a 2c 20 7a 44 61 74 61 2c  pDest->z, zData,
15b40 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 70 44 65   len);.      pDe
15b50 73 74 2d 3e 7a 5b 6c 65 6e 5d 20 3d 20 30 3b 0a  st->z[len] = 0;.
15b60 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 5b 6c        pDest->z[l
15b70 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  en+1] = 0;.     
15b80 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 3d 20   pDest->flags = 
15b90 61 46 6c 61 67 5b 74 26 31 5d 3b 0a 20 20 20 20  aFlag[t&1];.    
15ba0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
15bb0 44 65 73 74 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f  Dest->enc = enco
15bc0 64 69 6e 67 3b 0a 20 20 20 20 2f 2a 20 54 68 69  ding;.    /* Thi
15bd0 73 20 62 72 61 6e 63 68 20 68 61 70 70 65 6e 73  s branch happens
15be0 20 6f 6e 6c 79 20 77 68 65 6e 20 63 6f 6e 74 65   only when conte
15bf0 6e 74 20 69 73 20 6f 6e 20 6f 76 65 72 66 6c 6f  nt is on overflo
15c00 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 69  w pages */.    i
15c10 66 28 20 28 28 70 4f 70 2d 3e 70 35 20 26 20 28  f( ((pOp->p5 & (
15c20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
15c30 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52  |OPFLAG_TYPEOFAR
15c40 47 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  G))!=0.         
15c50 20 26 26 20 28 28 74 3e 3d 31 32 20 26 26 20 28   && ((t>=12 && (
15c60 74 26 31 29 3d 3d 30 29 20 7c 7c 20 28 70 4f 70  t&1)==0) || (pOp
15c70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 54 59  ->p5 & OPFLAG_TY
15c80 50 45 4f 46 41 52 47 29 21 3d 30 29 29 0a 20 20  PEOFARG)!=0)).  
15c90 20 20 20 7c 7c 20 28 6c 65 6e 20 3d 20 73 71 6c     || (len = sql
15ca0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15cb0 70 65 4c 65 6e 28 74 29 29 3d 3d 30 0a 20 20 20  peLen(t))==0.   
15cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e   ){.      /* Con
15cd0 74 65 6e 74 20 69 73 20 69 72 72 65 6c 65 76 61  tent is irreleva
15ce0 6e 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  nt for.      ** 
15cf0 20 20 20 31 2e 20 74 68 65 20 74 79 70 65 6f 66     1. the typeof
15d00 28 29 20 66 75 6e 63 74 69 6f 6e 2c 0a 20 20 20  () function,.   
15d10 20 20 20 2a 2a 20 20 20 20 32 2e 20 74 68 65 20     **    2. the 
15d20 6c 65 6e 67 74 68 28 58 29 20 66 75 6e 63 74 69  length(X) functi
15d30 6f 6e 20 69 66 20 58 20 69 73 20 61 20 62 6c 6f  on if X is a blo
15d40 62 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  b, and.      ** 
15d50 20 20 20 33 2e 20 69 66 20 74 68 65 20 63 6f 6e     3. if the con
15d60 74 65 6e 74 20 6c 65 6e 67 74 68 20 69 73 20 7a  tent length is z
15d70 65 72 6f 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ero..      ** So
15d80 20 77 65 20 6d 69 67 68 74 20 61 73 20 77 65 6c   we might as wel
15d90 6c 20 75 73 65 20 62 6f 67 75 73 20 63 6f 6e 74  l use bogus cont
15da0 65 6e 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  ent rather than 
15db0 72 65 61 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  reading.      **
15dc0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
15dd0 73 6b 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sk. .      **.  
15de0 20 20 20 20 2a 2a 20 41 6c 74 68 6f 75 67 68 20      ** Although 
15df0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15e00 6c 47 65 74 28 29 20 6d 61 79 20 72 65 61 64 20  lGet() may read 
15e10 61 74 20 6d 6f 73 74 20 38 20 62 79 74 65 73 20  at most 8 bytes 
15e20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 20 2a  from the.      *
15e30 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
15e40 74 6f 20 69 74 2c 20 64 65 62 75 67 67 69 6e 67  to it, debugging
15e50 20 66 75 6e 63 74 69 6f 6e 20 56 64 62 65 4d 65   function VdbeMe
15e60 6d 50 72 65 74 74 79 50 72 69 6e 74 28 29 20 6d  mPrettyPrint() m
15e70 61 79 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  ay.      ** read
15e80 20 75 70 20 74 6f 20 31 36 2e 20 53 6f 20 31 36   up to 16. So 16
15e90 20 62 79 74 65 73 20 6f 66 20 62 6f 67 75 73 20   bytes of bogus 
15ea0 63 6f 6e 74 65 6e 74 20 69 73 20 73 75 70 70 6c  content is suppl
15eb0 69 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ied..      */.  
15ec0 20 20 20 20 73 74 61 74 69 63 20 75 38 20 61 5a      static u8 aZ
15ed0 65 72 6f 5b 31 36 5d 3b 20 20 2f 2a 20 54 68 69  ero[16];  /* Thi
15ee0 73 20 69 73 20 74 68 65 20 62 6f 67 75 73 20 63  s is the bogus c
15ef0 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  ontent */.      
15f00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15f10 6c 47 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20 70  lGet(aZero, t, p
15f20 44 65 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Dest);.    }else
15f30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
15f40 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
15f50 74 72 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72  tree(pC->uc.pCur
15f60 73 6f 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d  sor, aOffset[p2]
15f70 2c 20 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a 20  , len, pDest);. 
15f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15f90 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
15fa0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
15fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
15fc0 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 63 6f  dbeSerialGet((co
15fd0 6e 73 74 20 75 38 2a 29 70 44 65 73 74 2d 3e 7a  nst u8*)pDest->z
15fe0 2c 20 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , t, pDest);.   
15ff0 20 20 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20     pDest->flags 
16000 26 3d 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  &= ~MEM_Ephem;. 
16010 20 20 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c     }.  }..op_col
16020 75 6d 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54  umn_out:.  UPDAT
16030 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70  E_MAX_BLOBSIZE(p
16040 44 65 73 74 29 3b 0a 20 20 52 45 47 49 53 54 45  Dest);.  REGISTE
16050 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c  R_TRACE(pOp->p3,
16060 20 70 44 65 73 74 29 3b 0a 20 20 62 72 65 61 6b   pDest);.  break
16070 3b 0a 0a 6f 70 5f 63 6f 6c 75 6d 6e 5f 63 6f 72  ;..op_column_cor
16080 72 75 70 74 3a 0a 20 20 69 66 28 20 61 4f 70 5b  rupt:.  if( aOp[
16090 30 5d 2e 70 33 3e 30 20 29 7b 0a 20 20 20 20 70  0].p3>0 ){.    p
160a0 4f 70 20 3d 20 26 61 4f 70 5b 61 4f 70 5b 30 5d  Op = &aOp[aOp[0]
160b0 2e 70 33 2d 31 5d 3b 0a 20 20 20 20 62 72 65 61  .p3-1];.    brea
160c0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
160d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
160e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
160f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
16100 65 72 72 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  error;.  }.}../*
16110 20 4f 70 63 6f 64 65 3a 20 41 66 66 69 6e 69 74   Opcode: Affinit
16120 79 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  y P1 P2 * P4 *.*
16130 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 66 66 69  * Synopsis: affi
16140 6e 69 74 79 28 72 5b 50 31 40 50 32 5d 29 0a 2a  nity(r[P1@P2]).*
16150 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 66 66 69 6e  *.** Apply affin
16160 69 74 69 65 73 20 74 6f 20 61 20 72 61 6e 67 65  ities to a range
16170 20 6f 66 20 50 32 20 72 65 67 69 73 74 65 72 73   of P2 registers
16180 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 50   starting with P
16190 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61  1..**.** P4 is a
161a0 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
161b0 50 32 20 63 68 61 72 61 63 74 65 72 73 20 6c 6f  P2 characters lo
161c0 6e 67 2e 20 54 68 65 20 4e 2d 74 68 20 63 68 61  ng. The N-th cha
161d0 72 61 63 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a  racter of the.**
161e0 20 73 74 72 69 6e 67 20 69 6e 64 69 63 61 74 65   string indicate
161f0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66  s the column aff
16200 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c  inity that shoul
16210 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  d be used for th
16220 65 20 4e 2d 74 68 0a 2a 2a 20 6d 65 6d 6f 72 79  e N-th.** memory
16230 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 72 61 6e   cell in the ran
16240 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  ge..*/.case OP_A
16250 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20 63 6f 6e  ffinity: {.  con
16260 73 74 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69  st char *zAffini
16270 74 79 3b 20 20 20 2f 2a 20 54 68 65 20 61 66 66  ty;   /* The aff
16280 69 6e 69 74 79 20 74 6f 20 62 65 20 61 70 70 6c  inity to be appl
16290 69 65 64 20 2a 2f 0a 0a 20 20 7a 41 66 66 69 6e  ied */..  zAffin
162a0 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ity = pOp->p4.z;
162b0 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66 69  .  assert( zAffi
162c0 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  nity!=0 );.  ass
162d0 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29  ert( pOp->p2>0 )
162e0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  ;.  assert( zAff
162f0 69 6e 69 74 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d  inity[pOp->p2]==
16300 30 20 29 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61  0 );.  pIn1 = &a
16310 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
16320 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
16330 70 49 6e 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d  pIn1 <= &p->aMem
16340 5b 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  [(p->nMem+1 - p-
16350 3e 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20  >nCursor)] );.  
16360 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
16370 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20  alid(pIn1) );.  
16380 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
16390 70 49 6e 31 2c 20 2a 28 7a 41 66 66 69 6e 69 74  pIn1, *(zAffinit
163a0 79 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b  y++), encoding);
163b0 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20 20 7d  .    pIn1++;.  }
163c0 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79  while( zAffinity
163d0 5b 30 5d 20 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  [0] );.  break;.
163e0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61  }../* Opcode: Ma
163f0 6b 65 52 65 63 6f 72 64 20 50 31 20 50 32 20 50  keRecord P1 P2 P
16400 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
16410 69 73 3a 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28  is: r[P3]=mkrec(
16420 72 5b 50 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  r[P1@P2]).**.** 
16430 43 6f 6e 76 65 72 74 20 50 32 20 72 65 67 69 73  Convert P2 regis
16440 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 77  ters beginning w
16450 69 74 68 20 50 31 20 69 6e 74 6f 20 74 68 65 20  ith P1 into the 
16460 5b 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a  [record format].
16470 2a 2a 20 75 73 65 20 61 73 20 61 20 64 61 74 61  ** use as a data
16480 20 72 65 63 6f 72 64 20 69 6e 20 61 20 64 61 74   record in a dat
16490 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
164a0 73 20 61 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e  s a key.** in an
164b0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 4f 50 5f   index.  The OP_
164c0 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61  Column opcode ca
164d0 6e 20 64 65 63 6f 64 65 20 74 68 65 20 72 65 63  n decode the rec
164e0 6f 72 64 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a  ord later..**.**
164f0 20 50 34 20 6d 61 79 20 62 65 20 61 20 73 74 72   P4 may be a str
16500 69 6e 67 20 74 68 61 74 20 69 73 20 50 32 20 63  ing that is P2 c
16510 68 61 72 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20  haracters long. 
16520 20 54 68 65 20 4e 2d 74 68 20 63 68 61 72 61 63   The N-th charac
16530 74 65 72 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74  ter of the.** st
16540 72 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74  ring indicates t
16550 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
16560 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
16570 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4e  e used for the N
16580 2d 74 68 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  -th.** field of 
16590 74 68 65 20 69 6e 64 65 78 20 6b 65 79 2e 0a 2a  the index key..*
165a0 2a 0a 2a 2a 20 54 68 65 20 6d 61 70 70 69 6e 67  *.** The mapping
165b0 20 66 72 6f 6d 20 63 68 61 72 61 63 74 65 72 20   from character 
165c0 74 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 67  to affinity is g
165d0 69 76 65 6e 20 62 79 20 74 68 65 20 53 51 4c 49  iven by the SQLI
165e0 54 45 5f 41 46 46 5f 0a 2a 2a 20 6d 61 63 72 6f  TE_AFF_.** macro
165f0 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c  s defined in sql
16600 69 74 65 49 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20  iteInt.h..**.** 
16610 49 66 20 50 34 20 69 73 20 4e 55 4c 4c 20 74 68  If P4 is NULL th
16620 65 6e 20 61 6c 6c 20 69 6e 64 65 78 20 66 69 65  en all index fie
16630 6c 64 73 20 68 61 76 65 20 74 68 65 20 61 66 66  lds have the aff
16640 69 6e 69 74 79 20 42 4c 4f 42 2e 0a 2a 2f 0a 63  inity BLOB..*/.c
16650 61 73 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  ase OP_MakeRecor
16660 64 3a 20 7b 0a 20 20 75 38 20 2a 7a 4e 65 77 52  d: {.  u8 *zNewR
16670 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 2f 2a  ecord;        /*
16680 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
16690 64 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  d the data for t
166a0 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
166b0 0a 20 20 4d 65 6d 20 2a 70 52 65 63 3b 20 20 20  .  Mem *pRec;   
166c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
166d0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
166e0 20 75 36 34 20 6e 44 61 74 61 3b 20 20 20 20 20   u64 nData;     
166f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16700 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
16710 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e  ta space */.  in
16720 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20 20 20  t nHdr;         
16730 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16740 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64 65  f bytes of heade
16750 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 36 34  r space */.  i64
16760 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
16770 20 20 20 20 2f 2a 20 44 61 74 61 20 73 70 61 63      /* Data spac
16780 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
16790 68 69 73 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  his record */.  
167a0 69 36 34 20 6e 5a 65 72 6f 3b 20 20 20 20 20 20  i64 nZero;      
167b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
167c0 20 6f 66 20 7a 65 72 6f 20 62 79 74 65 73 20 61   of zero bytes a
167d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
167e0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
167f0 20 6e 56 61 72 69 6e 74 3b 20 20 20 20 20 20 20   nVarint;       
16800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16810 20 62 79 74 65 73 20 69 6e 20 61 20 76 61 72 69   bytes in a vari
16820 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  nt */.  u32 seri
16830 61 6c 5f 74 79 70 65 3b 20 20 20 20 20 20 20 2f  al_type;       /
16840 2a 20 54 79 70 65 20 66 69 65 6c 64 20 2a 2f 0a  * Type field */.
16850 20 20 4d 65 6d 20 2a 70 44 61 74 61 30 3b 20 20    Mem *pData0;  
16860 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16870 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 63 6f  t field to be co
16880 6d 62 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20  mbined into the 
16890 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65 6d 20  record */.  Mem 
168a0 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  *pLast;         
168b0 20 20 20 2f 2a 20 4c 61 73 74 20 66 69 65 6c 64     /* Last field
168c0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
168d0 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20  /.  int nField; 
168e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
168f0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
16900 6e 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  n the record */.
16910 20 20 63 68 61 72 20 2a 7a 41 66 66 69 6e 69 74    char *zAffinit
16920 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  y;       /* The 
16930 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16940 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a  for the record *
16950 2f 0a 20 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  /.  int file_for
16960 6d 61 74 3b 20 20 20 20 20 20 20 2f 2a 20 46 69  mat;       /* Fi
16970 6c 65 20 66 6f 72 6d 61 74 20 74 6f 20 75 73 65  le format to use
16980 20 66 6f 72 20 65 6e 63 6f 64 69 6e 67 20 2a 2f   for encoding */
16990 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
169a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
169b0 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77 52  ce used in zNewR
169c0 65 63 6f 72 64 5b 5d 20 68 65 61 64 65 72 20 2a  ecord[] header *
169d0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
169e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
169f0 61 63 65 20 75 73 65 64 20 69 6e 20 7a 4e 65 77  ace used in zNew
16a00 52 65 63 6f 72 64 5b 5d 20 63 6f 6e 74 65 6e 74  Record[] content
16a10 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a30 4c 65 6e 67 74 68 20 6f 66 20 61 20 66 69 65 6c  Length of a fiel
16a40 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 73 73 75 6d  d */..  /* Assum
16a50 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 63  ing the record c
16a60 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64 73  ontains N fields
16a70 2c 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  , the record for
16a80 6d 61 74 20 6c 6f 6f 6b 73 0a 20 20 2a 2a 20 6c  mat looks.  ** l
16a90 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
16aa0 20 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ** ------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a  ------------.  *
16af0 2a 20 7c 20 68 64 72 2d 73 69 7a 65 20 7c 20 74  * | hdr-size | t
16b00 79 70 65 20 30 20 7c 20 74 79 70 65 20 31 20 7c  ype 0 | type 1 |
16b10 20 2e 2e 2e 20 7c 20 74 79 70 65 20 4e 2d 31 20   ... | type N-1 
16b20 7c 20 64 61 74 61 30 20 7c 20 2e 2e 2e 20 7c 20  | data0 | ... | 
16b30 64 61 74 61 20 4e 2d 31 20 7c 20 0a 20 20 2a 2a  data N-1 | .  **
16b40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20  ---------.  **. 
16b90 20 2a 2a 20 44 61 74 61 28 30 29 20 69 73 20 74   ** Data(0) is t
16ba0 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74  aken from regist
16bb0 65 72 20 50 31 2e 20 20 44 61 74 61 28 31 29 20  er P1.  Data(1) 
16bc0 63 6f 6d 65 73 20 66 72 6f 6d 20 72 65 67 69 73  comes from regis
16bd0 74 65 72 20 50 31 2b 31 0a 20 20 2a 2a 20 61 6e  ter P1+1.  ** an
16be0 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a 2a  d so forth..  **
16bf0 0a 20 20 2a 2a 20 45 61 63 68 20 74 79 70 65 20  .  ** Each type 
16c00 66 69 65 6c 64 20 69 73 20 61 20 76 61 72 69 6e  field is a varin
16c10 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  t representing t
16c20 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
16c30 66 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 72 72  f the .  ** corr
16c40 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 20 65  esponding data e
16c50 6c 65 6d 65 6e 74 20 28 73 65 65 20 73 71 6c 69  lement (see sqli
16c60 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16c70 65 28 29 29 2e 20 54 68 65 0a 20 20 2a 2a 20 68  e()). The.  ** h
16c80 64 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  dr-size field is
16c90 20 61 6c 73 6f 20 61 20 76 61 72 69 6e 74 20 77   also a varint w
16ca0 68 69 63 68 20 69 73 20 74 68 65 20 6f 66 66 73  hich is the offs
16cb0 65 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  et from the begi
16cc0 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
16cd0 65 20 72 65 63 6f 72 64 20 74 6f 20 64 61 74 61  e record to data
16ce0 30 2e 0a 20 20 2a 2f 0a 20 20 6e 44 61 74 61 20  0..  */.  nData 
16cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
16d00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16d10 6f 66 20 64 61 74 61 20 73 70 61 63 65 20 2a 2f  of data space */
16d20 0a 20 20 6e 48 64 72 20 3d 20 30 3b 20 20 20 20  .  nHdr = 0;    
16d30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16d40 6f 66 20 62 79 74 65 73 20 6f 66 20 68 65 61 64  of bytes of head
16d50 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 5a  er space */.  nZ
16d60 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
16d70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a 65   /* Number of ze
16d80 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
16d90 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f 72  end of the recor
16da0 64 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20  d */.  nField = 
16db0 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 41 66 66 69  pOp->p1;.  zAffi
16dc0 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  nity = pOp->p4.z
16dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  ;.  assert( nFie
16de0 6c 64 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3e  ld>0 && pOp->p2>
16df0 30 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 46 69  0 && pOp->p2+nFi
16e00 65 6c 64 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  eld<=(p->nMem+1 
16e10 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20  - p->nCursor)+1 
16e20 29 3b 0a 20 20 70 44 61 74 61 30 20 3d 20 26 61  );.  pData0 = &a
16e30 4d 65 6d 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6e  Mem[nField];.  n
16e40 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 32 3b  Field = pOp->p2;
16e50 0a 20 20 70 4c 61 73 74 20 3d 20 26 70 44 61 74  .  pLast = &pDat
16e60 61 30 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a 20 20  a0[nField-1];.  
16e70 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 2d  file_format = p-
16e80 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
16e90 6d 61 74 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  mat;..  /* Ident
16ea0 69 66 79 20 74 68 65 20 6f 75 74 70 75 74 20 72  ify the output r
16eb0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 61 73 73  egister */.  ass
16ec0 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
16ed0 2d 3e 70 31 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p1 || pOp->p3>
16ee0 3d 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 32  =pOp->p1+pOp->p2
16ef0 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d   );.  pOut = &aM
16f00 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d  em[pOp->p3];.  m
16f10 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
16f20 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20 2f 2a 20  p, pOut);..  /* 
16f30 41 70 70 6c 79 20 74 68 65 20 72 65 71 75 65 73  Apply the reques
16f40 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 6f 20  ted affinity to 
16f50 61 6c 6c 20 69 6e 70 75 74 73 0a 20 20 2a 2f 0a  all inputs.  */.
16f60 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 30    assert( pData0
16f70 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 69 66 28  <=pLast );.  if(
16f80 20 7a 41 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   zAffinity ){.  
16f90 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b    pRec = pData0;
16fa0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
16fb0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
16fc0 63 2b 2b 2c 20 2a 28 7a 41 66 66 69 6e 69 74 79  c++, *(zAffinity
16fd0 2b 2b 29 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  ++), encoding);.
16fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 41        assert( zA
16ff0 66 66 69 6e 69 74 79 5b 30 5d 3d 3d 30 20 7c 7c  ffinity[0]==0 ||
17000 20 70 52 65 63 3c 3d 70 4c 61 73 74 20 29 3b 0a   pRec<=pLast );.
17010 20 20 20 20 7d 77 68 69 6c 65 28 20 7a 41 66 66      }while( zAff
17020 69 6e 69 74 79 5b 30 5d 20 29 3b 0a 20 20 7d 0a  inity[0] );.  }.
17030 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17040 4e 41 42 4c 45 5f 4e 55 4c 4c 5f 54 52 49 4d 0a  NABLE_NULL_TRIM.
17050 20 20 2f 2a 20 4e 55 4c 4c 73 20 63 61 6e 20 62    /* NULLs can b
17060 65 20 73 61 66 65 6c 79 20 74 72 69 6d 6d 65 64  e safely trimmed
17070 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
17080 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 73 20   the record, as 
17090 6c 6f 6e 67 20 61 73 0a 20 20 2a 2a 20 61 73 20  long as.  ** as 
170a0 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 6d 61  the schema forma
170b0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
170c0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f  nd none of the o
170d0 6d 69 74 74 65 64 20 63 6f 6c 75 6d 6e 73 0a 20  mitted columns. 
170e0 20 2a 2a 20 68 61 76 65 20 61 20 6e 6f 6e 2d 4e   ** have a non-N
170f0 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
17100 65 2e 20 20 41 6c 73 6f 2c 20 74 68 65 20 72 65  e.  Also, the re
17110 63 6f 72 64 20 6d 75 73 74 20 62 65 20 6c 65 66  cord must be lef
17120 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 74 20 6c  t with.  ** at l
17130 65 61 73 74 20 6f 6e 65 20 66 69 65 6c 64 2e 20  east one field. 
17140 20 49 66 20 50 35 3e 30 20 74 68 65 6e 20 69 74   If P5>0 then it
17150 20 77 69 6c 6c 20 62 65 20 6f 6e 65 20 6d 6f 72   will be one mor
17160 65 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  e than the.  ** 
17170 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 69 67  index of the rig
17180 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 77  ht-most column w
17190 69 74 68 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 64  ith a non-NULL d
171a0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
171b0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
171c0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 4c 61  .    while( (pLa
171d0 73 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  st->flags & MEM_
171e0 4e 75 6c 6c 29 21 3d 30 20 26 26 20 6e 46 69 65  Null)!=0 && nFie
171f0 6c 64 3e 70 4f 70 2d 3e 70 35 20 29 7b 0a 20 20  ld>pOp->p5 ){.  
17200 20 20 20 20 70 4c 61 73 74 2d 2d 3b 0a 20 20 20      pLast--;.   
17210 20 20 20 6e 46 69 65 6c 64 2d 2d 3b 0a 20 20 20     nField--;.   
17220 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
17230 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17240 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 74 68   the elements th
17250 61 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20  at will make up 
17260 74 68 65 20 72 65 63 6f 72 64 20 74 6f 20 66 69  the record to fi
17270 67 75 72 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f  gure.  ** out ho
17280 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
17290 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
172a0 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a   new record..  *
172b0 2f 0a 20 20 70 52 65 63 20 3d 20 70 4c 61 73 74  /.  pRec = pLast
172c0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
172d0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70  rt( memIsValid(p
172e0 52 65 63 29 20 29 3b 0a 20 20 20 20 73 65 72 69  Rec) );.    seri
172f0 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65  al_type = sqlite
17300 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
17310 70 52 65 63 2c 20 66 69 6c 65 5f 66 6f 72 6d 61  pRec, file_forma
17320 74 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66  t, &len);.    if
17330 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 20  ( pRec->flags & 
17340 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
17350 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
17360 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
17370 2f 2a 20 56 61 6c 75 65 73 20 77 69 74 68 20 4d  /* Values with M
17380 45 4d 5f 4e 75 6c 6c 20 61 6e 64 20 4d 45 4d 5f  EM_Null and MEM_
17390 5a 65 72 6f 20 61 72 65 20 63 72 65 61 74 65 64  Zero are created
173a0 20 62 79 20 78 43 6f 6c 75 6d 6e 20 76 69 72 74   by xColumn virt
173b0 75 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ual.        ** t
173c0 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 74 68 61  able methods tha
173d0 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 20 73  t never invoke s
173e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78 78  qlite3_result_xx
173f0 78 78 78 28 29 20 77 68 69 6c 65 0a 20 20 20 20  xxx() while.    
17400 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 69 6e 67      ** computing
17410 20 61 6e 20 75 6e 63 68 61 6e 67 69 6e 67 20 63   an unchanging c
17420 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61  olumn value in a
17430 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  n UPDATE stateme
17440 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 47  nt..        ** G
17450 69 76 65 20 73 75 63 68 20 76 61 6c 75 65 73 20  ive such values 
17460 61 20 73 70 65 63 69 61 6c 20 69 6e 74 65 72 6e  a special intern
17470 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 73 65 72 69  al-use-only seri
17480 61 6c 2d 74 79 70 65 20 6f 66 20 31 30 0a 20 20  al-type of 10.  
17490 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
174a0 20 74 68 65 79 20 63 61 6e 20 62 65 20 70 61 73   they can be pas
174b0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 78  sed through to x
174c0 55 70 64 61 74 65 20 61 6e 64 20 68 61 76 65 0a  Update and have.
174d0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 75          ** a tru
174e0 65 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e sqlite3_value_
174f0 6e 6f 63 68 61 6e 67 65 28 29 2e 20 2a 2f 0a 20  nochange(). */. 
17500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17510 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 4e  Op->p5==OPFLAG_N
17520 4f 43 48 4e 47 5f 4d 41 47 49 43 20 7c 7c 20 43  OCHNG_MAGIC || C
17530 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
17540 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
17550 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 7d 65 6c   = 10;.      }el
17560 73 65 20 69 66 28 20 6e 44 61 74 61 20 29 7b 0a  se if( nData ){.
17570 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
17580 74 65 33 56 64 62 65 4d 65 6d 45 78 70 61 6e 64  te3VdbeMemExpand
17590 42 6c 6f 62 28 70 52 65 63 29 20 29 20 67 6f 74  Blob(pRec) ) got
175a0 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 20 20  o no_mem;.      
175b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
175c0 5a 65 72 6f 20 2b 3d 20 70 52 65 63 2d 3e 75 2e  Zero += pRec->u.
175d0 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 6c  nZero;.        l
175e0 65 6e 20 2d 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a  en -= pRec->u.nZ
175f0 65 72 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ero;.      }.   
17600 20 7d 0a 20 20 20 20 6e 44 61 74 61 20 2b 3d 20   }.    nData += 
17610 6c 65 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73  len;.    testcas
17620 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
17630 31 32 37 20 29 3b 0a 20 20 20 20 74 65 73 74 63  127 );.    testc
17640 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
17650 3d 3d 31 32 38 20 29 3b 0a 20 20 20 20 6e 48 64  ==128 );.    nHd
17660 72 20 2b 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  r += serial_type
17670 3c 3d 31 32 37 20 3f 20 31 20 3a 20 73 71 6c 69  <=127 ? 1 : sqli
17680 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
17690 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
176a0 52 65 63 2d 3e 75 54 65 6d 70 20 3d 20 73 65 72  Rec->uTemp = ser
176b0 69 61 6c 5f 74 79 70 65 3b 0a 20 20 20 20 69 66  ial_type;.    if
176c0 28 20 70 52 65 63 3d 3d 70 44 61 74 61 30 20 29  ( pRec==pData0 )
176d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 52 65 63   break;.    pRec
176e0 2d 2d 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  --;.  }while(1);
176f0 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
17700 4f 46 3a 20 52 2d 32 32 35 36 34 2d 31 31 36 34  OF: R-22564-1164
17710 37 20 54 68 65 20 68 65 61 64 65 72 20 62 65 67  7 The header beg
17720 69 6e 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ins with a singl
17730 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 77 68  e varint.  ** wh
17740 69 63 68 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ich determines t
17750 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
17760 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
17770 68 65 61 64 65 72 2e 20 54 68 65 20 76 61 72 69  header. The vari
17780 6e 74 0a 20 20 2a 2a 20 76 61 6c 75 65 20 69 73  nt.  ** value is
17790 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
177a0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
177b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 73   including the s
177c0 69 7a 65 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20  ize varint.  ** 
177d0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 74 65 73  itself. */.  tes
177e0 74 63 61 73 65 28 20 6e 48 64 72 3d 3d 31 32 36  tcase( nHdr==126
177f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
17800 6e 48 64 72 3d 3d 31 32 37 20 29 3b 0a 20 20 69  nHdr==127 );.  i
17810 66 28 20 6e 48 64 72 3c 3d 31 32 36 20 29 7b 0a  f( nHdr<=126 ){.
17820 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f      /* The commo
17830 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e 48  n case */.    nH
17840 64 72 20 2b 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dr += 1;.  }else
17850 7b 0a 20 20 20 20 2f 2a 20 52 61 72 65 20 63 61  {.    /* Rare ca
17860 73 65 20 6f 66 20 61 20 72 65 61 6c 6c 79 20 6c  se of a really l
17870 61 72 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  arge header */. 
17880 20 20 20 6e 56 61 72 69 6e 74 20 3d 20 73 71 6c     nVarint = sql
17890 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48  ite3VarintLen(nH
178a0 64 72 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d  dr);.    nHdr +=
178b0 20 6e 56 61 72 69 6e 74 3b 0a 20 20 20 20 69 66   nVarint;.    if
178c0 28 20 6e 56 61 72 69 6e 74 3c 73 71 6c 69 74 65  ( nVarint<sqlite
178d0 33 56 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29  3VarintLen(nHdr)
178e0 20 29 20 6e 48 64 72 2b 2b 3b 0a 20 20 7d 0a 20   ) nHdr++;.  }. 
178f0 20 6e 42 79 74 65 20 3d 20 6e 48 64 72 2b 6e 44   nByte = nHdr+nD
17900 61 74 61 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ata;.  if( nByte
17910 2b 6e 5a 65 72 6f 3e 64 62 2d 3e 61 4c 69 6d 69  +nZero>db->aLimi
17920 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
17930 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
17940 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
17950 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
17960 74 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73  the output regis
17970 74 65 72 20 68 61 73 20 61 20 62 75 66 66 65 72  ter has a buffer
17980 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
17990 20 73 74 6f 72 65 20 0a 20 20 2a 2a 20 74 68 65   store .  ** the
179a0 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65   new record. The
179b0 20 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72   output register
179c0 20 28 70 4f 70 2d 3e 70 33 29 20 69 73 20 6e 6f   (pOp->p3) is no
179d0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 2a  t allowed to.  *
179e0 2a 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  * be one of the 
179f0 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73 20  input registers 
17a00 28 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 6c  (because the fol
17a10 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 0a 20  lowing call to. 
17a20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d   ** sqlite3VdbeM
17a30 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
17a40 28 29 20 63 6f 75 6c 64 20 63 6c 6f 62 62 65 72  () could clobber
17a50 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72   the value befor
17a60 65 20 69 74 20 69 73 20 75 73 65 64 29 2e 0a 20  e it is used).. 
17a70 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
17a80 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
17a90 52 65 73 69 7a 65 28 70 4f 75 74 2c 20 28 69 6e  Resize(pOut, (in
17aa0 74 29 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  t)nByte) ){.    
17ab0 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
17ac0 0a 20 20 7a 4e 65 77 52 65 63 6f 72 64 20 3d 20  .  zNewRecord = 
17ad0 28 75 38 20 2a 29 70 4f 75 74 2d 3e 7a 3b 0a 0a  (u8 *)pOut->z;..
17ae0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
17af0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 20 3d 20 70  ecord */.  i = p
17b00 75 74 56 61 72 69 6e 74 33 32 28 7a 4e 65 77 52  utVarint32(zNewR
17b10 65 63 6f 72 64 2c 20 6e 48 64 72 29 3b 0a 20 20  ecord, nHdr);.  
17b20 6a 20 3d 20 6e 48 64 72 3b 0a 20 20 61 73 73 65  j = nHdr;.  asse
17b30 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61 73  rt( pData0<=pLas
17b40 74 20 29 3b 0a 20 20 70 52 65 63 20 3d 20 70 44  t );.  pRec = pD
17b50 61 74 61 30 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ata0;.  do{.    
17b60 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 70 52  serial_type = pR
17b70 65 63 2d 3e 75 54 65 6d 70 3b 0a 20 20 20 20 2f  ec->uTemp;.    /
17b80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17b90 2d 30 36 35 32 39 2d 34 37 33 36 32 20 46 6f 6c  -06529-47362 Fol
17ba0 6c 6f 77 69 6e 67 20 74 68 65 20 73 69 7a 65 20  lowing the size 
17bb0 76 61 72 69 6e 74 20 61 72 65 20 6f 6e 65 20 6f  varint are one o
17bc0 72 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 61 64  r more.    ** ad
17bd0 64 69 74 69 6f 6e 61 6c 20 76 61 72 69 6e 74 73  ditional varints
17be0 2c 20 6f 6e 65 20 70 65 72 20 63 6f 6c 75 6d 6e  , one per column
17bf0 2e 20 2a 2f 0a 20 20 20 20 69 20 2b 3d 20 70 75  . */.    i += pu
17c00 74 56 61 72 69 6e 74 33 32 28 26 7a 4e 65 77 52  tVarint32(&zNewR
17c10 65 63 6f 72 64 5b 69 5d 2c 20 73 65 72 69 61 6c  ecord[i], serial
17c20 5f 74 79 70 65 29 3b 20 20 20 20 20 20 20 20 20  _type);         
17c30 20 20 20 2f 2a 20 73 65 72 69 61 6c 20 74 79 70     /* serial typ
17c40 65 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  e */.    /* EVID
17c50 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 33 36  ENCE-OF: R-64536
17c60 2d 35 31 37 32 38 20 54 68 65 20 76 61 6c 75 65  -51728 The value
17c70 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
17c80 6e 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 0a  n in the record.
17c90 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
17ca0 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 68 65  ly follow the he
17cb0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 6a 20 2b  ader. */.    j +
17cc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
17cd0 69 61 6c 50 75 74 28 26 7a 4e 65 77 52 65 63 6f  ialPut(&zNewReco
17ce0 72 64 5b 6a 5d 2c 20 70 52 65 63 2c 20 73 65 72  rd[j], pRec, ser
17cf0 69 61 6c 5f 74 79 70 65 29 3b 20 2f 2a 20 63 6f  ial_type); /* co
17d00 6e 74 65 6e 74 20 2a 2f 0a 20 20 7d 77 68 69 6c  ntent */.  }whil
17d10 65 28 20 28 2b 2b 70 52 65 63 29 3c 3d 70 4c 61  e( (++pRec)<=pLa
17d20 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st );.  assert( 
17d30 69 3d 3d 6e 48 64 72 20 29 3b 0a 20 20 61 73 73  i==nHdr );.  ass
17d40 65 72 74 28 20 6a 3d 3d 6e 42 79 74 65 20 29 3b  ert( j==nByte );
17d50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
17d60 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d 3e 70 33  >p3>0 && pOp->p3
17d70 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
17d80 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
17d90 70 4f 75 74 2d 3e 6e 20 3d 20 28 69 6e 74 29 6e  pOut->n = (int)n
17da0 42 79 74 65 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c  Byte;.  pOut->fl
17db0 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  ags = MEM_Blob;.
17dc0 20 20 69 66 28 20 6e 5a 65 72 6f 20 29 7b 0a 20    if( nZero ){. 
17dd0 20 20 20 70 4f 75 74 2d 3e 75 2e 6e 5a 65 72 6f     pOut->u.nZero
17de0 20 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4f   = nZero;.    pO
17df0 75 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ut->flags |= MEM
17e00 5f 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 52 45 47  _Zero;.  }.  REG
17e10 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
17e20 3e 70 33 2c 20 70 4f 75 74 29 3b 0a 20 20 55 50  >p3, pOut);.  UP
17e30 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
17e40 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b  E(pOut);.  break
17e50 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
17e60 43 6f 75 6e 74 20 50 31 20 50 32 20 2a 20 2a 20  Count P1 P2 * * 
17e70 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
17e80 5b 50 32 5d 3d 63 6f 75 6e 74 28 29 0a 2a 2a 0a  [P2]=count().**.
17e90 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6e 75 6d  ** Store the num
17ea0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 28  ber of entries (
17eb0 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
17ec0 29 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  ) in the table o
17ed0 72 20 69 6e 64 65 78 20 0a 2a 2a 20 6f 70 65 6e  r index .** open
17ee0 65 64 20 62 79 20 63 75 72 73 6f 72 20 50 31 20  ed by cursor P1 
17ef0 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a  in register P2.*
17f00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17f10 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
17f20 0a 63 61 73 65 20 4f 50 5f 43 6f 75 6e 74 3a 20  .case OP_Count: 
17f30 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74  {         /* out
17f40 32 20 2a 2f 0a 20 20 69 36 34 20 6e 45 6e 74 72  2 */.  i64 nEntr
17f50 79 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  y;.  BtCursor *p
17f60 43 72 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Crsr;..  assert(
17f70 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
17f80 31 5d 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  1]->eCurType==CU
17f90 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
17fa0 20 70 43 72 73 72 20 3d 20 70 2d 3e 61 70 43 73   pCrsr = p->apCs
17fb0 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 75 63 2e 70  r[pOp->p1]->uc.p
17fc0 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
17fd0 28 20 70 43 72 73 72 20 29 3b 0a 20 20 6e 45 6e  ( pCrsr );.  nEn
17fe0 74 72 79 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  try = 0;  /* Not
17ff0 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75   needed.  Only u
18000 73 65 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61  sed to silence a
18010 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72   warning. */.  r
18020 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18030 43 6f 75 6e 74 28 70 43 72 73 72 2c 20 26 6e 45  Count(pCrsr, &nE
18040 6e 74 72 79 29 3b 0a 20 20 69 66 28 20 72 63 20  ntry);.  if( rc 
18050 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
18060 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75  _to_error;.  pOu
18070 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
18080 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
18090 75 74 2d 3e 75 2e 69 20 3d 20 6e 45 6e 74 72 79  ut->u.i = nEntry
180a0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e  ;.  break;.}.#en
180b0 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  dif../* Opcode: 
180c0 53 61 76 65 70 6f 69 6e 74 20 50 31 20 2a 20 2a  Savepoint P1 * *
180d0 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e   P4 *.**.** Open
180e0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
180f0 6c 62 61 63 6b 20 74 68 65 20 73 61 76 65 70 6f  lback the savepo
18100 69 6e 74 20 6e 61 6d 65 64 20 62 79 20 70 61 72  int named by par
18110 61 6d 65 74 65 72 20 50 34 2c 20 64 65 70 65 6e  ameter P4, depen
18120 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 76  ding.** on the v
18130 61 6c 75 65 20 6f 66 20 50 31 2e 20 54 6f 20 6f  alue of P1. To o
18140 70 65 6e 20 61 20 6e 65 77 20 73 61 76 65 70 6f  pen a new savepo
18150 69 6e 74 2c 20 50 31 3d 3d 30 2e 20 54 6f 20 72  int, P1==0. To r
18160 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
18170 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 73  an.** existing s
18180 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d 3d 31 2c  avepoint, P1==1,
18190 20 6f 72 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20   or to rollback 
181a0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 61 76 65  an existing save
181b0 70 6f 69 6e 74 20 50 31 3d 3d 32 2e 0a 2a 2f 0a  point P1==2..*/.
181c0 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
181d0 74 3a 20 7b 0a 20 20 69 6e 74 20 70 31 3b 20 20  t: {.  int p1;  
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
18200 6f 66 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  of P1 operand */
18210 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 61     /* Name of sa
18240 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  vepoint */.  int
18250 20 6e 4e 61 6d 65 3b 0a 20 20 53 61 76 65 70 6f   nName;.  Savepo
18260 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 53 61 76  int *pNew;.  Sav
18270 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
18280 6e 74 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20  nt;.  Savepoint 
18290 2a 70 54 6d 70 3b 0a 20 20 69 6e 74 20 69 53 61  *pTmp;.  int iSa
182a0 76 65 70 6f 69 6e 74 3b 0a 20 20 69 6e 74 20 69  vepoint;.  int i
182b0 69 3b 0a 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e  i;..  p1 = pOp->
182c0 70 31 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 70 4f  p1;.  zName = pO
182d0 70 2d 3e 70 34 2e 7a 3b 0a 0a 20 20 2f 2a 20 41  p->p4.z;..  /* A
182e0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 70  ssert that the p
182f0 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 76  1 parameter is v
18300 61 6c 69 64 2e 20 41 6c 73 6f 20 74 68 61 74 20  alid. Also that 
18310 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  if there is no o
18320 70 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  pen.  ** transac
18330 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 72 65  tion, then there
18340 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 79 20 73   cannot be any s
18350 61 76 65 70 6f 69 6e 74 73 2e 20 0a 20 20 2a 2f  avepoints. .  */
18360 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
18370 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20  Savepoint==0 || 
18380 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
18390 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
183a0 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45 47  1==SAVEPOINT_BEG
183b0 49 4e 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e  IN||p1==SAVEPOIN
183c0 54 5f 52 45 4c 45 41 53 45 7c 7c 70 31 3d 3d 53  T_RELEASE||p1==S
183d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
183e0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  K );.  assert( d
183f0 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 7c 7c  b->pSavepoint ||
18400 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69   db->isTransacti
18410 6f 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  onSavepoint==0 )
18420 3b 0a 20 20 61 73 73 65 72 74 28 20 63 68 65 63  ;.  assert( chec
18430 6b 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28  kSavepointCount(
18440 64 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  db) );.  assert(
18450 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b   p->bIsReader );
18460 0a 0a 20 20 69 66 28 20 70 31 3d 3d 53 41 56 45  ..  if( p1==SAVE
18470 50 4f 49 4e 54 5f 42 45 47 49 4e 20 29 7b 0a 20  POINT_BEGIN ){. 
18480 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
18490 57 72 69 74 65 3e 30 20 29 7b 0a 20 20 20 20 20  Write>0 ){.     
184a0 20 2f 2a 20 41 20 6e 65 77 20 73 61 76 65 70 6f   /* A new savepo
184b0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 72  int cannot be cr
184c0 65 61 74 65 64 20 69 66 20 74 68 65 72 65 20 61  eated if there a
184d0 72 65 20 61 63 74 69 76 65 20 77 72 69 74 65 20  re active write 
184e0 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
184f0 65 6e 74 73 20 28 69 2e 65 2e 20 6f 70 65 6e 20  ents (i.e. open 
18500 72 65 61 64 2f 77 72 69 74 65 20 69 6e 63 72 65  read/write incre
18510 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 68 61 6e 64  mental blob hand
18520 6c 65 73 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  les)..      */. 
18530 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18540 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74  Error(p, "cannot
18550 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20   open savepoint 
18560 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  - SQL statements
18570 20 69 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a   in progress");.
18580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18590 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
185a0 65 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  e{.      nName =
185b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
185c0 28 7a 4e 61 6d 65 29 3b 0a 0a 23 69 66 6e 64 65  (zName);..#ifnde
185d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
185e0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
185f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73   /* This call is
18600 20 4f 6b 20 65 76 65 6e 20 69 66 20 74 68 69 73   Ok even if this
18610 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
18620 74 75 61 6c 6c 79 20 61 20 74 72 61 6e 73 61 63  tually a transac
18630 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 73 61  tion.      ** sa
18640 76 65 70 6f 69 6e 74 20 28 61 6e 64 20 74 68 65  vepoint (and the
18650 72 65 66 6f 72 65 20 73 68 6f 75 6c 64 20 6e 6f  refore should no
18660 74 20 70 72 6f 6d 70 74 20 78 53 61 76 65 70 6f  t prompt xSavepo
18670 69 6e 74 28 29 29 20 63 61 6c 6c 62 61 63 6b 73  int()) callbacks
18680 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  ..      ** If th
18690 69 73 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  is is a transact
186a0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 62 65  ion savepoint be
186b0 69 6e 67 20 6f 70 65 6e 65 64 2c 20 69 74 20 69  ing opened, it i
186c0 73 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 20  s guaranteed.   
186d0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 64     ** that the d
186e0 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
186f0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 20 2a 2f  ay is empty.  */
18700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
18710 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
18720 20 7c 7c 20 64 62 2d 3e 6e 56 54 72 61 6e 73 3d   || db->nVTrans=
18730 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18740 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
18750 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
18760 49 4e 54 5f 42 45 47 49 4e 2c 0a 20 20 20 20 20  INT_BEGIN,.     
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e             db->n
18790 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
187a0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
187b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
187c0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
187d0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65  due_to_error;.#e
187e0 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 43  ndif..      /* C
187f0 72 65 61 74 65 20 61 20 6e 65 77 20 73 61 76 65  reate a new save
18800 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 2e  point structure.
18810 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   */.      pNew =
18820 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18830 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
18840 28 53 61 76 65 70 6f 69 6e 74 29 2b 6e 4e 61 6d  (Savepoint)+nNam
18850 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e+1);.      if( 
18860 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
18870 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63  pNew->zName = (c
18880 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  har *)&pNew[1];.
18890 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
188a0 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  New->zName, zNam
188b0 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 20  e, nName+1);.   
188c0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20   .        /* If 
188d0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
188e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
188f0 65 6e 20 6d 61 72 6b 20 74 68 69 73 20 61 73 20  en mark this as 
18900 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
18910 20 20 2a 2a 20 22 74 72 61 6e 73 61 63 74 69 6f    ** "transactio
18920 6e 20 73 61 76 65 70 6f 69 6e 74 22 2e 20 2a 2f  n savepoint". */
18930 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
18940 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
18950 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
18960 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20  oCommit = 0;.   
18970 20 20 20 20 20 20 20 64 62 2d 3e 69 73 54 72 61         db->isTra
18980 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
18990 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
189a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
189b0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 2b  db->nSavepoint++
189c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
189d0 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65       /* Link the
189e0 20 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 69   new savepoint i
189f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18a00 20 68 61 6e 64 6c 65 27 73 20 6c 69 73 74 2e 20   handle's list. 
18a10 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
18a20 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 53 61  >pNext = db->pSa
18a30 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 20  vepoint;.       
18a40 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
18a50 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
18a60 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64 43  pNew->nDeferredC
18a70 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66 65 72  ons = db->nDefer
18a80 72 65 64 43 6f 6e 73 3b 0a 20 20 20 20 20 20 20  redCons;.       
18a90 20 70 4e 65 77 2d 3e 6e 44 65 66 65 72 72 65 64   pNew->nDeferred
18aa0 49 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  ImmCons = db->nD
18ab0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a  eferredImmCons;.
18ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 61 76 65  }else{.    iSave
18ae0 70 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  point = 0;..    
18af0 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  /* Find the name
18b00 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  d savepoint. If 
18b10 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
18b20 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
18b30 20 61 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   an.    ** an er
18b40 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18b50 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f  to the user.  */
18b60 0a 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20  .    for(.      
18b70 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62 2d  pSavepoint = db-
18b80 3e 70 53 61 76 65 70 6f 69 6e 74 3b 20 0a 20 20  >pSavepoint; .  
18b90 20 20 20 20 70 53 61 76 65 70 6f 69 6e 74 20 26      pSavepoint &
18ba0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
18bb0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 7a 4e 61  (pSavepoint->zNa
18bc0 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
18bd0 20 20 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70    pSavepoint = p
18be0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
18bf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 53  .    ){.      iS
18c00 61 76 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20  avepoint++;.    
18c10 7d 0a 20 20 20 20 69 66 28 20 21 70 53 61 76 65  }.    if( !pSave
18c20 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  point ){.      s
18c30 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
18c40 70 2c 20 22 6e 6f 20 73 75 63 68 20 73 61 76 65  p, "no such save
18c50 70 6f 69 6e 74 3a 20 25 73 22 2c 20 7a 4e 61 6d  point: %s", zNam
18c60 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  e);.      rc = S
18c70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
18c80 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 6e   }else if( db->n
18c90 56 64 62 65 57 72 69 74 65 3e 30 20 26 26 20 70  VdbeWrite>0 && p
18ca0 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
18cb0 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EASE ){.      /*
18cc0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18cd0 62 6c 65 20 74 6f 20 72 65 6c 65 61 73 65 20 28  ble to release (
18ce0 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f  commit) a savepo
18cf0 69 6e 74 20 69 66 20 74 68 65 72 65 20 61 72 65  int if there are
18d00 20 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 69 76   .      ** activ
18d10 65 20 77 72 69 74 65 20 73 74 61 74 65 6d 65 6e  e write statemen
18d20 74 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ts..      */.   
18d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
18d40 72 6f 72 28 70 2c 20 22 63 61 6e 6e 6f 74 20 72  ror(p, "cannot r
18d50 65 6c 65 61 73 65 20 73 61 76 65 70 6f 69 6e 74  elease savepoint
18d60 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   - ".           
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18d80 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
18d90 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
18da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18db0 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
18dc0 0a 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72  ..      /* Deter
18dd0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
18de0 6e 6f 74 20 74 68 69 73 20 69 73 20 61 20 74 72  not this is a tr
18df0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
18e00 69 6e 74 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20  int. If so,.    
18e10 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 69 73    ** and this is
18e20 20 61 20 52 45 4c 45 41 53 45 20 63 6f 6d 6d 61   a RELEASE comma
18e30 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
18e40 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
18e50 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f   .      ** is co
18e60 6d 6d 69 74 74 65 64 2e 20 0a 20 20 20 20 20 20  mmitted. .      
18e70 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 54  */.      int isT
18e80 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 53 61  ransaction = pSa
18e90 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74 3d 3d  vepoint->pNext==
18ea0 30 20 26 26 20 64 62 2d 3e 69 73 54 72 61 6e 73  0 && db->isTrans
18eb0 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 3b  actionSavepoint;
18ec0 0a 20 20 20 20 20 20 69 66 28 20 69 73 54 72 61  .      if( isTra
18ed0 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 31 3d 3d  nsaction && p1==
18ee0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
18ef0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  E ){.        if(
18f00 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64   (rc = sqlite3Vd
18f10 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 29  beCheckFk(p, 1))
18f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64           goto vd
18f40 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  be_return;.     
18f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d     }.        db-
18f60 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
18f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
18f80 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3d  ite3VdbeHalt(p)=
18f90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
18fa0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 63 20            p->pc 
18fb0 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f  = (int)(pOp - aO
18fc0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  p);.          db
18fd0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30  ->autoCommit = 0
18fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  ;.          p->r
18ff0 63 20 3d 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  c = rc = SQLITE_
19000 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
19010 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19030 20 20 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61      db->isTransa
19040 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
19050 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
19060 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 7d 65   p->rc;.      }e
19070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
19080 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3b   isSchemaChange;
19090 0a 20 20 20 20 20 20 20 20 69 53 61 76 65 70 6f  .        iSavepo
190a0 69 6e 74 20 3d 20 64 62 2d 3e 6e 53 61 76 65 70  int = db->nSavep
190b0 6f 69 6e 74 20 2d 20 69 53 61 76 65 70 6f 69 6e  oint - iSavepoin
190c0 74 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t - 1;.        i
190d0 66 28 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  f( p1==SAVEPOINT
190e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
190f0 20 20 20 20 20 20 20 69 73 53 63 68 65 6d 61 43         isSchemaC
19100 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44 62  hange = (db->mDb
19110 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 53  Flags & DBFLAG_S
19120 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30 3b  chemaChange)!=0;
19130 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
19140 69 3d 30 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b  i=0; ii<db->nDb;
19150 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
19160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19170 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
19180 6f 72 73 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  ors(db->aDb[ii].
19190 70 42 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pBt,.           
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
191c0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
191d0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 20 20 20 20 69 73 53 63 68 65            isSche
19200 6d 61 43 68 61 6e 67 65 3d 3d 30 29 3b 0a 20 20  maChange==0);.  
19210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
19220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19230 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
19240 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  error;.         
19250 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
19260 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 63  {.          isSc
19270 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 30 3b 0a  hemaChange = 0;.
19280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19290 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64    for(ii=0; ii<d
192a0 62 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20  b->nDb; ii++){. 
192b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
192c0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
192d0 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 69 5d 2e  int(db->aDb[ii].
192e0 70 42 74 2c 20 70 31 2c 20 69 53 61 76 65 70 6f  pBt, p1, iSavepo
192f0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
19300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
19320 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19330 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
19340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
19350 20 20 20 20 20 20 20 20 69 66 28 20 69 73 53 63          if( isSc
19360 68 65 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20  hemaChange ){.  
19370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19380 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
19390 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
193a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
193b0 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
193c0 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
193d0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 44 62           db->mDb
193e0 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
193f0 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
19400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19410 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67 61    .      /* Rega
19420 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
19430 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45  r this is a RELE
19440 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c  ASE or ROLLBACK,
19450 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20 20   destroy all .  
19460 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74      ** savepoint
19470 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65 20  s nested inside 
19480 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  of the savepoint
19490 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64 20   being operated 
194a0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  on. */.      whi
194b0 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
194c0 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20 29  nt!=pSavepoint )
194d0 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20 3d  {.        pTmp =
194e0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
194f0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
19500 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
19510 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
19520 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19530 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   pTmp);.        
19540 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d 2d  db->nSavepoint--
19550 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19560 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20 52   /* If it is a R
19570 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65 73  ELEASE, then des
19580 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
19590 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65  nt being operate
195a0 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  d on .      ** t
195b0 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20 52  oo. If it is a R
195c0 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65 6e  OLLBACK TO, then
195d0 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   set the number 
195e0 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20 20 20  of deferred .   
195f0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
19600 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65 73   violations pres
19610 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
19620 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ase to the value
19630 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a 2a   stored.      **
19640 20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70 6f   when the savepo
19650 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
19660 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
19670 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  1==SAVEPOINT_REL
19680 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  EASE ){.        
19690 61 73 73 65 72 74 28 20 70 53 61 76 65 70 6f 69  assert( pSavepoi
196a0 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f 69  nt==db->pSavepoi
196b0 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64 62  nt );.        db
196c0 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  ->pSavepoint = p
196d0 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78 74  Savepoint->pNext
196e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
196f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 61 76  3DbFree(db, pSav
19700 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
19710 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63 74   if( !isTransact
19720 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
19730 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d   db->nSavepoint-
19740 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
19750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19760 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
19770 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ons = pSavepoint
19780 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
19790 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  .        db->nDe
197a0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
197b0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65 66  pSavepoint->nDef
197c0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
197d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
197e0 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 20   !isTransaction 
197f0 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  || p1==SAVEPOINT
19800 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
19810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19820 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
19830 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69 6e  b, p1, iSavepoin
19840 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
19850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19860 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
19870 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d  o_error;.      }
19880 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19890 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
198a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a  _due_to_error;..
198b0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
198c0 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d 69  pcode: AutoCommi
198d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
198e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74 61  .** Set the data
198f0 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  base auto-commit
19900 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20 6f   flag to P1 (1 o
19910 72 20 30 29 2e 20 49 66 20 50 32 20 69 73 20 74  r 0). If P2 is t
19920 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61 63  rue, roll.** bac
19930 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  k any currently 
19940 61 63 74 69 76 65 20 62 74 72 65 65 20 74 72 61  active btree tra
19950 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74 68  nsactions. If th
19960 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74 69  ere are any acti
19970 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72 74  ve.** VMs (apart
19980 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29 2c   from this one),
19990 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43 4b   then a ROLLBACK
199a0 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d 49   fails.  A COMMI
199b0 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74 68  T fails if.** th
199c0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 77  ere are active w
199d0 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61 63  riting VMs or ac
199e0 74 69 76 65 20 56 4d 73 20 74 68 61 74 20 75 73  tive VMs that us
199f0 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 0a  e shared cache..
19a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74 72  **.** This instr
19a10 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74 68  uction causes th
19a20 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a 2f  e VM to halt..*/
19a30 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d  .case OP_AutoCom
19a40 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65 73  mit: {.  int des
19a50 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b 0a  iredAutoCommit;.
19a60 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b 3b    int iRollback;
19a70 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f 43  ..  desiredAutoC
19a80 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31 3b  ommit = pOp->p1;
19a90 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20 70  .  iRollback = p
19aa0 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
19ab0 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19ac0 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72 65  mit==1 || desire
19ad0 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  dAutoCommit==0 )
19ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73 69  ;.  assert( desi
19af0 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 31  redAutoCommit==1
19b00 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d 30   || iRollback==0
19b10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
19b20 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
19b30 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  );  /* At least 
19b40 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20 61  this one VM is a
19b50 63 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65 72  ctive */.  asser
19b60 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  t( p->bIsReader 
19b70 29 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72 65  );..  if( desire
19b80 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62 2d  dAutoCommit!=db-
19b90 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
19ba0 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63 6b     if( iRollback
19bb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19bc0 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f 6d  ( desiredAutoCom
19bd0 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mit==1 );.      
19be0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
19bf0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
19c00 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
19c10 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
19c20 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  mit = 1;.    }el
19c30 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41 75  se if( desiredAu
19c40 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  toCommit && db->
19c50 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b 0a  nVdbeWrite>0 ){.
19c60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
19c70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d 70   instruction imp
19c80 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49 54  lements a COMMIT
19c90 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20 61   and other VMs a
19ca0 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20 20  re writing.     
19cb0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72   ** return an er
19cc0 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ror indicating t
19cd0 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56 4d  hat the other VM
19ce0 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  s must complete 
19cf0 66 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a 2f  first. .      */
19d00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19d10 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e 6e  beError(p, "cann
19d20 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61  ot commit transa
19d30 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20 20  ction - ".      
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d 65      "SQL stateme
19d60 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 22  nts in progress"
19d70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
19d80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
19d90 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19da0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 65  to_error;.    }e
19db0 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
19dc0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
19dd0 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f  (p, 1))!=SQLITE_
19de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19df0 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
19e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
19e10 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19e20 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f 43  (u8)desiredAutoC
19e30 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ommit;.    }.   
19e40 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
19e50 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
19e60 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70 2d  BUSY ){.      p-
19e70 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
19e80 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64 62  - aOp);.      db
19e90 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 28  ->autoCommit = (
19ea0 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75 74  u8)(1-desiredAut
19eb0 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  oCommit);.      
19ec0 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51 4c  p->rc = rc = SQL
19ed0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
19ee0 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72 6e  goto vdbe_return
19ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19f00 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
19f10 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  nt==0 );.    sql
19f20 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
19f30 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66 28  nts(db);.    if(
19f40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19f50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19f60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
19f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19f80 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
19f90 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
19fa0 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 7d  vdbe_return;.  }
19fb0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19fc0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20  3VdbeError(p,.  
19fd0 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64 41        (!desiredA
19fe0 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e 6e  utoCommit)?"cann
19ff0 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
1a000 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  action within a 
1a010 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a 20  transaction":(. 
1a020 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61 63         (iRollbac
1a030 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c 62  k)?"cannot rollb
1a040 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  ack - no transac
1a050 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 3a  tion is active":
1a060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a070 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d      "cannot comm
1a080 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74  it - no transact
1a090 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29 29  ion is active"))
1a0a0 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  ;.         .    
1a0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1a0c0 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  R;.    goto abor
1a0d0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1a0e0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
1a0f0 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e 73  /* Opcode: Trans
1a100 61 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20  action P1 P2 P3 
1a110 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67 69  P4 P5.**.** Begi
1a120 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
1a130 6f 6e 20 64 61 74 61 62 61 73 65 20 50 31 20 69  on database P1 i
1a140 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1a150 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1a160 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66 20  * active..** If 
1a170 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P2 is non-zero, 
1a180 74 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  then a write-tra
1a190 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1a1a0 74 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a 2a  ted, or if a .**
1a1b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a1c0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1a1d0 69 76 65 2c 20 69 74 20 69 73 20 75 70 67 72 61  ive, it is upgra
1a1e0 64 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d 74  ded to a write-t
1a1f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 49  ransaction..** I
1a200 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74 68  f P2 is zero, th
1a210 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
1a220 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1a230 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68  ..**.** P1 is th
1a240 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
1a250 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
1a260 77 68 69 63 68 20 74 68 65 20 74 72 61 6e 73 61  which the transa
1a270 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61 72  ction is.** star
1a280 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69 73  ted.  Index 0 is
1a290 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1a2a0 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64 65  se file and inde
1a2b0 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66 69  x 1 is the.** fi
1a2c0 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70  le used for temp
1a2d0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
1a2e0 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20 6d  ndices of 2 or m
1a2f0 6f 72 65 20 61 72 65 20 75 73 65 64 20 66 6f 72  ore are used for
1a300 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
1a310 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  abases..**.** If
1a320 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1a330 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1a340 61 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73 65  and the Vdbe.use
1a350 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c 61  sStmtJournal fla
1a360 67 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74 68  g is.** true (th
1a370 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69  is flag is set i
1a380 66 20 74 68 65 20 56 64 62 65 20 6d 61 79 20 6d  f the Vdbe may m
1a390 6f 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e 20  odify more than 
1a3a0 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79 0a  one row and may.
1a3b0 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
1a3c0 54 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61 20  T exception), a 
1a3d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1a3e0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20 62  ction may also b
1a3f0 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f 72  e opened..** Mor
1a400 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1a410 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1a420 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
1a430 64 20 69 66 66 20 74 68 65 20 64 61 74 61 62 61  d iff the databa
1a440 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
1a450 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
1a460 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  t in autocommit 
1a470 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65 72  mode, or if ther
1a480 65 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20 61  e are other.** a
1a490 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1a4a0 2e 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74 72  . A statement tr
1a4b0 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  ansaction allows
1a4c0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
1a4d0 65 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44 42  e by this.** VDB
1a4e0 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  E to be rolled b
1a4f0 61 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72 72  ack after an err
1a500 6f 72 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  or without havin
1a510 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  g to roll back t
1a520 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72 61  he.** entire tra
1a530 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f 20  nsaction. If no 
1a540 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1a550 65 72 65 64 2c 20 74 68 65 20 73 74 61 74 65 6d  ered, the statem
1a560 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
1a570 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ** will automati
1a580 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68 65  cally commit whe
1a590 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c 74 73  n the VDBE halts
1a5a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30  ..**.** If P5!=0
1a5b0 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64   then this opcod
1a5c0 65 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68  e also checks th
1a5d0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1a5e0 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61 6e  against P3.** an
1a5f0 64 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e  d the schema gen
1a600 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  eration counter 
1a610 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20 54  against P4..** T
1a620 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65  he cookie change
1a630 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65 6e  s its value when
1a640 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61 73  ever the databas
1a650 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
1a660 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74  ..** This operat
1a670 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 64  ion is used to d
1a680 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74 20  etect when that 
1a690 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20 63  the cookie has c
1a6a0 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74 68  hanged.** and th
1a6b0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1a6c0 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f 20  rocess needs to 
1a6d0 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65 6d  reread the schem
1a6e0 61 2e 20 20 49 66 20 74 68 65 20 73 63 68 65 6d  a.  If the schem
1a6f0 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20 50  a.** cookie in P
1a700 33 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  3 differs from t
1a710 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1a720 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a730 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69 66   header or.** if
1a740 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e 65   the schema gene
1a750 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  ration counter i
1a760 6e 20 50 34 20 64 69 66 66 65 72 73 20 66 72 6f  n P4 differs fro
1a770 6d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  m the current.**
1a780 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e   generation coun
1a790 74 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  ter, then an SQL
1a7a0 49 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f 72  ITE_SCHEMA error
1a7b0 20 69 73 20 72 61 69 73 65 64 20 61 6e 64 20 65   is raised and e
1a7c0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c 74  xecution.** halt
1a7d0 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1a7e0 73 74 65 70 28 29 20 77 72 61 70 70 65 72 20 66  step() wrapper f
1a7f0 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74 68  unction might th
1a800 65 6e 20 72 65 70 72 65 70 61 72 65 20 74 68 65  en reprepare the
1a810 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  .** statement an
1a820 64 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d 20  d rerun it from 
1a830 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a  the beginning..*
1a840 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61  /.case OP_Transa
1a850 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65 65  ction: {.  Btree
1a860 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d 65   *pBt;.  int iMe
1a870 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b 0a  ta;.  int iGen;.
1a880 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
1a890 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  sReader );.  ass
1a8a0 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  ert( p->readOnly
1a8b0 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d  ==0 || pOp->p2==
1a8c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a8d0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
1a8e0 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a  ->p1<db->nDb );.
1a8f0 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b    assert( DbMask
1a900 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  Test(p->btreeMas
1a910 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  k, pOp->p1) );. 
1a920 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20   if( pOp->p2 && 
1a930 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
1a940 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21 3d  ITE_QueryOnly)!=
1a950 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1a960 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1a970 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1a980 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
1a990 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b    pBt = db->aDb[
1a9a0 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a 20  pOp->p1].pBt;.. 
1a9b0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
1a9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a9d0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
1a9e0 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 74   pOp->p2);.    t
1a9f0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
1aa00 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
1aa10 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
1aa20 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
1aa30 53 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a 20  SY_RECOVERY );. 
1aa40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aa50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1aa60 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
1aa70 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
1aa80 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74      p->pc = (int
1aa90 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20  )(pOp - aOp);.  
1aaa0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
1aab0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76  ;.        goto v
1aac0 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20  dbe_return;.    
1aad0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 61    }.      goto a
1aae0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
1aaf0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
1ab00 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d 3e  ( pOp->p2 && p->
1ab10 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
1ab20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61 75  .     && (db->au
1ab30 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
1ab40 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29 20  b->nVdbeRead>1) 
1ab50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1ab60 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1ab70 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
1ab80 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1ab90 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >iStatement==0 )
1aba0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1abb0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
1abc0 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76 65  >=0 && db->nSave
1abd0 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20 20  point>=0 );.    
1abe0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
1abf0 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20 70  nt++; .        p
1ac00 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 64  ->iStatement = d
1ac10 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20  b->nSavepoint + 
1ac20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b 0a  db->nStatement;.
1ac30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
1ac40 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
1ac50 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
1ac60 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70 2d  EPOINT_BEGIN, p-
1ac70 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b 0a  >iStatement-1);.
1ac80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ac90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1acb0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70 42  treeBeginStmt(pB
1acc0 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t, p->iStatement
1acd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1ace0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 63    /* Store the c
1acf0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
1ad00 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
1ad10 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
1ad20 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 2a  nstraint.      *
1ad30 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74 68  * counter. If th
1ad40 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1ad50 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
1ad60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
1ad70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
1ad80 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75 6e  lue of this coun
1ad90 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ter needs to be 
1ada0 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20 2a  restored too.  *
1adb0 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d 74  /.      p->nStmt
1adc0 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44  DefCons = db->nD
1add0 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20 20  eferredCons;.   
1ade0 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d     p->nStmtDefIm
1adf0 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65 66  mCons = db->nDef
1ae00 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20 20  erredImmCons;.  
1ae10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68    }..    /* Gath
1ae20 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  er the schema ve
1ae30 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f 72  rsion number for
1ae40 20 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20 20 2a   checking:.    *
1ae50 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
1ae60 2d 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35 31 31  -OF: R-03189-511
1ae70 33 35 20 41 73 20 65 61 63 68 20 53 51 4c 20 73  35 As each SQL s
1ae80 74 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c 20 74  tatement runs, t
1ae90 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a 2a  he schema.    **
1aea0 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68 65 63   version is chec
1aeb0 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ked to ensure th
1aec0 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  at the schema ha
1aed0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73 69  s not changed si
1aee0 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  nce the.    ** S
1aef0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  QL statement was
1af00 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20 2a   prepared..    *
1af10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1af20 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20 42  eeGetMeta(pBt, B
1af30 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
1af40 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d 65  ION, (u32 *)&iMe
1af50 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d 20  ta);.    iGen = 
1af60 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d  db->aDb[pOp->p1]
1af70 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72  .pSchema->iGener
1af80 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ation;.  }else{.
1af90 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74 61      iGen = iMeta
1afa0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
1afb0 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c  rt( pOp->p5==0 |
1afc0 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  | pOp->p4type==P
1afd0 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66 28  4_INT32 );.  if(
1afe0 20 70 4f 70 2d 3e 70 35 20 26 26 20 28 69 4d 65   pOp->p5 && (iMe
1aff0 74 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c 20 69  ta!=pOp->p3 || i
1b000 47 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29 20  Gen!=pOp->p4.i) 
1b010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1b020 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1b030 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
1b040 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62  rMsg = sqlite3Db
1b050 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74 61  StrDup(db, "data
1b060 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
1b070 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20 2f  changed");.    /
1b080 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61 2d  * If the schema-
1b090 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65 20  cookie from the 
1b0a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
1b0b0 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69 65  tches the cookie
1b0c0 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20   .    ** stored 
1b0d0 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  with the in-memo
1b0e0 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
1b0f0 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2c  n of the schema,
1b100 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72   do.    ** not r
1b110 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d 61  eload the schema
1b120 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1b130 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  se file..    **.
1b140 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75 61      ** If virtua
1b150 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e 20  l-tables are in 
1b160 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f 74  use, this is not
1b170 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a   just an optimiz
1b180 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f 66  ation..    ** Of
1b190 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73 74  ten, v-tables st
1b1a0 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20 69  ore their data i
1b1b0 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 74  n other SQLite t
1b1c0 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20 20  ables, which.   
1b1d0 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64 20   ** are queried 
1b1e0 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65 78  from within xNex
1b1f0 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76 2d  t() and other v-
1b200 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75 73  table methods us
1b210 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70 61  ing.    ** prepa
1b220 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66 20  red queries. If 
1b230 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73 20  such a query is 
1b240 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65 20  out-of-date, we 
1b250 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a 20  do not want to. 
1b260 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
1b270 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1b280 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20 63  a, as the user c
1b290 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  ode implementing
1b2a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74 61   the.    ** v-ta
1b2b0 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20 74  ble would have t
1b2c0 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20 74  o be ready for t
1b2d0 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  he sqlite3_vtab 
1b2e0 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
1b2f0 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  .    ** to be in
1b300 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65 76  validated whenev
1b310 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  er sqlite3_step(
1b320 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  ) is called from
1b330 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
1b340 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64  a v-table method
1b350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b360 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
1b370 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
1b380 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61 20  a_cookie!=iMeta 
1b390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b3a0 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 64  ResetOneSchema(d
1b3b0 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20  b, pOp->p1);.   
1b3c0 20 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65   }.    p->expire
1b3d0 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  d = 1;.    rc = 
1b3e0 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a 20  SQLITE_SCHEMA;. 
1b3f0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
1b400 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1b410 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a  error;.  break;.
1b420 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  }../* Opcode: Re
1b430 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20 50  adCookie P1 P2 P
1b440 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  3 * *.**.** Read
1b450 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
1b460 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  3 from database 
1b470 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  P1 and write it 
1b480 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
1b490 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74 68  ..** P3==1 is th
1b4a0 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
1b4b0 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65 20  .  P3==2 is the 
1b4c0 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
1b4d0 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68 65  .** P3==3 is the
1b4e0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
1b4f0 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20 61  er cache size, a
1b500 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50 31  nd so forth.  P1
1b510 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d 61  ==0 is.** the ma
1b520 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1b530 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74 68   and P1==1 is th
1b540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b550 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
1b560 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b570 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  s..**.** There m
1b580 75 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c 6f  ust be a read-lo
1b590 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b5a0 73 65 20 28 65 69 74 68 65 72 20 61 20 74 72 61  se (either a tra
1b5b0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
1b5c0 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 20 74   be started or t
1b5d0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1b5e0 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65 66  open cursor) bef
1b5f0 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e 67  ore.** executing
1b600 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1b610 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65  n..*/.case OP_Re
1b620 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20 20  adCookie: {     
1b630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
1b640 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74 61  2 */.  int iMeta
1b650 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69  ;.  int iDb;.  i
1b660 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20 61  nt iCookie;..  a
1b670 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
1b680 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20 70  der );.  iDb = p
1b690 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b 69  Op->p1;.  iCooki
1b6a0 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61  e = pOp->p3;.  a
1b6b0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 53  ssert( pOp->p3<S
1b6c0 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45  QLITE_N_BTREE_ME
1b6d0 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TA );.  assert( 
1b6e0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
1b6f0 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
1b700 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  t( db->aDb[iDb].
1b710 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
1b720 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
1b730 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62  ->btreeMask, iDb
1b740 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ) );..  sqlite3B
1b750 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d 3e  treeGetMeta(db->
1b760 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69 43  aDb[iDb].pBt, iC
1b770 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26 69  ookie, (u32 *)&i
1b780 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d 20  Meta);.  pOut = 
1b790 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
1b7a0 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
1b7b0 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20 62  u.i = iMeta;.  b
1b7c0 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
1b7d0 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50 31  de: SetCookie P1
1b7e0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
1b7f0 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67   Write the integ
1b800 65 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74 6f  er value P3 into
1b810 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20 50   cookie number P
1b820 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50 31  2 of database P1
1b830 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74 68  ..** P2==1 is th
1b840 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
1b850 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65 20  .  P2==2 is the 
1b860 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 2e  database format.
1b870 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68 65  .** P2==3 is the
1b880 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61 67   recommended pag
1b890 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69 7a  er cache .** siz
1b8a0 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  e, and so forth.
1b8b0 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20 6d    P1==0 is the m
1b8c0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1b8d0 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74  e and P1==1 is t
1b8e0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
1b8f0 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74 6f  file used to sto
1b900 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  re temporary tab
1b910 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  les..**.** A tra
1b920 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1b930 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1b940 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20 6f  executing this o
1b950 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  pcode..*/.case O
1b960 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a 20  P_SetCookie: {. 
1b970 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 73 71 6c   Db *pDb;..  sql
1b980 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69 74  ite3VdbeIncrWrit
1b990 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a  eCounter(p, 0);.
1b9a0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1b9b0 32 3c 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45  2<SQLITE_N_BTREE
1b9c0 5f 4d 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72  _META );.  asser
1b9d0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
1b9e0 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
1b9f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
1ba00 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
1ba10 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20  eMask, pOp->p1) 
1ba20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ba30 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
1ba40 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
1ba50 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
1ba60 72 74 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20  rt( pDb->pBt!=0 
1ba70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1ba80 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1ba90 65 6c 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c  eld(db, pOp->p1,
1baa0 20 30 29 20 29 3b 0a 20 20 2f 2a 20 53 65 65 20   0) );.  /* See 
1bab0 6e 6f 74 65 20 61 62 6f 75 74 20 69 6e 64 65 78  note about index
1bac0 20 73 68 69 66 74 69 6e 67 20 6f 6e 20 4f 50 5f   shifting on OP_
1bad0 52 65 61 64 43 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ReadCookie */.  
1bae0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1baf0 65 55 70 64 61 74 65 4d 65 74 61 28 70 44 62 2d  eUpdateMeta(pDb-
1bb00 3e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  >pBt, pOp->p2, p
1bb10 4f 70 2d 3e 70 33 29 3b 0a 20 20 69 66 28 20 70  Op->p3);.  if( p
1bb20 4f 70 2d 3e 70 32 3d 3d 42 54 52 45 45 5f 53 43  Op->p2==BTREE_SC
1bb30 48 45 4d 41 5f 56 45 52 53 49 4f 4e 20 29 7b 0a  HEMA_VERSION ){.
1bb40 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
1bb50 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 63 68  schema cookie ch
1bb60 61 6e 67 65 73 2c 20 72 65 63 6f 72 64 20 74 68  anges, record th
1bb70 65 20 6e 65 77 20 63 6f 6f 6b 69 65 20 69 6e 74  e new cookie int
1bb80 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 70  ernally */.    p
1bb90 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db->pSchema->sch
1bba0 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 70 4f 70  ema_cookie = pOp
1bbb0 2d 3e 70 33 3b 0a 20 20 20 20 64 62 2d 3e 6d 44  ->p3;.    db->mD
1bbc0 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1bbd0 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1bbe0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
1bbf0 70 32 3d 3d 42 54 52 45 45 5f 46 49 4c 45 5f 46  p2==BTREE_FILE_F
1bc00 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 2f 2a 20  ORMAT ){.    /* 
1bc10 52 65 63 6f 72 64 20 63 68 61 6e 67 65 73 20 69  Record changes i
1bc20 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  n the file forma
1bc30 74 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70 53  t */.    pDb->pS
1bc40 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1bc50 61 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  at = pOp->p3;.  
1bc60 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 3d  }.  if( pOp->p1=
1bc70 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 76  =1 ){.    /* Inv
1bc80 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 70  alidate all prep
1bc90 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
1bca0 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 45 4d  whenever the TEM
1bcb0 50 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  P database.    *
1bcc0 2a 20 73 63 68 65 6d 61 20 69 73 20 63 68 61 6e  * schema is chan
1bcd0 67 65 64 2e 20 20 54 69 63 6b 65 74 20 23 31 36  ged.  Ticket #16
1bce0 34 34 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  44 */.    sqlite
1bcf0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
1bd00 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
1bd10 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
1bd20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  0;.  }.  if( rc 
1bd30 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
1bd40 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
1bd50 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1bd60 3a 20 4f 70 65 6e 52 65 61 64 20 50 31 20 50 32  : OpenRead P1 P2
1bd70 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
1bd80 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69  opsis: root=P2 i
1bd90 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  Db=P3.**.** Open
1bda0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1bdb0 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61  sor for the data
1bdc0 62 61 73 65 20 74 61 62 6c 65 20 77 68 6f 73 65  base table whose
1bdd0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 0a 2a 2a   root page is.**
1bde0 20 50 32 20 69 6e 20 61 20 64 61 74 61 62 61 73   P2 in a databas
1bdf0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 61 74  e file.  The dat
1be00 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 64 65  abase file is de
1be10 74 65 72 6d 69 6e 65 64 20 62 79 20 50 33 2e 20  termined by P3. 
1be20 0a 2a 2a 20 50 33 3d 3d 30 20 6d 65 61 6e 73 20  .** P3==0 means 
1be30 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1be40 65 2c 20 50 33 3d 3d 31 20 6d 65 61 6e 73 20 74  e, P3==1 means t
1be50 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 64  he database used
1be60 20 66 6f 72 20 0a 2a 2a 20 74 65 6d 70 6f 72 61   for .** tempora
1be70 72 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 50  ry tables, and P
1be80 33 3e 31 20 6d 65 61 6e 73 20 75 73 65 64 20 74  3>1 means used t
1be90 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1bea0 20 61 74 74 61 63 68 65 64 0a 2a 2a 20 64 61 74   attached.** dat
1beb0 61 62 61 73 65 2e 20 20 47 69 76 65 20 74 68 65  abase.  Give the
1bec0 20 6e 65 77 20 63 75 72 73 6f 72 20 61 6e 20 69   new cursor an i
1bed0 64 65 6e 74 69 66 69 65 72 20 6f 66 20 50 31 2e  dentifier of P1.
1bee0 20 20 54 68 65 20 50 31 0a 2a 2a 20 76 61 6c 75    The P1.** valu
1bef0 65 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 63  es need not be c
1bf00 6f 6e 74 69 67 75 6f 75 73 20 62 75 74 20 61 6c  ontiguous but al
1bf10 6c 20 50 31 20 76 61 6c 75 65 73 20 73 68 6f 75  l P1 values shou
1bf20 6c 64 20 62 65 20 73 6d 61 6c 6c 20 69 6e 74 65  ld be small inte
1bf30 67 65 72 73 2e 0a 2a 2a 20 49 74 20 69 73 20 61  gers..** It is a
1bf40 6e 20 65 72 72 6f 72 20 66 6f 72 20 50 31 20 74  n error for P1 t
1bf50 6f 20 62 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a  o be negative..*
1bf60 2a 0a 2a 2a 20 49 66 20 50 35 21 3d 30 20 74 68  *.** If P5!=0 th
1bf70 65 6e 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  en use the conte
1bf80 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1bf90 32 20 61 73 20 74 68 65 20 72 6f 6f 74 20 70 61  2 as the root pa
1bfa0 67 65 2c 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 76  ge, not.** the v
1bfb0 61 6c 75 65 20 6f 66 20 50 32 20 69 74 73 65 6c  alue of P2 itsel
1bfc0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 77  f..**.** There w
1bfd0 69 6c 6c 20 62 65 20 61 20 72 65 61 64 20 6c 6f  ill be a read lo
1bfe0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bff0 73 65 20 77 68 65 6e 65 76 65 72 20 74 68 65 72  se whenever ther
1c000 65 20 69 73 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e is an.** open 
1c010 63 75 72 73 6f 72 2e 20 20 49 66 20 74 68 65 20  cursor.  If the 
1c020 64 61 74 61 62 61 73 65 20 77 61 73 20 75 6e 6c  database was unl
1c030 6f 63 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 74  ocked prior to t
1c040 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
1c050 2a 2a 20 74 68 65 6e 20 61 20 72 65 61 64 20 6c  ** then a read l
1c060 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 20  ock is acquired 
1c070 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1c080 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 41 20  instruction.  A 
1c090 72 65 61 64 0a 2a 2a 20 6c 6f 63 6b 20 61 6c 6c  read.** lock all
1c0a0 6f 77 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ows other proces
1c0b0 73 65 73 20 74 6f 20 72 65 61 64 20 74 68 65 20  ses to read the 
1c0c0 64 61 74 61 62 61 73 65 20 62 75 74 20 70 72 6f  database but pro
1c0d0 68 69 62 69 74 73 0a 2a 2a 20 61 6e 79 20 6f 74  hibits.** any ot
1c0e0 68 65 72 20 70 72 6f 63 65 73 73 20 66 72 6f 6d  her process from
1c0f0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 64   modifying the d
1c100 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 72 65  atabase.  The re
1c110 61 64 20 6c 6f 63 6b 20 69 73 0a 2a 2a 20 72 65  ad lock is.** re
1c120 6c 65 61 73 65 64 20 77 68 65 6e 20 61 6c 6c 20  leased when all 
1c130 63 75 72 73 6f 72 73 20 61 72 65 20 63 6c 6f 73  cursors are clos
1c140 65 64 2e 20 20 49 66 20 74 68 69 73 20 69 6e 73  ed.  If this ins
1c150 74 72 75 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  truction attempt
1c160 73 0a 2a 2a 20 74 6f 20 67 65 74 20 61 20 72 65  s.** to get a re
1c170 61 64 20 6c 6f 63 6b 20 62 75 74 20 66 61 69 6c  ad lock but fail
1c180 73 2c 20 74 68 65 20 73 63 72 69 70 74 20 74 65  s, the script te
1c190 72 6d 69 6e 61 74 65 73 20 77 69 74 68 20 61 6e  rminates with an
1c1a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1c1b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1c1c0 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1c1d0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1c1e0 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1c1f0 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1c200 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1c210 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1c220 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1c230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c240 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
1c250 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
1c260 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1c270 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
1c280 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
1c290 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1c2a0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
1c2b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1c2c0 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1c2d0 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
1c2e0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1c2f0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1c300 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
1c310 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
1c320 4f 70 65 6e 57 72 69 74 65 2c 20 52 65 6f 70 65  OpenWrite, Reope
1c330 6e 49 64 78 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  nIdx.*/./* Opcod
1c340 65 3a 20 52 65 6f 70 65 6e 49 64 78 20 50 31 20  e: ReopenIdx P1 
1c350 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
1c360 79 6e 6f 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32  ynopsis: root=P2
1c370 20 69 44 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 54 68   iDb=P3.**.** Th
1c380 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63 6f  e ReopenIdx opco
1c390 64 65 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79  de works exactly
1c3a0 20 6c 69 6b 65 20 52 65 61 64 4f 70 65 6e 20 65   like ReadOpen e
1c3b0 78 63 65 70 74 20 74 68 61 74 20 69 74 20 66 69  xcept that it fi
1c3c0 72 73 74 0a 2a 2a 20 63 68 65 63 6b 73 20 74 6f  rst.** checks to
1c3d0 20 73 65 65 20 69 66 20 74 68 65 20 63 75 72 73   see if the curs
1c3e0 6f 72 20 6f 6e 20 50 31 20 69 73 20 61 6c 72 65  or on P1 is alre
1c3f0 61 64 79 20 6f 70 65 6e 20 77 69 74 68 20 61 20  ady open with a 
1c400 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6e 75 6d  root page.** num
1c410 62 65 72 20 6f 66 20 50 32 20 61 6e 64 20 69 66  ber of P2 and if
1c420 20 69 74 20 69 73 20 74 68 69 73 20 6f 70 63 6f   it is this opco
1c430 64 65 20 62 65 63 6f 6d 65 73 20 61 20 6e 6f 2d  de becomes a no-
1c440 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
1c450 72 64 73 2c 0a 2a 2a 20 69 66 20 74 68 65 20 63  rds,.** if the c
1c460 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
1c470 20 6f 70 65 6e 2c 20 64 6f 20 6e 6f 74 20 72 65   open, do not re
1c480 6f 70 65 6e 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  open it..**.** T
1c490 68 65 20 52 65 6f 70 65 6e 49 64 78 20 6f 70 63  he ReopenIdx opc
1c4a0 6f 64 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ode may only be 
1c4b0 75 73 65 64 20 77 69 74 68 20 50 35 3d 3d 30 20  used with P5==0 
1c4c0 61 6e 64 20 77 69 74 68 20 50 34 20 62 65 69 6e  and with P4 bein
1c4d0 67 0a 2a 2a 20 61 20 50 34 5f 4b 45 59 49 4e 46  g.** a P4_KEYINF
1c4e0 4f 20 6f 62 6a 65 63 74 2e 20 20 46 75 72 74 68  O object.  Furth
1c4f0 65 72 6d 6f 72 65 2c 20 74 68 65 20 50 33 20 76  ermore, the P3 v
1c500 61 6c 75 65 20 6d 75 73 74 20 62 65 20 74 68 65  alue must be the
1c510 20 73 61 6d 65 20 61 73 0a 2a 2a 20 65 76 65 72   same as.** ever
1c520 79 20 6f 74 68 65 72 20 52 65 6f 70 65 6e 49 64  y other ReopenId
1c530 78 20 6f 72 20 4f 70 65 6e 52 65 61 64 20 66 6f  x or OpenRead fo
1c540 72 20 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f  r the same curso
1c550 72 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  r number..**.** 
1c560 53 65 65 20 74 68 65 20 4f 70 65 6e 52 65 61 64  See the OpenRead
1c570 20 6f 70 63 6f 64 65 20 64 6f 63 75 6d 65 6e 74   opcode document
1c580 61 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ation for additi
1c590 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1c5a0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1c5b0 4f 70 65 6e 57 72 69 74 65 20 50 31 20 50 32 20  OpenWrite P1 P2 
1c5c0 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f  P3 P4 P5.** Syno
1c5d0 70 73 69 73 3a 20 72 6f 6f 74 3d 50 32 20 69 44  psis: root=P2 iD
1c5e0 62 3d 50 33 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  b=P3.**.** Open 
1c5f0 61 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  a read/write cur
1c600 73 6f 72 20 6e 61 6d 65 64 20 50 31 20 6f 6e 20  sor named P1 on 
1c610 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1c620 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 0a 2a 2a  ex whose root.**
1c630 20 70 61 67 65 20 69 73 20 50 32 2e 20 20 4f 72   page is P2.  Or
1c640 20 69 66 20 50 35 21 3d 30 20 75 73 65 20 74 68   if P5!=0 use th
1c650 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67  e content of reg
1c660 69 73 74 65 72 20 50 32 20 74 6f 20 66 69 6e 64  ister P2 to find
1c670 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1c680 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20  e..**.** The P4 
1c690 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65 69 74  value may be eit
1c6a0 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 20 28  her an integer (
1c6b0 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61 20 70  P4_INT32) or a p
1c6c0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61 20 4b  ointer to.** a K
1c6d0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1c6e0 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e 20 49   (P4_KEYINFO). I
1c6f0 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e 74 65  f it is a pointe
1c700 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 0a  r to a KeyInfo .
1c710 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
1c720 65 6e 20 73 61 69 64 20 73 74 72 75 63 74 75 72  en said structur
1c730 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 63 6f  e defines the co
1c740 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c 61 74  ntent and collat
1c750 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ing .** sequence
1c760 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 65   of the index be
1c770 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74 68 65  ing opened. Othe
1c780 72 77 69 73 65 2c 20 69 66 20 50 34 20 69 73 20  rwise, if P4 is 
1c790 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a 20 76  an integer .** v
1c7a0 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65 74 20  alue, it is set 
1c7b0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1c7c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1c7d0 74 61 62 6c 65 2c 20 6f 72 20 74 6f 20 74 68 65  table, or to the
1c7e0 0a 2a 2a 20 6c 61 72 67 65 73 74 20 69 6e 64 65  .** largest inde
1c7f0 78 20 6f 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  x of any column 
1c800 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
1c810 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 75 73  t is actually us
1c820 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ed..**.** This i
1c830 6e 73 74 72 75 63 74 69 6f 6e 20 77 6f 72 6b 73  nstruction works
1c840 20 6a 75 73 74 20 6c 69 6b 65 20 4f 70 65 6e 52   just like OpenR
1c850 65 61 64 20 65 78 63 65 70 74 20 74 68 61 74 20  ead except that 
1c860 69 74 20 6f 70 65 6e 73 20 74 68 65 20 63 75 72  it opens the cur
1c870 73 6f 72 0a 2a 2a 20 69 6e 20 72 65 61 64 2f 77  sor.** in read/w
1c880 72 69 74 65 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rite mode.  For 
1c890 61 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20 74  a given table, t
1c8a0 68 65 72 65 20 63 61 6e 20 62 65 20 6f 6e 65 20  here can be one 
1c8b0 6f 72 20 6d 6f 72 65 20 72 65 61 64 2d 6f 6e 6c  or more read-onl
1c8c0 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 72 20  y.** cursors or 
1c8d0 61 20 73 69 6e 67 6c 65 20 72 65 61 64 2f 77 72  a single read/wr
1c8e0 69 74 65 20 63 75 72 73 6f 72 20 62 75 74 20 6e  ite cursor but n
1c8f0 6f 74 20 62 6f 74 68 2e 0a 2a 2a 0a 2a 2a 20 53  ot both..**.** S
1c900 65 65 20 61 6c 73 6f 20 4f 70 65 6e 52 65 61 64  ee also OpenRead
1c910 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 65 6f  ..*/.case OP_Reo
1c920 70 65 6e 49 64 78 3a 20 7b 0a 20 20 69 6e 74 20  penIdx: {.  int 
1c930 6e 46 69 65 6c 64 3b 0a 20 20 4b 65 79 49 6e 66  nField;.  KeyInf
1c940 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  o *pKeyInfo;.  i
1c950 6e 74 20 70 32 3b 0a 20 20 69 6e 74 20 69 44 62  nt p2;.  int iDb
1c960 3b 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 3b 0a  ;.  int wrFlag;.
1c970 20 20 42 74 72 65 65 20 2a 70 58 3b 0a 20 20 56    Btree *pX;.  V
1c980 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
1c990 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
1c9a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d  ssert( pOp->p5==
1c9b0 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50  0 || pOp->p5==OP
1c9c0 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20  FLAG_SEEKEQ );. 
1c9d0 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34   assert( pOp->p4
1c9e0 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  type==P4_KEYINFO
1c9f0 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d 3e   );.  pCur = p->
1ca00 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  apCsr[pOp->p1];.
1ca10 20 20 69 66 28 20 70 43 75 72 20 26 26 20 70 43    if( pCur && pC
1ca20 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 75  ur->pgnoRoot==(u
1ca30 33 32 29 70 4f 70 2d 3e 70 32 20 29 7b 0a 20 20  32)pOp->p2 ){.  
1ca40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ca50 69 44 62 3d 3d 70 4f 70 2d 3e 70 33 20 29 3b 20  iDb==pOp->p3 ); 
1ca60 20 20 20 20 20 2f 2a 20 47 75 61 72 61 6e 74 65       /* Guarante
1ca70 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 67  ed by the code g
1ca80 65 6e 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  enerator */.    
1ca90 67 6f 74 6f 20 6f 70 65 6e 5f 63 75 72 73 6f 72  goto open_cursor
1caa0 5f 73 65 74 5f 68 69 6e 74 73 3b 0a 20 20 7d 0a  _set_hints;.  }.
1cab0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1cac0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1cad0 74 6c 79 20 6f 70 65 6e 20 6f 72 20 69 73 20 6f  tly open or is o
1cae0 70 65 6e 20 6f 6e 20 61 20 64 69 66 66 65 72 65  pen on a differe
1caf0 6e 74 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  nt.  ** index, t
1cb00 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  hen fall through
1cb10 20 69 6e 74 6f 20 4f 50 5f 4f 70 65 6e 52 65 61   into OP_OpenRea
1cb20 64 20 74 6f 20 66 6f 72 63 65 20 61 20 72 65 6f  d to force a reo
1cb30 70 65 6e 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  pen */.case OP_O
1cb40 70 65 6e 52 65 61 64 3a 0a 63 61 73 65 20 4f 50  penRead:.case OP
1cb50 5f 4f 70 65 6e 57 72 69 74 65 3a 0a 0a 20 20 61  _OpenWrite:..  a
1cb60 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
1cb70 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72 69 74 65  de==OP_OpenWrite
1cb80 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c   || pOp->p5==0 |
1cb90 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41  | pOp->p5==OPFLA
1cba0 47 5f 53 45 45 4b 45 51 20 29 3b 0a 20 20 61 73  G_SEEKEQ );.  as
1cbb0 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64  sert( p->bIsRead
1cbc0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
1cbd0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1cbe0 4f 70 65 6e 52 65 61 64 20 7c 7c 20 70 4f 70 2d  OpenRead || pOp-
1cbf0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 65 6f 70  >opcode==OP_Reop
1cc00 65 6e 49 64 78 0a 20 20 20 20 20 20 20 20 20 20  enIdx.          
1cc10 7c 7c 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  || p->readOnly==
1cc20 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65  0 );..  if( p->e
1cc30 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 72 63  xpired ){.    rc
1cc40 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f   = SQLITE_ABORT_
1cc50 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 67 6f  ROLLBACK;.    go
1cc60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
1cc70 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 6e 46  error;.  }..  nF
1cc80 69 65 6c 64 20 3d 20 30 3b 0a 20 20 70 4b 65 79  ield = 0;.  pKey
1cc90 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 70 32 20 3d  Info = 0;.  p2 =
1cca0 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 44 62 20   pOp->p2;.  iDb 
1ccb0 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 61 73 73  = pOp->p3;.  ass
1ccc0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1ccd0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1cce0 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
1ccf0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
1cd00 20 69 44 62 29 20 29 3b 0a 20 20 70 44 62 20 3d   iDb) );.  pDb =
1cd10 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
1cd20 20 20 70 58 20 3d 20 70 44 62 2d 3e 70 42 74 3b    pX = pDb->pBt;
1cd30 0a 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30  .  assert( pX!=0
1cd40 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f   );.  if( pOp->o
1cd50 70 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 57 72  pcode==OP_OpenWr
1cd60 69 74 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ite ){.    asser
1cd70 74 28 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  t( OPFLAG_FORDEL
1cd80 45 54 45 3d 3d 42 54 52 45 45 5f 46 4f 52 44 45  ETE==BTREE_FORDE
1cd90 4c 45 54 45 20 29 3b 0a 20 20 20 20 77 72 46 6c  LETE );.    wrFl
1cda0 61 67 20 3d 20 42 54 52 45 45 5f 57 52 43 53 52  ag = BTREE_WRCSR
1cdb0 20 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50   | (pOp->p5 & OP
1cdc0 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3b  FLAG_FORDELETE);
1cdd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1cde0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1cdf0 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1ce00 29 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  );.    if( pDb->
1ce10 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
1ce20 72 6d 61 74 20 3c 20 70 2d 3e 6d 69 6e 57 72 69  rmat < p->minWri
1ce30 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 29 7b 0a  teFileFormat ){.
1ce40 20 20 20 20 20 20 70 2d 3e 6d 69 6e 57 72 69 74        p->minWrit
1ce50 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 70 44  eFileFormat = pD
1ce60 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  b->pSchema->file
1ce70 5f 66 6f 72 6d 61 74 3b 0a 20 20 20 20 7d 0a 20  _format;.    }. 
1ce80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 72 46 6c   }else{.    wrFl
1ce90 61 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ag = 0;.  }.  if
1cea0 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
1ceb0 41 47 5f 50 32 49 53 52 45 47 20 29 7b 0a 20 20  AG_P2ISREG ){.  
1cec0 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20 29    assert( p2>0 )
1ced0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 32  ;.    assert( p2
1cee0 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
1cef0 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
1cf00 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
1cf10 32 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2];.    assert( 
1cf20 6d 65 6d 49 73 56 61 6c 69 64 28 70 49 6e 32 29  memIsValid(pIn2)
1cf30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cf40 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn2->flags & M
1cf50 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 0a 20 20  EM_Int)!=0 );.  
1cf60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cf70 49 6e 74 65 67 65 72 69 66 79 28 70 49 6e 32 29  Integerify(pIn2)
1cf80 3b 0a 20 20 20 20 70 32 20 3d 20 28 69 6e 74 29  ;.    p2 = (int)
1cf90 70 49 6e 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 2f  pIn2->u.i;.    /
1cfa0 2a 20 54 68 65 20 70 32 20 76 61 6c 75 65 20 61  * The p2 value a
1cfb0 6c 77 61 79 73 20 63 6f 6d 65 73 20 66 72 6f 6d  lways comes from
1cfc0 20 61 20 70 72 69 6f 72 20 4f 50 5f 43 72 65 61   a prior OP_Crea
1cfd0 74 65 42 74 72 65 65 20 6f 70 63 6f 64 65 20 61  teBtree opcode a
1cfe0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  nd.    ** that o
1cff0 70 63 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79  pcode will alway
1d000 73 20 73 65 74 20 74 68 65 20 70 32 20 76 61 6c  s set the p2 val
1d010 75 65 20 74 6f 20 32 20 6f 72 20 6d 6f 72 65 20  ue to 2 or more 
1d020 6f 72 20 65 6c 73 65 20 66 61 69 6c 2e 0a 20 20  or else fail..  
1d030 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 77 65    ** If there we
1d040 72 65 20 61 20 66 61 69 6c 75 72 65 2c 20 74 68  re a failure, th
1d050 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1d060 6d 65 6e 74 20 77 6f 75 6c 64 20 68 61 76 65 20  ment would have 
1d070 68 61 6c 74 65 64 0a 20 20 20 20 2a 2a 20 62 65  halted.    ** be
1d080 66 6f 72 65 20 72 65 61 63 68 69 6e 67 20 74 68  fore reaching th
1d090 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  is instruction. 
1d0a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d0b0 32 3e 3d 32 20 29 3b 0a 20 20 7d 0a 20 20 69 66  2>=2 );.  }.  if
1d0c0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1d0d0 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20  4_KEYINFO ){.   
1d0e0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d   pKeyInfo = pOp-
1d0f0 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
1d100 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1d110 66 6f 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29  fo->enc==ENC(db)
1d120 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d130 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62  pKeyInfo->db==db
1d140 20 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d   );.    nField =
1d150 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46   pKeyInfo->nAllF
1d160 69 65 6c 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ield;.  }else if
1d170 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1d180 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 6e  4_INT32 ){.    n
1d190 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34 2e  Field = pOp->p4.
1d1a0 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  i;.  }.  assert(
1d1b0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20   pOp->p1>=0 );. 
1d1c0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e   assert( nField>
1d1d0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1d1e0 28 20 6e 46 69 65 6c 64 3d 3d 30 20 29 3b 20 20  ( nField==0 );  
1d1f0 2f 2a 20 54 61 62 6c 65 20 77 69 74 68 20 49 4e  /* Table with IN
1d200 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1d210 59 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 65 6c  Y and nothing el
1d220 73 65 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 61  se */.  pCur = a
1d230 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c  llocateCursor(p,
1d240 20 70 4f 70 2d 3e 70 31 2c 20 6e 46 69 65 6c 64   pOp->p1, nField
1d250 2c 20 69 44 62 2c 20 43 55 52 54 59 50 45 5f 42  , iDb, CURTYPE_B
1d260 54 52 45 45 29 3b 0a 20 20 69 66 28 20 70 43 75  TREE);.  if( pCu
1d270 72 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  r==0 ) goto no_m
1d280 65 6d 3b 0a 20 20 70 43 75 72 2d 3e 6e 75 6c 6c  em;.  pCur->null
1d290 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d  Row = 1;.  pCur-
1d2a0 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 31 3b 0a  >isOrdered = 1;.
1d2b0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
1d2c0 20 3d 20 70 32 3b 0a 23 69 66 64 65 66 20 53 51   = p2;.#ifdef SQ
1d2d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43 75  LITE_DEBUG.  pCu
1d2e0 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46 6c  r->wrFlag = wrFl
1d2f0 61 67 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20  ag;.#endif.  rc 
1d300 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
1d310 72 73 6f 72 28 70 58 2c 20 70 32 2c 20 77 72 46  rsor(pX, p2, wrF
1d320 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
1d330 43 75 72 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  Cur->uc.pCursor)
1d340 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
1d350 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1d360 20 2f 2a 20 53 65 74 20 74 68 65 20 56 64 62 65   /* Set the Vdbe
1d370 43 75 72 73 6f 72 2e 69 73 54 61 62 6c 65 20 76  Cursor.isTable v
1d380 61 72 69 61 62 6c 65 2e 20 50 72 65 76 69 6f 75  ariable. Previou
1d390 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 20 20  s versions of.  
1d3a0 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
1d3b0 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 72  o check if the r
1d3c0 6f 6f 74 2d 70 61 67 65 20 66 6c 61 67 73 20 77  oot-page flags w
1d3d0 65 72 65 20 73 61 6e 65 20 61 74 20 74 68 69 73  ere sane at this
1d3e0 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 61 6e 64 20   point.  ** and 
1d3f0 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
1d400 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
1d410 65 79 20 77 65 72 65 20 6e 6f 74 2c 20 62 75 74  ey were not, but
1d420 20 74 68 69 73 20 63 68 65 63 6b 20 68 61 73 0a   this check has.
1d430 20 20 2a 2a 20 73 69 6e 63 65 20 6d 6f 76 65 64    ** since moved
1d440 20 69 6e 74 6f 20 74 68 65 20 62 74 72 65 65 20   into the btree 
1d450 6c 61 79 65 72 2e 20 20 2a 2f 20 20 0a 20 20 70  layer.  */  .  p
1d460 43 75 72 2d 3e 69 73 54 61 62 6c 65 20 3d 20 70  Cur->isTable = p
1d470 4f 70 2d 3e 70 34 74 79 70 65 21 3d 50 34 5f 4b  Op->p4type!=P4_K
1d480 45 59 49 4e 46 4f 3b 0a 0a 6f 70 65 6e 5f 63 75  EYINFO;..open_cu
1d490 72 73 6f 72 5f 73 65 74 5f 68 69 6e 74 73 3a 0a  rsor_set_hints:.
1d4a0 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
1d4b0 5f 42 55 4c 4b 43 53 52 3d 3d 42 54 52 45 45 5f  _BULKCSR==BTREE_
1d4c0 42 55 4c 4b 4c 4f 41 44 20 29 3b 0a 20 20 61 73  BULKLOAD );.  as
1d4d0 73 65 72 74 28 20 4f 50 46 4c 41 47 5f 53 45 45  sert( OPFLAG_SEE
1d4e0 4b 45 51 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f  KEQ==BTREE_SEEK_
1d4f0 45 51 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  EQ );.  testcase
1d500 28 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c  ( pOp->p5 & OPFL
1d510 41 47 5f 42 55 4c 4b 43 53 52 20 29 3b 0a 23 69  AG_BULKCSR );.#i
1d520 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1d530 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
1d540 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d    testcase( pOp-
1d550 3e 70 32 20 26 20 4f 50 46 4c 41 47 5f 53 45 45  >p2 & OPFLAG_SEE
1d560 4b 45 51 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEQ );.#endif.  
1d570 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d580 6f 72 48 69 6e 74 46 6c 61 67 73 28 70 43 75 72  orHintFlags(pCur
1d590 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 0a 20 20  ->uc.pCursor,.  
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 4f               (pO
1d5c0 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c 41 47 5f  p->p5 & (OPFLAG_
1d5d0 42 55 4c 4b 43 53 52 7c 4f 50 46 4c 41 47 5f 53  BULKCSR|OPFLAG_S
1d5e0 45 45 4b 45 51 29 29 29 3b 0a 20 20 69 66 28 20  EEKEQ)));.  if( 
1d5f0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
1d600 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
1d610 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1d620 6f 64 65 3a 20 4f 70 65 6e 44 75 70 20 50 31 20  ode: OpenDup P1 
1d630 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 4f  P2 * * *.**.** O
1d640 70 65 6e 20 61 20 6e 65 77 20 63 75 72 73 6f 72  pen a new cursor
1d650 20 50 31 20 74 68 61 74 20 70 6f 69 6e 74 73 20   P1 that points 
1d660 74 6f 20 74 68 65 20 73 61 6d 65 20 65 70 68 65  to the same ephe
1d670 6d 65 72 61 6c 20 74 61 62 6c 65 20 61 73 0a 2a  meral table as.*
1d680 2a 20 63 75 72 73 6f 72 20 50 32 2e 20 20 54 68  * cursor P2.  Th
1d690 65 20 50 32 20 63 75 72 73 6f 72 20 6d 75 73 74  e P2 cursor must
1d6a0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1d6b0 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
1d6c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 2a 2a  OpenEphemeral.**
1d6d0 20 6f 70 63 6f 64 65 2e 20 20 4f 6e 6c 79 20 65   opcode.  Only e
1d6e0 70 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73  phemeral cursors
1d6f0 20 6d 61 79 20 62 65 20 64 75 70 6c 69 63 61 74   may be duplicat
1d700 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ed..**.** Duplic
1d710 61 74 65 20 65 70 68 65 6d 65 72 61 6c 20 63 75  ate ephemeral cu
1d720 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
1d730 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 6f 66  or self-joins of
1d740 20 6d 61 74 65 72 69 61 6c 69 7a 65 64 20 76 69   materialized vi
1d750 65 77 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ews..*/.case OP_
1d760 4f 70 65 6e 44 75 70 3a 20 7b 0a 20 20 56 64 62  OpenDup: {.  Vdb
1d770 65 43 75 72 73 6f 72 20 2a 70 4f 72 69 67 3b 20  eCursor *pOrig; 
1d780 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e     /* The origin
1d790 61 6c 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  al cursor to be 
1d7a0 64 75 70 6c 69 63 61 74 65 64 20 2a 2f 0a 20 20  duplicated */.  
1d7b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b  VdbeCursor *pCx;
1d7c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1d7d0 20 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 70 4f   cursor */..  pO
1d7e0 72 69 67 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  rig = p->apCsr[p
1d7f0 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
1d800 74 28 20 70 4f 72 69 67 2d 3e 70 42 74 78 21 3d  t( pOrig->pBtx!=
1d810 30 20 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 65 70  0 );  /* Only ep
1d820 68 65 6d 65 72 61 6c 20 63 75 72 73 6f 72 73 20  hemeral cursors 
1d830 63 61 6e 20 62 65 20 64 75 70 6c 69 63 61 74 65  can be duplicate
1d840 64 20 2a 2f 0a 0a 20 20 70 43 78 20 3d 20 61 6c  d */..  pCx = al
1d850 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20  locateCursor(p, 
1d860 70 4f 70 2d 3e 70 31 2c 20 70 4f 72 69 67 2d 3e  pOp->p1, pOrig->
1d870 6e 46 69 65 6c 64 2c 20 2d 31 2c 20 43 55 52 54  nField, -1, CURT
1d880 59 50 45 5f 42 54 52 45 45 29 3b 0a 20 20 69 66  YPE_BTREE);.  if
1d890 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1d8a0 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e  no_mem;.  pCx->n
1d8b0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
1d8c0 78 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 3d  x->isEphemeral =
1d8d0 20 31 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49   1;.  pCx->pKeyI
1d8e0 6e 66 6f 20 3d 20 70 4f 72 69 67 2d 3e 70 4b 65  nfo = pOrig->pKe
1d8f0 79 49 6e 66 6f 3b 0a 20 20 70 43 78 2d 3e 69 73  yInfo;.  pCx->is
1d900 54 61 62 6c 65 20 3d 20 70 4f 72 69 67 2d 3e 69  Table = pOrig->i
1d910 73 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73  sTable;.  rc = s
1d920 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d930 72 28 70 4f 72 69 67 2d 3e 70 42 74 78 2c 20 4d  r(pOrig->pBtx, M
1d940 41 53 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45  ASTER_ROOT, BTRE
1d950 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20  E_WRCSR,.       
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f     pCx->pKeyInfo
1d980 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  , pCx->uc.pCurso
1d990 72 29 3b 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c  r);.  /* The sql
1d9a0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1d9b0 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6f 6e  ) routine can on
1d9c0 6c 79 20 66 61 69 6c 20 66 6f 72 20 74 68 65 20  ly fail for the 
1d9d0 66 69 72 73 74 20 63 75 72 73 6f 72 0a 20 20 2a  first cursor.  *
1d9e0 2a 20 6f 70 65 6e 65 64 20 66 6f 72 20 61 20 64  * opened for a d
1d9f0 61 74 61 62 61 73 65 2e 20 20 53 69 6e 63 65 20  atabase.  Since 
1da00 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1da10 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
1da20 77 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 6f  when this.  ** o
1da30 70 63 6f 64 65 20 69 73 20 72 75 6e 2c 20 74 68  pcode is run, th
1da40 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
1da50 72 73 6f 72 28 29 20 63 61 6e 6e 6f 74 20 66 61  rsor() cannot fa
1da60 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
1da70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1da80 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
1da90 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 45 70 68   Opcode: OpenEph
1daa0 65 6d 65 72 61 6c 20 50 31 20 50 32 20 2a 20 50  emeral P1 P2 * P
1dab0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
1dac0 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32 0a 2a 2a 0a  : nColumn=P2.**.
1dad0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 63 75  ** Open a new cu
1dae0 72 73 6f 72 20 50 31 20 74 6f 20 61 20 74 72 61  rsor P1 to a tra
1daf0 6e 73 69 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a  nsient table..**
1db00 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   The cursor is a
1db10 6c 77 61 79 73 20 6f 70 65 6e 65 64 20 72 65 61  lways opened rea
1db20 64 2f 77 72 69 74 65 20 65 76 65 6e 20 69 66 20  d/write even if 
1db30 0a 2a 2a 20 74 68 65 20 6d 61 69 6e 20 64 61 74  .** the main dat
1db40 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e  abase is read-on
1db50 6c 79 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ly.  The ephemer
1db60 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 64  al.** table is d
1db70 65 6c 65 74 65 64 20 61 75 74 6f 6d 61 74 69 63  eleted automatic
1db80 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 20 63 75  ally when the cu
1db90 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1dba0 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 74 68 65 20  **.** P2 is the 
1dbb0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1dbc0 73 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  s in the ephemer
1dbd0 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  al table..** The
1dbe0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
1dbf0 6f 20 61 20 42 54 72 65 65 20 74 61 62 6c 65 20  o a BTree table 
1dc00 69 66 20 50 34 3d 3d 30 20 61 6e 64 20 74 6f 20  if P4==0 and to 
1dc10 61 20 42 54 72 65 65 20 69 6e 64 65 78 0a 2a 2a  a BTree index.**
1dc20 20 69 66 20 50 34 20 69 73 20 6e 6f 74 20 30 2e   if P4 is not 0.
1dc30 20 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e    If P4 is not N
1dc40 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
1dc50 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
1dc60 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 64 65  cture.** that de
1dc70 66 69 6e 65 73 20 74 68 65 20 66 6f 72 6d 61 74  fines the format
1dc80 20 6f 66 20 6b 65 79 73 20 69 6e 20 74 68 65 20   of keys in the 
1dc90 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  index..**.** The
1dca0 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 63 61   P5 parameter ca
1dcb0 6e 20 62 65 20 61 20 6d 61 73 6b 20 6f 66 20 74  n be a mask of t
1dcc0 68 65 20 42 54 52 45 45 5f 2a 20 66 6c 61 67 73  he BTREE_* flags
1dcd0 20 64 65 66 69 6e 65 64 0a 2a 2a 20 69 6e 20 62   defined.** in b
1dce0 74 72 65 65 2e 68 2e 20 20 54 68 65 73 65 20 66  tree.h.  These f
1dcf0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 20 61 73 70  lags control asp
1dd00 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70 65 72  ects of the oper
1dd10 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ation of.** the 
1dd20 62 74 72 65 65 2e 20 20 54 68 65 20 42 54 52 45  btree.  The BTRE
1dd30 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
1dd40 6e 64 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20  nd BTREE_SINGLE 
1dd50 66 6c 61 67 73 20 61 72 65 0a 2a 2a 20 61 64 64  flags are.** add
1dd60 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1dd70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
1dd80 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 20 50 31  OpenAutoindex P1
1dd90 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79   P2 * P4 *.** Sy
1dda0 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d  nopsis: nColumn=
1ddb0 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P2.**.** This op
1ddc0 63 6f 64 65 20 77 6f 72 6b 73 20 74 68 65 20 73  code works the s
1ddd0 61 6d 65 20 61 73 20 4f 50 5f 4f 70 65 6e 45 70  ame as OP_OpenEp
1dde0 68 65 6d 65 72 61 6c 2e 20 20 49 74 20 68 61 73  hemeral.  It has
1ddf0 20 61 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20   a.** different 
1de00 6e 61 6d 65 20 74 6f 20 64 69 73 74 69 6e 67 75  name to distingu
1de10 69 73 68 20 69 74 73 20 75 73 65 2e 20 20 54 61  ish its use.  Ta
1de20 62 6c 65 73 20 63 72 65 61 74 65 64 20 75 73 69  bles created usi
1de30 6e 67 0a 2a 2a 20 62 79 20 74 68 69 73 20 6f 70  ng.** by this op
1de40 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65  code will be use
1de50 64 20 66 6f 72 20 61 75 74 6f 6d 61 74 69 63 61  d for automatica
1de60 6c 6c 79 20 63 72 65 61 74 65 64 20 74 72 61 6e  lly created tran
1de70 73 69 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 65 73  sient.** indices
1de80 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a 2f 0a 63 61   in joins..*/.ca
1de90 73 65 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e  se OP_OpenAutoin
1dea0 64 65 78 3a 20 0a 63 61 73 65 20 4f 50 5f 4f 70  dex: .case OP_Op
1deb0 65 6e 45 70 68 65 6d 65 72 61 6c 3a 20 7b 0a 20  enEphemeral: {. 
1dec0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
1ded0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1dee0 79 49 6e 66 6f 3b 0a 0a 20 20 73 74 61 74 69 63  yInfo;..  static
1def0 20 63 6f 6e 73 74 20 69 6e 74 20 76 66 73 46 6c   const int vfsFl
1df00 61 67 73 20 3d 20 0a 20 20 20 20 20 20 53 51 4c  ags = .      SQL
1df10 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1df20 54 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54  TE |.      SQLIT
1df30 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1df40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1df50 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1df60 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1df70 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1df80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1df90 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 3b 0a  N_TRANSIENT_DB;.
1dfa0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
1dfb0 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1>=0 );.  assert
1dfc0 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( pOp->p2>=0 );.
1dfd0 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65    pCx = allocate
1dfe0 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70  Cursor(p, pOp->p
1dff0 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c 20  1, pOp->p2, -1, 
1e000 43 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a  CURTYPE_BTREE);.
1e010 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1e020 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1e030 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  x->nullRow = 1;.
1e040 20 20 70 43 78 2d 3e 69 73 45 70 68 65 6d 65 72    pCx->isEphemer
1e050 61 6c 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  al = 1;.  rc = s
1e060 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
1e070 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c  db->pVfs, 0, db,
1e080 20 26 70 43 78 2d 3e 70 42 74 78 2c 20 0a 20 20   &pCx->pBtx, .  
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 20 42 54 52 45 45 5f 4f 4d 49 54        BTREE_OMIT
1e0b0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42 54 52 45 45  _JOURNAL | BTREE
1e0c0 5f 53 49 4e 47 4c 45 20 7c 20 70 4f 70 2d 3e 70  _SINGLE | pOp->p
1e0d0 35 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  5, vfsFlags);.  
1e0e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e0f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1e100 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1e110 72 61 6e 73 28 70 43 78 2d 3e 70 42 74 78 2c 20  rans(pCx->pBtx, 
1e120 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
1e130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e140 20 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73     /* If a trans
1e150 69 65 6e 74 20 69 6e 64 65 78 20 69 73 20 72 65  ient index is re
1e160 71 75 69 72 65 64 2c 20 63 72 65 61 74 65 20 69  quired, create i
1e170 74 20 62 79 20 63 61 6c 6c 69 6e 67 0a 20 20 20  t by calling.   
1e180 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
1e190 43 72 65 61 74 65 54 61 62 6c 65 28 29 20 77 69  CreateTable() wi
1e1a0 74 68 20 74 68 65 20 42 54 52 45 45 5f 42 4c 4f  th the BTREE_BLO
1e1b0 42 4b 45 59 20 66 6c 61 67 20 62 65 66 6f 72 65  BKEY flag before
1e1c0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1e1d0 69 74 2e 20 49 66 20 61 20 74 72 61 6e 73 69 65  it. If a transie
1e1e0 6e 74 20 74 61 62 6c 65 20 69 73 20 72 65 71 75  nt table is requ
1e1f0 69 72 65 64 2c 20 6a 75 73 74 20 75 73 65 20 74  ired, just use t
1e200 68 65 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  he.    ** automa
1e210 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1e220 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1e230 70 61 67 65 20 31 20 28 61 6e 20 42 4c 4f 42 5f  page 1 (an BLOB_
1e240 49 4e 54 4b 45 59 20 74 61 62 6c 65 29 2e 0a 20  INTKEY table).. 
1e250 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
1e260 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  Cx->pKeyInfo = p
1e270 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
1e280 34 2e 70 4b 65 79 49 6e 66 6f 29 21 3d 30 20 29  4.pKeyInfo)!=0 )
1e290 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
1e2a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e2b0 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
1e2c0 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20  KEYINFO );.     
1e2d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e2e0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 43  eeCreateTable(pC
1e2f0 78 2d 3e 70 42 74 78 2c 20 26 70 67 6e 6f 2c 20  x->pBtx, &pgno, 
1e300 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 20 7c 20  BTREE_BLOBKEY | 
1e310 70 4f 70 2d 3e 70 35 29 3b 20 0a 20 20 20 20 20  pOp->p5); .     
1e320 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
1e340 73 65 72 74 28 20 70 67 6e 6f 3d 3d 4d 41 53 54  sert( pgno==MAST
1e350 45 52 5f 52 4f 4f 54 2b 31 20 29 3b 0a 20 20 20  ER_ROOT+1 );.   
1e360 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
1e370 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b  yInfo->db==db );
1e380 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e390 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3d 3d   pKeyInfo->enc==
1e3a0 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20 20 20  ENC(db) );.     
1e3b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1e3c0 74 72 65 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  treeCursor(pCx->
1e3d0 70 42 74 78 2c 20 70 67 6e 6f 2c 20 42 54 52 45  pBtx, pgno, BTRE
1e3e0 45 5f 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20  E_WRCSR,.       
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
1e410 6f 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  o, pCx->uc.pCurs
1e420 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
1e430 20 20 20 70 43 78 2d 3e 69 73 54 61 62 6c 65 20     pCx->isTable 
1e440 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1e450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e460 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 43  e3BtreeCursor(pC
1e470 78 2d 3e 70 42 74 78 2c 20 4d 41 53 54 45 52 5f  x->pBtx, MASTER_
1e480 52 4f 4f 54 2c 20 42 54 52 45 45 5f 57 52 43 53  ROOT, BTREE_WRCS
1e490 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 20 30 2c 20 70 43 78 2d 3e 75 63 2e 70 43 75 72   0, pCx->uc.pCur
1e4c0 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 43 78 2d  sor);.      pCx-
1e4d0 3e 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  >isTable = 1;.  
1e4e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
1e4f0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
1e500 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 43  e_to_error;.  pC
1e510 78 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 28  x->isOrdered = (
1e520 70 4f 70 2d 3e 70 35 21 3d 42 54 52 45 45 5f 55  pOp->p5!=BTREE_U
1e530 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 62 72 65  NORDERED);.  bre
1e540 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1e550 3a 20 53 6f 72 74 65 72 4f 70 65 6e 20 50 31 20  : SorterOpen P1 
1e560 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 0a 2a 2a  P2 P3 P4 *.**.**
1e570 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72   This opcode wor
1e580 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f 70 65 6e 45  ks like OP_OpenE
1e590 70 68 65 6d 65 72 61 6c 20 65 78 63 65 70 74 20  phemeral except 
1e5a0 74 68 61 74 20 69 74 20 6f 70 65 6e 73 0a 2a 2a  that it opens.**
1e5b0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64   a transient ind
1e5c0 65 78 20 74 68 61 74 20 69 73 20 73 70 65 63 69  ex that is speci
1e5d0 66 69 63 61 6c 6c 79 20 64 65 73 69 67 6e 65 64  fically designed
1e5e0 20 74 6f 20 73 6f 72 74 20 6c 61 72 67 65 0a 2a   to sort large.*
1e5f0 2a 20 74 61 62 6c 65 73 20 75 73 69 6e 67 20 61  * tables using a
1e600 6e 20 65 78 74 65 72 6e 61 6c 20 6d 65 72 67 65  n external merge
1e610 2d 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 2e  -sort algorithm.
1e620 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
1e630 6e 74 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt P3 is non-zer
1e640 6f 2c 20 74 68 65 6e 20 69 74 20 69 6e 64 69 63  o, then it indic
1e650 61 74 65 73 20 74 68 61 74 20 74 68 65 20 73 6f  ates that the so
1e660 72 74 65 72 20 6d 61 79 0a 2a 2a 20 61 73 73 75  rter may.** assu
1e670 6d 65 20 74 68 61 74 20 61 20 73 74 61 62 6c 65  me that a stable
1e680 20 73 6f 72 74 20 63 6f 6e 73 69 64 65 72 69 6e   sort considerin
1e690 67 20 74 68 65 20 66 69 72 73 74 20 50 33 20 66  g the first P3 f
1e6a0 69 65 6c 64 73 20 6f 66 20 65 61 63 68 0a 2a 2a  ields of each.**
1e6b0 20 6b 65 79 20 69 73 20 73 75 66 66 69 63 69 65   key is sufficie
1e6c0 6e 74 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68  nt to produce th
1e6d0 65 20 72 65 71 75 69 72 65 64 20 72 65 73 75 6c  e required resul
1e6e0 74 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  ts..*/.case OP_S
1e6f0 6f 72 74 65 72 4f 70 65 6e 3a 20 7b 0a 20 20 56  orterOpen: {.  V
1e700 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a  dbeCursor *pCx;.
1e710 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
1e720 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  p1>=0 );.  asser
1e730 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( pOp->p2>=0 );
1e740 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74  .  pCx = allocat
1e750 65 43 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e  eCursor(p, pOp->
1e760 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 2d 31 2c  p1, pOp->p2, -1,
1e770 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 29   CURTYPE_SORTER)
1e780 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  ;.  if( pCx==0 )
1e790 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
1e7a0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  pCx->pKeyInfo = 
1e7b0 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
1e7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d  ;.  assert( pCx-
1e7d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64  >pKeyInfo->db==d
1e7e0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  b );.  assert( p
1e7f0 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  Cx->pKeyInfo->en
1e800 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20  c==ENC(db) );.  
1e810 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
1e820 53 6f 72 74 65 72 49 6e 69 74 28 64 62 2c 20 70  SorterInit(db, p
1e830 4f 70 2d 3e 70 33 2c 20 70 43 78 29 3b 0a 20 20  Op->p3, pCx);.  
1e840 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
1e850 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
1e860 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
1e870 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63   Opcode: Sequenc
1e880 65 54 65 73 74 20 50 31 20 50 32 20 2a 20 2a 20  eTest P1 P2 * * 
1e890 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  *.** Synopsis: i
1e8a0 66 28 20 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74  f( cursor[P1].ct
1e8b0 72 2b 2b 20 29 20 70 63 20 3d 20 50 32 0a 2a 2a  r++ ) pc = P2.**
1e8c0 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74  .** P1 is a sort
1e8d0 65 72 20 63 75 72 73 6f 72 2e 20 49 66 20 74 68  er cursor. If th
1e8e0 65 20 73 65 71 75 65 6e 63 65 20 63 6f 75 6e 74  e sequence count
1e8f0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
1e900 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a 2a 20 74 6f  zero, jump.** to
1e910 20 50 32 2e 20 52 65 67 61 72 64 6c 65 73 73 20   P2. Regardless 
1e920 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
1e930 74 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61  t the jump is ta
1e940 6b 65 6e 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  ken, increment t
1e950 68 65 0a 2a 2a 20 74 68 65 20 73 65 71 75 65 6e  he.** the sequen
1e960 63 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 63 61 73  ce value..*/.cas
1e970 65 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73  e OP_SequenceTes
1e980 74 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  t: {.  VdbeCurso
1e990 72 20 2a 70 43 3b 0a 20 20 61 73 73 65 72 74 28  r *pC;.  assert(
1e9a0 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
1e9b0 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
1e9c0 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
1e9d0 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
1e9e0 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
1e9f0 72 28 70 43 29 20 29 3b 0a 20 20 69 66 28 20 28  r(pC) );.  if( (
1ea00 70 43 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 29 3d  pC->seqCount++)=
1ea10 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a  =0 ){.    goto j
1ea20 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
1ea30 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1ea40 63 6f 64 65 3a 20 4f 70 65 6e 50 73 65 75 64 6f  code: OpenPseudo
1ea50 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
1ea60 20 53 79 6e 6f 70 73 69 73 3a 20 50 33 20 63 6f   Synopsis: P3 co
1ea70 6c 75 6d 6e 73 20 69 6e 20 72 5b 50 32 5d 0a 2a  lumns in r[P2].*
1ea80 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1ea90 63 75 72 73 6f 72 20 74 68 61 74 20 70 6f 69 6e  cursor that poin
1eaa0 74 73 20 74 6f 20 61 20 66 61 6b 65 20 74 61 62  ts to a fake tab
1eab0 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
1eac0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77   a single.** row
1ead0 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
1eae0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 61 74 20 6f  ontent of that o
1eaf0 6e 65 20 72 6f 77 20 69 73 20 74 68 65 20 63 6f  ne row is the co
1eb00 6e 74 65 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 0a  ntent of memory.
1eb10 2a 2a 20 72 65 67 69 73 74 65 72 20 50 32 2e 20  ** register P2. 
1eb20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1eb30 20 63 75 72 73 6f 72 20 50 31 20 62 65 63 6f 6d   cursor P1 becom
1eb40 65 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  es an alias for 
1eb50 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f 42 6c 6f 62  the .** MEM_Blob
1eb60 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69 6e   content contain
1eb70 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
1eb80 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 73 65 75 64  2..**.** A pseud
1eb90 6f 2d 74 61 62 6c 65 20 63 72 65 61 74 65 64 20  o-table created 
1eba0 62 79 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69  by this opcode i
1ebb0 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61  s used to hold a
1ebc0 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 6f 77 20 6f   single.** row o
1ebd0 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 73  utput from the s
1ebe0 6f 72 74 65 72 20 73 6f 20 74 68 61 74 20 74 68  orter so that th
1ebf0 65 20 72 6f 77 20 63 61 6e 20 62 65 20 64 65 63  e row can be dec
1ec00 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 0a 2a 2a 20  omposed into.** 
1ec10 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d  individual colum
1ec20 6e 73 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ns using the OP_
1ec30 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 20 20  Column opcode.  
1ec40 54 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  The OP_Column op
1ec50 63 6f 64 65 0a 2a 2a 20 69 73 20 74 68 65 20 6f  code.** is the o
1ec60 6e 6c 79 20 63 75 72 73 6f 72 20 6f 70 63 6f 64  nly cursor opcod
1ec70 65 20 74 68 61 74 20 77 6f 72 6b 73 20 77 69 74  e that works wit
1ec80 68 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  h a pseudo-table
1ec90 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69 73 20 74 68  ..**.** P3 is th
1eca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1ecb0 64 73 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ds in the record
1ecc0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 73  s that will be s
1ecd0 74 6f 72 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  tored by.** the 
1ece0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 2a 2f  pseudo-table..*/
1ecf0 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 50 73 65  .case OP_OpenPse
1ed00 75 64 6f 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  udo: {.  VdbeCur
1ed10 73 6f 72 20 2a 70 43 78 3b 0a 0a 20 20 61 73 73  sor *pCx;..  ass
1ed20 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1ed30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1ed40 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20 20 70 43 78  ->p3>=0 );.  pCx
1ed50 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f   = allocateCurso
1ed60 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  r(p, pOp->p1, pO
1ed70 70 2d 3e 70 33 2c 20 2d 31 2c 20 43 55 52 54 59  p->p3, -1, CURTY
1ed80 50 45 5f 50 53 45 55 44 4f 29 3b 0a 20 20 69 66  PE_PSEUDO);.  if
1ed90 28 20 70 43 78 3d 3d 30 20 29 20 67 6f 74 6f 20  ( pCx==0 ) goto 
1eda0 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43 78 2d 3e 6e  no_mem;.  pCx->n
1edb0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 70 43  ullRow = 1;.  pC
1edc0 78 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20  x->seekResult = 
1edd0 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 43 78 2d 3e  pOp->p2;.  pCx->
1ede0 69 73 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 2f  isTable = 1;.  /
1edf0 2a 20 47 69 76 65 20 74 68 69 73 20 70 73 65 75  * Give this pseu
1ee00 64 6f 2d 63 75 72 73 6f 72 20 61 20 66 61 6b 65  do-cursor a fake
1ee10 20 42 74 43 75 72 73 6f 72 20 70 6f 69 6e 74 65   BtCursor pointe
1ee20 72 20 73 6f 20 74 68 61 74 20 70 43 78 0a 20 20  r so that pCx.  
1ee30 2a 2a 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  ** can be safely
1ee40 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1ee50 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
1ee60 74 6f 28 29 2e 20 20 54 68 69 73 20 61 76 6f 69  to().  This avoi
1ee70 64 73 20 61 20 74 65 73 74 0a 20 20 2a 2a 20 66  ds a test.  ** f
1ee80 6f 72 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  or pCx->eCurType
1ee90 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
1eea0 69 6e 73 69 64 65 20 6f 66 20 73 71 6c 69 74 65  inside of sqlite
1eeb0 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
1eec0 6f 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 69  o().  ** which i
1eed0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
1eee0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a  optimization */.
1eef0 20 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f    pCx->uc.pCurso
1ef00 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
1ef10 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28  FakeValidCursor(
1ef20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
1ef30 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 62 72 65  ->p5==0 );.  bre
1ef40 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
1ef50 3a 20 43 6c 6f 73 65 20 50 31 20 2a 20 2a 20 2a  : Close P1 * * *
1ef60 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61   *.**.** Close a
1ef70 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75 73   cursor previous
1ef80 6c 79 20 6f 70 65 6e 65 64 20 61 73 20 50 31 2e  ly opened as P1.
1ef90 20 20 49 66 20 50 31 20 69 73 20 6e 6f 74 0a 2a    If P1 is not.*
1efa0 2a 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  * currently open
1efb0 2c 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  , this instructi
1efc0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1efd0 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 6f 73 65 3a  /.case OP_Close:
1efe0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70   {.  assert( pOp
1eff0 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
1f000 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
1f010 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  .  sqlite3VdbeFr
1f020 65 65 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61  eeCursor(p, p->a
1f030 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 29 3b 0a  pCsr[pOp->p1]);.
1f040 20 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e    p->apCsr[pOp->
1f050 70 31 5d 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b  p1] = 0;.  break
1f060 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1f070 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
1f080 5f 55 53 45 44 5f 4d 41 53 4b 0a 2f 2a 20 4f 70  _USED_MASK./* Op
1f090 63 6f 64 65 3a 20 43 6f 6c 75 6d 6e 73 55 73 65  code: ColumnsUse
1f0a0 64 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  d P1 * * P4 *.**
1f0b0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1f0c0 28 77 68 69 63 68 20 6f 6e 6c 79 20 65 78 69 73  (which only exis
1f0d0 74 73 20 69 66 20 53 51 4c 69 74 65 20 77 61 73  ts if SQLite was
1f0e0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a   compiled with.*
1f0f0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1f100 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
1f110 29 20 69 64 65 6e 74 69 66 69 65 73 20 77 68 69  ) identifies whi
1f120 63 68 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ch columns of th
1f130 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1f140 64 65 78 20 66 6f 72 20 63 75 72 73 6f 72 20 50  dex for cursor P
1f150 31 20 61 72 65 20 75 73 65 64 2e 20 20 50 34 20  1 are used.  P4 
1f160 69 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  is a 64-bit inte
1f170 67 65 72 0a 2a 2a 20 28 50 34 5f 49 4e 54 36 34  ger.** (P4_INT64
1f180 29 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 66  ) in which the f
1f190 69 72 73 74 20 36 33 20 62 69 74 73 20 61 72 65  irst 63 bits are
1f1a0 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 6f 66   one for each of
1f1b0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 36 33   the.** first 63
1f1c0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1f1d0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
1f1e0 68 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c 79  hat are actually
1f1f0 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
1f200 63 75 72 73 6f 72 2e 20 20 54 68 65 20 68 69 67  cursor.  The hig
1f210 68 2d 6f 72 64 65 72 20 62 69 74 20 69 73 20 73  h-order bit is s
1f220 65 74 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  et if any column
1f230 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 36 34   after.** the 64
1f240 74 68 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 63  th is used..*/.c
1f250 61 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73  ase OP_ColumnsUs
1f260 65 64 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73  ed: {.  VdbeCurs
1f270 6f 72 20 2a 70 43 3b 0a 20 20 70 43 20 3d 20 70  or *pC;.  pC = p
1f280 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
1f290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
1f2a0 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
1f2b0 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 2d  E_BTREE );.  pC-
1f2c0 3e 6d 61 73 6b 55 73 65 64 20 3d 20 2a 28 75 36  >maskUsed = *(u6
1f2d0 34 2a 29 70 4f 70 2d 3e 70 34 2e 70 49 36 34 3b  4*)pOp->p4.pI64;
1f2e0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64  .  break;.}.#end
1f2f0 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  if../* Opcode: S
1f300 65 65 6b 47 45 20 50 31 20 50 32 20 50 33 20 50  eekGE P1 P2 P3 P
1f310 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1f320 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
1f330 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1f340 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1f350 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1f360 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1f370 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1f380 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1f390 67 69 73 74 65 72 20 50 33 20 61 73 20 74 68 65  gister P3 as the
1f3a0 20 6b 65 79 2e 20 20 49 66 20 63 75 72 73 6f 72   key.  If cursor
1f3b0 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1f3c0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1f3d0 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1f3e0 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1f3f0 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1f400 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1f410 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1f420 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1f430 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1f440 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1f450 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1f460 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1f470 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1f480 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1f490 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
1f4a0 61 6c 75 65 2e 20 49 66 20 74 68 65 72 65 20 61  alue. If there a
1f4b0 72 65 20 6e 6f 20 72 65 63 6f 72 64 73 20 0a 2a  re no records .*
1f4c0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  * greater than o
1f4d0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1f4e0 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1f4f0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1f500 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66   to P2..**.** If
1f510 20 74 68 65 20 63 75 72 73 6f 72 20 50 31 20 77   the cursor P1 w
1f520 61 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  as opened using 
1f530 74 68 65 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45  the OPFLAG_SEEKE
1f540 51 20 66 6c 61 67 2c 20 74 68 65 6e 20 74 68 69  Q flag, then thi
1f550 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77 69 6c 6c  s.** opcode will
1f560 20 61 6c 77 61 79 73 20 6c 61 6e 64 20 6f 6e 20   always land on 
1f570 61 20 72 65 63 6f 72 64 20 74 68 61 74 20 65 71  a record that eq
1f580 75 61 6c 6c 79 20 65 71 75 61 6c 73 20 74 68 65  ually equals the
1f590 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65 6c 73 65   key, or.** else
1f5a0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
1f5b0 79 20 74 6f 20 50 32 2e 20 20 57 68 65 6e 20 74  y to P2.  When t
1f5c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 4f 50 46  he cursor is OPF
1f5d0 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74 68 69 73  LAG_SEEKEQ, this
1f5e0 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75 73 74 20  .** opcode must 
1f5f0 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  be followed by a
1f600 6e 20 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77  n IdxLE opcode w
1f610 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 72 67  ith the same arg
1f620 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 49  uments..** The I
1f630 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c 6c  dxLE opcode will
1f640 20 62 65 20 73 6b 69 70 70 65 64 20 69 66 20 74   be skipped if t
1f650 68 69 73 20 6f 70 63 6f 64 65 20 73 75 63 63 65  his opcode succe
1f660 65 64 73 2c 20 62 75 74 20 74 68 65 0a 2a 2a 20  eds, but the.** 
1f670 49 64 78 4c 45 20 6f 70 63 6f 64 65 20 77 69 6c  IdxLE opcode wil
1f680 6c 20 62 65 20 75 73 65 64 20 6f 6e 20 73 75 62  l be used on sub
1f690 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20 69 74 65  sequent loop ite
1f6a0 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  rations..**.** T
1f6b0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
1f6c0 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
1f6d0 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
1f6e0 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  in forward order
1f6f0 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65  ,.** from the be
1f700 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74  ginning toward t
1f710 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65  he end.  In othe
1f720 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
1f730 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
1f740 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74  ured to use Next
1f750 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a  , not Prev..**.*
1f760 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
1f770 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
1f780 6b 4c 74 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  kLt, SeekGt, See
1f790 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  kLe.*/./* Opcode
1f7a0 3a 20 53 65 65 6b 47 54 20 50 31 20 50 32 20 50  : SeekGT P1 P2 P
1f7b0 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  3 P4 *.** Synops
1f7c0 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d  is: key=r[P3@P4]
1f7d0 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  .**.** If cursor
1f7e0 20 50 31 20 72 65 66 65 72 73 20 74 6f 20 61 6e   P1 refers to an
1f7f0 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d 54 72   SQL table (B-Tr
1f800 65 65 20 74 68 61 74 20 75 73 65 73 20 69 6e 74  ee that uses int
1f810 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20  eger keys), .** 
1f820 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  use the value in
1f830 20 72 65 67 69 73 74 65 72 20 50 33 20 61 73 20   register P3 as 
1f840 61 20 6b 65 79 2e 20 49 66 20 63 75 72 73 6f 72  a key. If cursor
1f850 20 50 31 20 72 65 66 65 72 73 20 0a 2a 2a 20 74   P1 refers .** t
1f860 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20  o an SQL index, 
1f870 74 68 65 6e 20 50 33 20 69 73 20 74 68 65 20 66  then P3 is the f
1f880 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72 61 79  irst in an array
1f890 20 6f 66 20 50 34 20 72 65 67 69 73 74 65 72 73   of P4 registers
1f8a0 20 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 75 73   .** that are us
1f8b0 65 64 20 61 73 20 61 6e 20 75 6e 70 61 63 6b 65  ed as an unpacke
1f8c0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a  d index key. .**
1f8d0 0a 2a 2a 20 52 65 70 6f 73 69 74 69 6f 6e 20 63  .** Reposition c
1f8e0 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
1f8f0 20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74    it points to t
1f900 68 65 20 73 6d 61 6c 6c 65 73 74 20 65 6e 74 72  he smallest entr
1f910 79 20 74 68 61 74 20 0a 2a 2a 20 69 73 20 67 72  y that .** is gr
1f920 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6b  eater than the k
1f930 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65  ey value. If the
1f940 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64  re are no record
1f950 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  s greater than .
1f960 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20 50  ** the key and P
1f970 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  2 is not zero, t
1f980 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a  hen jump to P2..
1f990 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
1f9a0 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72  e leaves the cur
1f9b0 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74  sor configured t
1f9c0 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72  o move in forwar
1f9d0 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d  d order,.** from
1f9e0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74   the beginning t
1f9f0 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20  oward the end.  
1fa00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1fa10 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a  the cursor is.**
1fa20 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
1fa30 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65  se Next, not Pre
1fa40 76 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  v..**.** See als
1fa50 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75  o: Found, NotFou
1fa60 6e 64 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b  nd, SeekLt, Seek
1fa70 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a  Ge, SeekLe.*/./*
1fa80 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 54 20   Opcode: SeekLT 
1fa90 50 31 20 50 32 20 50 33 20 50 34 20 2a 20 0a 2a  P1 P2 P3 P4 * .*
1faa0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1fab0 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1fac0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fad0 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1fae0 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1faf0 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1fb00 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1fb10 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1fb20 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1fb30 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fb40 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1fb50 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1fb60 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1fb70 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1fb80 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1fb90 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1fba0 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1fbb0 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1fbc0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1fbd0 20 73 6f 20 74 68 61 74 20 20 69 74 20 70 6f 69   so that  it poi
1fbe0 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65  nts to the large
1fbf0 73 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a  st entry that .*
1fc00 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  * is less than t
1fc10 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1fc20 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1fc30 63 6f 72 64 73 20 6c 65 73 73 20 74 68 61 6e 20  cords less than 
1fc40 0a 2a 2a 20 74 68 65 20 6b 65 79 20 61 6e 64 20  .** the key and 
1fc50 50 32 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  P2 is not zero, 
1fc60 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
1fc70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
1fc80 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  de leaves the cu
1fc90 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64 20  rsor configured 
1fca0 74 6f 20 6d 6f 76 65 20 69 6e 20 72 65 76 65 72  to move in rever
1fcb0 73 65 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f  se order,.** fro
1fcc0 6d 20 74 68 65 20 65 6e 64 20 74 6f 77 61 72 64  m the end toward
1fcd0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 20   the beginning. 
1fce0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1fcf0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a 2a   the cursor is.*
1fd00 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  * configured to 
1fd10 75 73 65 20 50 72 65 76 2c 20 6e 6f 74 20 4e 65  use Prev, not Ne
1fd20 78 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  xt..**.** See al
1fd30 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f  so: Found, NotFo
1fd40 75 6e 64 2c 20 53 65 65 6b 47 74 2c 20 53 65 65  und, SeekGt, See
1fd50 6b 47 65 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f  kGe, SeekLe.*/./
1fd60 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65 6b 4c 45  * Opcode: SeekLE
1fd70 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1fd80 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
1fd90 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49  r[P3@P4].**.** I
1fda0 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fdb0 72 73 20 74 6f 20 61 6e 20 53 51 4c 20 74 61 62  rs to an SQL tab
1fdc0 6c 65 20 28 42 2d 54 72 65 65 20 74 68 61 74 20  le (B-Tree that 
1fdd0 75 73 65 73 20 69 6e 74 65 67 65 72 20 6b 65 79  uses integer key
1fde0 73 29 2c 20 0a 2a 2a 20 75 73 65 20 74 68 65 20  s), .** use the 
1fdf0 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
1fe00 72 20 50 33 20 61 73 20 61 20 6b 65 79 2e 20 49  r P3 as a key. I
1fe10 66 20 63 75 72 73 6f 72 20 50 31 20 72 65 66 65  f cursor P1 refe
1fe20 72 73 20 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c  rs .** to an SQL
1fe30 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 50 33 20   index, then P3 
1fe40 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  is the first in 
1fe50 61 6e 20 61 72 72 61 79 20 6f 66 20 50 34 20 72  an array of P4 r
1fe60 65 67 69 73 74 65 72 73 20 0a 2a 2a 20 74 68 61  egisters .** tha
1fe70 74 20 61 72 65 20 75 73 65 64 20 61 73 20 61 6e  t are used as an
1fe80 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   unpacked index 
1fe90 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f  key. .**.** Repo
1fea0 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20 50 31  sition cursor P1
1feb0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1fec0 74 73 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ts to the larges
1fed0 74 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a  t entry that .**
1fee0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1fef0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b 65   equal to the ke
1ff00 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 72  y value. If ther
1ff10 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72 64 73  e are no records
1ff20 20 0a 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 6f   .** less than o
1ff30 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6b  r equal to the k
1ff40 65 79 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74  ey and P2 is not
1ff50 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70   zero, then jump
1ff60 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68   to P2..**.** Th
1ff70 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
1ff80 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66   the cursor conf
1ff90 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69  igured to move i
1ffa0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c  n reverse order,
1ffb0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  .** from the end
1ffc0 20 74 6f 77 61 72 64 20 74 68 65 20 62 65 67 69   toward the begi
1ffd0 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72  nning.  In other
1ffe0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73   words, the curs
1fff0 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75  or is.** configu
20000 72 65 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c  red to use Prev,
20010 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a   not Next..**.**
20020 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 50   If the cursor P
20030 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75 73 69  1 was opened usi
20040 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f 53 45  ng the OPFLAG_SE
20050 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65 6e 20  EKEQ flag, then 
20060 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 77  this.** opcode w
20070 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e 64 20  ill always land 
20080 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68 61 74  on a record that
20090 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c 73 20   equally equals 
200a0 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a 20 65  the key, or.** e
200b0 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  lse jump immedia
200c0 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57 68 65  tely to P2.  Whe
200d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
200e0 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c 20 74  OPFLAG_SEEKEQ, t
200f0 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20 6d 75  his.** opcode mu
20100 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62  st be followed b
20110 79 20 61 6e 20 49 64 78 47 45 20 6f 70 63 6f 64  y an IdxGE opcod
20120 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
20130 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 54 68  arguments..** Th
20140 65 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20 77  e IdxGE opcode w
20150 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69  ill be skipped i
20160 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20 73 75  f this opcode su
20170 63 63 65 65 64 73 2c 20 62 75 74 20 74 68 65 0a  cceeds, but the.
20180 2a 2a 20 49 64 78 47 45 20 6f 70 63 6f 64 65 20  ** IdxGE opcode 
20190 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f 6e 20  will be used on 
201a0 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f 70 20  subsequent loop 
201b0 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  iterations..**.*
201c0 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e  * See also: Foun
201d0 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65  d, NotFound, See
201e0 6b 47 74 2c 20 53 65 65 6b 47 65 2c 20 53 65 65  kGt, SeekGe, See
201f0 6b 4c 74 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  kLt.*/.case OP_S
20200 65 65 6b 4c 54 3a 20 20 20 20 20 20 20 20 20 2f  eekLT:         /
20210 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
20220 61 73 65 20 4f 50 5f 53 65 65 6b 4c 45 3a 20 20  ase OP_SeekLE:  
20230 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
20240 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  in3 */.case OP_S
20250 65 65 6b 47 45 3a 20 20 20 20 20 20 20 20 20 2f  eekGE:         /
20260 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63  * jump, in3 */.c
20270 61 73 65 20 4f 50 5f 53 65 65 6b 47 54 3a 20 7b  ase OP_SeekGT: {
20280 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
20290 69 6e 33 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  in3 */.  int res
202a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
202b0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
202c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 63 3b 20 20 20   */.  int oc;   
202d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
202e0 64 65 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  de */.  VdbeCurs
202f0 6f 72 20 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68  or *pC;    /* Th
20300 65 20 63 75 72 73 6f 72 20 74 6f 20 73 65 65 6b  e cursor to seek
20310 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20320 63 6f 72 64 20 72 3b 20 20 2f 2a 20 54 68 65 20  cord r;  /* The 
20330 6b 65 79 20 74 6f 20 73 65 65 6b 20 66 6f 72 20  key to seek for 
20340 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
20350 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20360 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 72 20  r of columns or 
20370 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 6b 65  fields in the ke
20380 79 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 3b  y */.  i64 iKey;
20390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
203a0 20 72 6f 77 69 64 20 77 65 20 61 72 65 20 74 6f   rowid we are to
203b0 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e   seek to */.  in
203c0 74 20 65 71 4f 6e 6c 79 3b 20 20 20 20 20 20 20  t eqOnly;       
203d0 20 2f 2a 20 4f 6e 6c 79 20 69 6e 74 65 72 65 73   /* Only interes
203e0 74 65 64 20 69 6e 20 3d 3d 20 72 65 73 75 6c 74  ted in == result
203f0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
20400 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
20410 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
20420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
20430 70 2d 3e 70 32 21 3d 30 20 29 3b 0a 20 20 70 43  p->p2!=0 );.  pC
20440 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
20450 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
20460 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
20470 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
20480 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
20490 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53  ;.  assert( OP_S
204a0 65 65 6b 4c 45 20 3d 3d 20 4f 50 5f 53 65 65 6b  eekLE == OP_Seek
204b0 4c 54 2b 31 20 29 3b 0a 20 20 61 73 73 65 72 74  LT+1 );.  assert
204c0 28 20 4f 50 5f 53 65 65 6b 47 45 20 3d 3d 20 4f  ( OP_SeekGE == O
204d0 50 5f 53 65 65 6b 4c 54 2b 32 20 29 3b 0a 20 20  P_SeekLT+2 );.  
204e0 61 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47  assert( OP_SeekG
204f0 54 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 33  T == OP_SeekLT+3
20500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20510 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 3b 0a 20  ->isOrdered );. 
20520 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
20530 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
20540 6f 63 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  oc = pOp->opcode
20550 3b 0a 20 20 65 71 4f 6e 6c 79 20 3d 20 30 3b 0a  ;.  eqOnly = 0;.
20560 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20    pC->nullRow = 
20570 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
20580 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
20590 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  kOp = pOp->opcod
205a0 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  e;.#endif..  if(
205b0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a   pC->isTable ){.
205c0 20 20 20 20 2f 2a 20 54 68 65 20 42 54 52 45 45      /* The BTREE
205d0 5f 53 45 45 4b 5f 45 51 20 66 6c 61 67 20 69 73  _SEEK_EQ flag is
205e0 20 6f 6e 6c 79 20 73 65 74 20 6f 6e 20 69 6e 64   only set on ind
205f0 65 78 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  ex cursors */.  
20600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20610 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48  3BtreeCursorHasH
20620 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  int(pC->uc.pCurs
20630 6f 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  or, BTREE_SEEK_E
20640 51 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Q)==0.          
20650 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
20660 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  B );..    /* The
20670 20 69 6e 70 75 74 20 76 61 6c 75 65 20 69 6e 20   input value in 
20680 50 33 20 6d 69 67 68 74 20 62 65 20 6f 66 20 61  P3 might be of a
20690 6e 79 20 74 79 70 65 3a 20 69 6e 74 65 67 65 72  ny type: integer
206a0 2c 20 72 65 61 6c 2c 20 73 74 72 69 6e 67 2c 0a  , real, string,.
206b0 20 20 20 20 2a 2a 20 62 6c 6f 62 2c 20 6f 72 20      ** blob, or 
206c0 4e 55 4c 4c 2e 20 20 42 75 74 20 69 74 20 6e 65  NULL.  But it ne
206d0 65 64 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 74  eds to be an int
206e0 65 67 65 72 20 62 65 66 6f 72 65 20 77 65 20 63  eger before we c
206f0 61 6e 20 64 6f 0a 20 20 20 20 2a 2a 20 74 68 65  an do.    ** the
20700 20 73 65 65 6b 2c 20 73 6f 20 63 6f 6e 76 65 72   seek, so conver
20710 74 20 69 74 2e 20 2a 2f 0a 20 20 20 20 70 49 6e  t it. */.    pIn
20720 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
20730 33 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 49 6e  3];.    if( (pIn
20740 33 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f  3->flags & (MEM_
20750 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d  Int|MEM_Real|MEM
20760 5f 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20  _Str))==MEM_Str 
20770 29 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 4e 75  ){.      applyNu
20780 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 70 49  mericAffinity(pI
20790 6e 33 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n3, 0);.    }.  
207a0 20 20 69 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    iKey = sqlite3
207b0 56 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e  VdbeIntValue(pIn
207c0 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  3);..    /* If t
207d0 68 65 20 50 33 20 76 61 6c 75 65 20 63 6f 75 6c  he P3 value coul
207e0 64 20 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72 74  d not be convert
207f0 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  ed into an integ
20800 65 72 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a  er without.    *
20810 2a 20 6c 6f 73 73 20 6f 66 20 69 6e 66 6f 72 6d  * loss of inform
20820 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 70 65 63  ation, then spec
20830 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ial processing i
20840 73 20 72 65 71 75 69 72 65 64 2e 2e 2e 20 2a 2f  s required... */
20850 0a 20 20 20 20 69 66 28 20 28 70 49 6e 33 2d 3e  .    if( (pIn3->
20860 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
20870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
20880 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
20890 4d 45 4d 5f 52 65 61 6c 29 3d 3d 30 20 29 7b 0a  MEM_Real)==0 ){.
208a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
208b0 65 20 50 33 20 76 61 6c 75 65 20 63 61 6e 6e 6f  e P3 value canno
208c0 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  t be converted i
208d0 6e 74 6f 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  nto any kind of 
208e0 61 20 6e 75 6d 62 65 72 2c 0a 20 20 20 20 20 20  a number,.      
208f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 65    ** then the se
20900 65 6b 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ek is not possib
20910 6c 65 2c 20 73 6f 20 6a 75 6d 70 20 74 6f 20 50  le, so jump to P
20920 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62  2 */.        Vdb
20930 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32  eBranchTaken(1,2
20940 29 3b 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f  ); goto jump_to_
20950 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
20960 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
20970 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70 72    /* If the appr
20980 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20 69  oximation iKey i
20990 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
209a0 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20 73 65  e actual real se
209b0 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 65  arch.      ** te
209c0 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65 20 3e  rm, substitute >
209d0 3d 20 66 6f 72 20 3e 20 61 6e 64 20 3c 20 66 6f  = for > and < fo
209e0 72 20 3c 3d 2e 20 65 2e 67 2e 20 69 66 20 74 68  r <=. e.g. if th
209f0 65 20 73 65 61 72 63 68 20 74 65 72 6d 0a 20 20  e search term.  
20a00 20 20 20 20 2a 2a 20 69 73 20 34 2e 39 20 61 6e      ** is 4.9 an
20a10 64 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 70  d the integer ap
20a20 70 72 6f 78 69 6d 61 74 69 6f 6e 20 35 3a 0a 20  proximation 5:. 
20a30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20a40 20 20 20 20 20 20 20 20 28 78 20 3e 20 20 34 2e          (x >  4.
20a50 39 29 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20  9)    ->     (x 
20a60 3e 3d 20 35 29 0a 20 20 20 20 20 20 2a 2a 20 20  >= 5).      **  
20a70 20 20 20 20 20 20 28 78 20 3c 3d 20 34 2e 39 29        (x <= 4.9)
20a80 20 20 20 20 2d 3e 20 20 20 20 20 28 78 20 3c 20      ->     (x < 
20a90 20 35 29 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   5).      */.   
20aa0 20 20 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72     if( pIn3->u.r
20ab0 3c 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b  <(double)iKey ){
20ac0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20ad0 20 4f 50 5f 53 65 65 6b 47 45 3d 3d 28 4f 50 5f   OP_SeekGE==(OP_
20ae0 53 65 65 6b 47 54 2d 31 29 20 29 3b 0a 20 20 20  SeekGT-1) );.   
20af0 20 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f       assert( OP_
20b00 53 65 65 6b 4c 54 3d 3d 28 4f 50 5f 53 65 65 6b  SeekLT==(OP_Seek
20b10 4c 45 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  LE-1) );.       
20b20 20 61 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65   assert( (OP_See
20b30 6b 4c 45 20 26 20 30 78 30 30 30 31 29 3d 3d 28  kLE & 0x0001)==(
20b40 4f 50 5f 53 65 65 6b 47 54 20 26 20 30 78 30 30  OP_SeekGT & 0x00
20b50 30 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  01) );.        i
20b60 66 28 20 28 6f 63 20 26 20 30 78 30 30 30 31 29  f( (oc & 0x0001)
20b70 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26 20 30  ==(OP_SeekGT & 0
20b80 78 30 30 30 31 29 20 29 20 6f 63 2d 2d 3b 0a 20  x0001) ) oc--;. 
20b90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20ba0 20 49 66 20 74 68 65 20 61 70 70 72 6f 78 69 6d   If the approxim
20bb0 61 74 69 6f 6e 20 69 4b 65 79 20 69 73 20 73 6d  ation iKey is sm
20bc0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 61  aller than the a
20bd0 63 74 75 61 6c 20 72 65 61 6c 20 73 65 61 72 63  ctual real searc
20be0 68 0a 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 2c  h.      ** term,
20bf0 20 73 75 62 73 74 69 74 75 74 65 20 3c 3d 20 66   substitute <= f
20c00 6f 72 20 3c 20 61 6e 64 20 3e 20 66 6f 72 20 3e  or < and > for >
20c10 3d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 6c 73  =.  */.      els
20c20 65 20 69 66 28 20 70 49 6e 33 2d 3e 75 2e 72 3e  e if( pIn3->u.r>
20c30 28 64 6f 75 62 6c 65 29 69 4b 65 79 20 29 7b 0a  (double)iKey ){.
20c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20c50 4f 50 5f 53 65 65 6b 4c 45 3d 3d 28 4f 50 5f 53  OP_SeekLE==(OP_S
20c60 65 65 6b 4c 54 2b 31 29 20 29 3b 0a 20 20 20 20  eekLT+1) );.    
20c70 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 5f 53      assert( OP_S
20c80 65 65 6b 47 54 3d 3d 28 4f 50 5f 53 65 65 6b 47  eekGT==(OP_SeekG
20c90 45 2b 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  E+1) );.        
20ca0 61 73 73 65 72 74 28 20 28 4f 50 5f 53 65 65 6b  assert( (OP_Seek
20cb0 4c 54 20 26 20 30 78 30 30 30 31 29 3d 3d 28 4f  LT & 0x0001)==(O
20cc0 50 5f 53 65 65 6b 47 45 20 26 20 30 78 30 30 30  P_SeekGE & 0x000
20cd0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  1) );.        if
20ce0 28 20 28 6f 63 20 26 20 30 78 30 30 30 31 29 3d  ( (oc & 0x0001)=
20cf0 3d 28 4f 50 5f 53 65 65 6b 4c 54 20 26 20 30 78  =(OP_SeekLT & 0x
20d00 30 30 30 31 29 20 29 20 6f 63 2b 2b 3b 0a 20 20  0001) ) oc++;.  
20d10 20 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 20      }.    } .   
20d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20d30 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
20d40 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
20d50 20 30 2c 20 28 75 36 34 29 69 4b 65 79 2c 20 30   0, (u64)iKey, 0
20d60 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d  , &res);.    pC-
20d70 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20  >movetoTarget = 
20d80 69 4b 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62  iKey;  /* Used b
20d90 79 20 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20  y OP_Delete */. 
20da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
20dc0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
20dd0 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
20de0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
20df0 20 61 20 63 75 72 73 6f 72 20 77 69 74 68 20 74   a cursor with t
20e00 68 65 20 42 54 52 45 45 5f 53 45 45 4b 5f 45 51  he BTREE_SEEK_EQ
20e10 20 68 69 6e 74 2c 20 6f 6e 6c 79 20 74 68 65 20   hint, only the 
20e20 4f 50 5f 53 65 65 6b 47 45 20 61 6e 64 0a 20 20  OP_SeekGE and.  
20e30 20 20 2a 2a 20 4f 50 5f 53 65 65 6b 4c 45 20 6f    ** OP_SeekLE o
20e40 70 63 6f 64 65 73 20 61 72 65 20 61 6c 6c 6f 77  pcodes are allow
20e50 65 64 2c 20 61 6e 64 20 74 68 65 73 65 20 6d 75  ed, and these mu
20e60 73 74 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  st be immediatel
20e70 79 20 66 6f 6c 6c 6f 77 65 64 0a 20 20 20 20 2a  y followed.    *
20e80 2a 20 62 79 20 61 6e 20 4f 50 5f 49 64 78 47 54  * by an OP_IdxGT
20e90 20 6f 72 20 4f 50 5f 49 64 78 4c 54 20 6f 70 63   or OP_IdxLT opc
20ea0 6f 64 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ode, respectivel
20eb0 79 2c 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  y, with the same
20ec0 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
20ed0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
20ee0 65 43 75 72 73 6f 72 48 61 73 48 69 6e 74 28 70  eCursorHasHint(p
20ef0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 42  C->uc.pCursor, B
20f00 54 52 45 45 5f 53 45 45 4b 5f 45 51 29 20 29 7b  TREE_SEEK_EQ) ){
20f10 0a 20 20 20 20 20 20 65 71 4f 6e 6c 79 20 3d 20  .      eqOnly = 
20f20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
20f30 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
20f40 5f 53 65 65 6b 47 45 20 7c 7c 20 70 4f 70 2d 3e  _SeekGE || pOp->
20f50 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 4c  opcode==OP_SeekL
20f60 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
20f70 74 28 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65  t( pOp[1].opcode
20f80 3d 3d 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f  ==OP_IdxLT || pO
20f90 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  p[1].opcode==OP_
20fa0 49 64 78 47 54 20 29 3b 0a 20 20 20 20 20 20 61  IdxGT );.      a
20fb0 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70 31  ssert( pOp[1].p1
20fc0 3d 3d 70 4f 70 5b 30 5d 2e 70 31 20 29 3b 0a 20  ==pOp[0].p1 );. 
20fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
20fe0 5b 31 5d 2e 70 32 3d 3d 70 4f 70 5b 30 5d 2e 70  [1].p2==pOp[0].p
20ff0 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  2 );.      asser
21000 74 28 20 70 4f 70 5b 31 5d 2e 70 33 3d 3d 70 4f  t( pOp[1].p3==pO
21010 70 5b 30 5d 2e 70 33 20 29 3b 0a 20 20 20 20 20  p[0].p3 );.     
21020 20 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e   assert( pOp[1].
21030 70 34 2e 69 3d 3d 70 4f 70 5b 30 5d 2e 70 34 2e  p4.i==pOp[0].p4.
21040 69 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  i );.    }..    
21050 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e 70 34  nField = pOp->p4
21060 2e 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  .i;.    assert( 
21070 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
21080 49 4e 54 33 32 20 29 3b 0a 20 20 20 20 61 73 73  INT32 );.    ass
21090 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20 29 3b  ert( nField>0 );
210a0 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20  .    r.pKeyInfo 
210b0 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  = pC->pKeyInfo;.
210c0 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20 28      r.nField = (
210d0 75 31 36 29 6e 46 69 65 6c 64 3b 0a 0a 20 20 20  u16)nField;..   
210e0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 6c 69 6e   /* The next lin
210f0 65 20 6f 66 20 63 6f 64 65 20 63 6f 6d 70 75 74  e of code comput
21100 65 73 20 61 73 20 66 6f 6c 6c 6f 77 73 2c 20 6f  es as follows, o
21110 6e 6c 79 20 66 61 73 74 65 72 3a 0a 20 20 20 20  nly faster:.    
21120 2a 2a 20 20 20 69 66 28 20 6f 63 3d 3d 4f 50 5f  **   if( oc==OP_
21130 53 65 65 6b 47 54 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekGT || oc==OP
21140 5f 53 65 65 6b 4c 45 20 29 7b 0a 20 20 20 20 2a  _SeekLE ){.    *
21150 2a 20 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f  *     r.default_
21160 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 2a 2a 20  rc = -1;.    ** 
21170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
21180 20 20 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63      r.default_rc
21190 20 3d 20 2b 31 3b 0a 20 20 20 20 2a 2a 20 20 20   = +1;.    **   
211a0 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 2e 64  }.    */.    r.d
211b0 65 66 61 75 6c 74 5f 72 63 20 3d 20 28 28 31 20  efault_rc = ((1 
211c0 26 20 28 6f 63 20 2d 20 4f 50 5f 53 65 65 6b 4c  & (oc - OP_SeekL
211d0 54 29 29 20 3f 20 2d 31 20 3a 20 2b 31 29 3b 0a  T)) ? -1 : +1);.
211e0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21 3d      assert( oc!=
211f0 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 72 2e 64  OP_SeekGT || r.d
21200 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29 3b  efault_rc==-1 );
21210 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 21  .    assert( oc!
21220 3d 4f 50 5f 53 65 65 6b 4c 45 20 7c 7c 20 72 2e  =OP_SeekLE || r.
21230 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 20 29  default_rc==-1 )
21240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 63  ;.    assert( oc
21250 21 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20 72  !=OP_SeekGE || r
21260 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31 20  .default_rc==+1 
21270 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
21280 63 21 3d 4f 50 5f 53 65 65 6b 4c 54 20 7c 7c 20  c!=OP_SeekLT || 
21290 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2b 31  r.default_rc==+1
212a0 20 29 3b 0a 0a 20 20 20 20 72 2e 61 4d 65 6d 20   );..    r.aMem 
212b0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
212c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
212d0 44 45 42 55 47 0a 20 20 20 20 7b 20 69 6e 74 20  DEBUG.    { int 
212e0 69 3b 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e  i; for(i=0; i<r.
212f0 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73  nField; i++) ass
21300 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28  ert( memIsValid(
21310 26 72 2e 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d  &r.aMem[i]) ); }
21320 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 2e 65 71  .#endif.    r.eq
21330 53 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 63  Seen = 0;.    rc
21340 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
21350 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
21360 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 72  ->uc.pCursor, &r
21370 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
21380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
213a0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
213b0 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
213c0 20 69 66 28 20 65 71 4f 6e 6c 79 20 26 26 20 72   if( eqOnly && r
213d0 2e 65 71 53 65 65 6e 3d 3d 30 20 29 7b 0a 20 20  .eqSeen==0 ){.  
213e0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
213f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 );.      goto
21400 20 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75 6e 64 3b   seek_not_found;
21410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 2d  .    }.  }.  pC-
21420 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
21430 3d 20 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65  = 0;.  pC->cache
21440 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
21450 54 41 4c 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  TALE;.#ifdef SQL
21460 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
21470 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
21480 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  +;.#endif.  if( 
21490 6f 63 3e 3d 4f 50 5f 53 65 65 6b 47 45 20 29 7b  oc>=OP_SeekGE ){
214a0 20 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50    assert( oc==OP
214b0 5f 53 65 65 6b 47 45 20 7c 7c 20 6f 63 3d 3d 4f  _SeekGE || oc==O
214c0 50 5f 53 65 65 6b 47 54 20 29 3b 0a 20 20 20 20  P_SeekGT );.    
214d0 69 66 28 20 72 65 73 3c 30 20 7c 7c 20 28 72 65  if( res<0 || (re
214e0 73 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53  s==0 && oc==OP_S
214f0 65 65 6b 47 54 29 20 29 7b 0a 20 20 20 20 20 20  eekGT) ){.      
21500 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  res = 0;.      r
21510 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21520 4e 65 78 74 28 70 43 2d 3e 75 63 2e 70 43 75 72  Next(pC->uc.pCur
21530 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  sor, 0);.      i
21540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21550 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21560 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
21570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21580 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21590 20 20 20 20 20 20 20 72 65 73 20 3d 20 31 3b 0a         res = 1;.
215a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
215b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62           goto ab
215c0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
215d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
215e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
215f0 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
21600 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21610 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
21620 53 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekLT || oc==OP
21630 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69  _SeekLE );.    i
21640 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73  f( res>0 || (res
21650 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
21660 65 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72  ekLT) ){.      r
21670 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
21680 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
21690 72 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70  revious(pC->uc.p
216a0 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
216b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
216c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
216d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
216e0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
216f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21700 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
21710 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
21720 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
21730 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
21740 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ror;.        }. 
21750 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
21760 7b 0a 20 20 20 20 20 20 2f 2a 20 72 65 73 20 6d  {.      /* res m
21770 69 67 68 74 20 62 65 20 6e 65 67 61 74 69 76 65  ight be negative
21780 20 62 65 63 61 75 73 65 20 74 68 65 20 74 61 62   because the tab
21790 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 20 43 68  le is empty.  Ch
217a0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
217b0 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 74  see if this is t
217c0 68 65 20 63 61 73 65 2e 0a 20 20 20 20 20 20 2a  he case..      *
217d0 2f 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73 71  /.      res = sq
217e0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 70 43  lite3BtreeEof(pC
217f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
21800 20 20 20 7d 0a 20 20 7d 0a 73 65 65 6b 5f 6e 6f     }.  }.seek_no
21810 74 5f 66 6f 75 6e 64 3a 0a 20 20 61 73 73 65 72  t_found:.  asser
21820 74 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a  t( pOp->p2>0 );.
21830 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
21840 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
21850 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  f( res ){.    go
21860 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
21870 20 7d 65 6c 73 65 20 69 66 28 20 65 71 4f 6e 6c   }else if( eqOnl
21880 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
21890 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d   pOp[1].opcode==
218a0 4f 50 5f 49 64 78 4c 54 20 7c 7c 20 70 4f 70 5b  OP_IdxLT || pOp[
218b0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
218c0 78 47 54 20 29 3b 0a 20 20 20 20 70 4f 70 2b 2b  xGT );.    pOp++
218d0 3b 20 2f 2a 20 53 6b 69 70 20 74 68 65 20 4f 50  ; /* Skip the OP
218e0 5f 49 64 78 4c 74 20 6f 72 20 4f 50 5f 49 64 78  _IdxLt or OP_Idx
218f0 47 54 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  GT that follows 
21900 2a 2f 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  */.  }.  break;.
21910 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6f  }../* Opcode: Fo
21920 75 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20  und P1 P2 P3 P4 
21930 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  *.** Synopsis: k
21940 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
21950 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20  * If P4==0 then 
21960 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64  register P3 hold
21970 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75  s a blob constru
21980 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f  cted by MakeReco
21990 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20  rd.  If.** P4>0 
219a0 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33  then register P3
219b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66   is the first of
219c0 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68   P4 registers th
219d0 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63  at form an unpac
219e0 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a  ked.** record..*
219f0 2a 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69  *.** Cursor P1 i
21a00 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
21a10 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
21a20 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21a30 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21a40 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e  s a prefix of an
21a50 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74 68  y entry in P1 th
21a60 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  en a jump is mad
21a70 65 20 74 6f 20 50 32 20 61 6e 64 0a 2a 2a 20 50  e to P2 and.** P
21a80 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  1 is left pointi
21a90 6e 67 20 61 74 20 74 68 65 20 6d 61 74 63 68 69  ng at the matchi
21aa0 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ng entry..**.** 
21ab0 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c  This operation l
21ac0 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
21ad0 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72   in a state wher
21ae0 65 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 61  e it can be.** a
21af0 64 76 61 6e 63 65 64 20 69 6e 20 74 68 65 20 66  dvanced in the f
21b00 6f 72 77 61 72 64 20 64 69 72 65 63 74 69 6f 6e  orward direction
21b10 2e 20 20 54 68 65 20 4e 65 78 74 20 69 6e 73 74  .  The Next inst
21b20 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 77 6f 72  ruction will wor
21b30 6b 2c 0a 2a 2a 20 62 75 74 20 6e 6f 74 20 74 68  k,.** but not th
21b40 65 20 50 72 65 76 20 69 6e 73 74 72 75 63 74 69  e Prev instructi
21b50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21b60 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f  so: NotFound, No
21b70 43 6f 6e 66 6c 69 63 74 2c 20 4e 6f 74 45 78 69  Conflict, NotExi
21b80 73 74 73 2e 20 53 65 65 6b 47 65 0a 2a 2f 0a 2f  sts. SeekGe.*/./
21b90 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 46 6f 75  * Opcode: NotFou
21ba0 6e 64 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  nd P1 P2 P3 P4 *
21bb0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65  .** Synopsis: ke
21bc0 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a  y=r[P3@P4].**.**
21bd0 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e 20 72   If P4==0 then r
21be0 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c 64 73  egister P3 holds
21bf0 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72 75 63   a blob construc
21c00 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63 6f 72  ted by MakeRecor
21c10 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30 20 74  d.  If.** P4>0 t
21c20 68 65 6e 20 72 65 67 69 73 74 65 72 20 50 33 20  hen register P3 
21c30 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  is the first of 
21c40 50 34 20 72 65 67 69 73 74 65 72 73 20 74 68 61  P4 registers tha
21c50 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b  t form an unpack
21c60 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a  ed.** record..**
21c70 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31 20 69   .** Cursor P1 i
21c80 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 74  s on an index bt
21c90 72 65 65 2e 20 20 49 66 20 74 68 65 20 72 65 63  ree.  If the rec
21ca0 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64 20 62  ord identified b
21cb0 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a 20 69  y P3 and P4.** i
21cc0 73 20 6e 6f 74 20 74 68 65 20 70 72 65 66 69 78  s not the prefix
21cd0 20 6f 66 20 61 6e 79 20 65 6e 74 72 79 20 69 6e   of any entry in
21ce0 20 50 31 20 74 68 65 6e 20 61 20 6a 75 6d 70 20   P1 then a jump 
21cf0 69 73 20 6d 61 64 65 20 74 6f 20 50 32 2e 20 20  is made to P2.  
21d00 49 66 20 50 31 20 0a 2a 2a 20 64 6f 65 73 20 63  If P1 .** does c
21d10 6f 6e 74 61 69 6e 20 61 6e 20 65 6e 74 72 79 20  ontain an entry 
21d20 77 68 6f 73 65 20 70 72 65 66 69 78 20 6d 61 74  whose prefix mat
21d30 63 68 65 73 20 74 68 65 20 50 33 2f 50 34 20 72  ches the P3/P4 r
21d40 65 63 6f 72 64 20 74 68 65 6e 20 63 6f 6e 74 72  ecord then contr
21d50 6f 6c 0a 2a 2a 20 66 61 6c 6c 73 20 74 68 72 6f  ol.** falls thro
21d60 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
21d70 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
21d80 50 31 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  P1 is left point
21d90 69 6e 67 20 61 74 20 74 68 65 0a 2a 2a 20 6d 61  ing at the.** ma
21da0 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 0a 2a 2a  tching entry..**
21db0 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69  .** This operati
21dc0 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20 63 75  on leaves the cu
21dd0 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74 65 20  rsor in a state 
21de0 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f 74 20  where it cannot 
21df0 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64 20 69  be.** advanced i
21e00 6e 20 65 69 74 68 65 72 20 64 69 72 65 63 74 69  n either directi
21e10 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
21e20 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20 61 6e  rds, the Next an
21e30 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f 64 65  d Prev.** opcode
21e40 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20 61 66  s do not work af
21e50 74 65 72 20 74 68 69 73 20 6f 70 65 72 61 74 69  ter this operati
21e60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  on..**.** See al
21e70 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e 6f 74 45 78  so: Found, NotEx
21e80 69 73 74 73 2c 20 4e 6f 43 6f 6e 66 6c 69 63 74  ists, NoConflict
21e90 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
21ea0 6f 43 6f 6e 66 6c 69 63 74 20 50 31 20 50 32 20  oConflict P1 P2 
21eb0 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70  P3 P4 *.** Synop
21ec0 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34  sis: key=r[P3@P4
21ed0 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 3d 3d 30  ].**.** If P4==0
21ee0 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
21ef0 33 20 68 6f 6c 64 73 20 61 20 62 6c 6f 62 20 63  3 holds a blob c
21f00 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 4d 61  onstructed by Ma
21f10 6b 65 52 65 63 6f 72 64 2e 20 20 49 66 0a 2a 2a  keRecord.  If.**
21f20 20 50 34 3e 30 20 74 68 65 6e 20 72 65 67 69 73   P4>0 then regis
21f30 74 65 72 20 50 33 20 69 73 20 74 68 65 20 66 69  ter P3 is the fi
21f40 72 73 74 20 6f 66 20 50 34 20 72 65 67 69 73 74  rst of P4 regist
21f50 65 72 73 20 74 68 61 74 20 66 6f 72 6d 20 61 6e  ers that form an
21f60 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 72 65 63   unpacked.** rec
21f70 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20 43 75 72 73  ord..** .** Curs
21f80 6f 72 20 50 31 20 69 73 20 6f 6e 20 61 6e 20 69  or P1 is on an i
21f90 6e 64 65 78 20 62 74 72 65 65 2e 20 20 49 66 20  ndex btree.  If 
21fa0 74 68 65 20 72 65 63 6f 72 64 20 69 64 65 6e 74  the record ident
21fb0 69 66 69 65 64 20 62 79 20 50 33 20 61 6e 64 20  ified by P3 and 
21fc0 50 34 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61  P4.** contains a
21fd0 6e 79 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 6a  ny NULL value, j
21fe0 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
21ff0 74 6f 20 50 32 2e 20 20 49 66 20 61 6c 6c 20 74  to P2.  If all t
22000 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 72  erms of the.** r
22010 65 63 6f 72 64 20 61 72 65 20 6e 6f 74 2d 4e 55  ecord are not-NU
22020 4c 4c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 20  LL then a check 
22030 69 73 20 64 6f 6e 65 20 74 6f 20 64 65 74 65 72  is done to deter
22040 6d 69 6e 65 20 69 66 20 61 6e 79 20 72 6f 77 20  mine if any row 
22050 69 6e 20 74 68 65 0a 2a 2a 20 50 31 20 69 6e 64  in the.** P1 ind
22060 65 78 20 62 74 72 65 65 20 68 61 73 20 61 20 6d  ex btree has a m
22070 61 74 63 68 69 6e 67 20 6b 65 79 20 70 72 65 66  atching key pref
22080 69 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ix.  If there ar
22090 65 20 6e 6f 20 6d 61 74 63 68 65 73 2c 20 6a 75  e no matches, ju
220a0 6d 70 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  mp.** immediatel
220b0 79 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  y to P2.  If the
220c0 72 65 20 69 73 20 61 20 6d 61 74 63 68 2c 20 66  re is a match, f
220d0 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20  all through and 
220e0 6c 65 61 76 65 20 74 68 65 20 50 31 0a 2a 2a 20  leave the P1.** 
220f0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
22100 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
22110 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
22120 6f 70 63 6f 64 65 20 69 73 20 73 69 6d 69 6c 61  opcode is simila
22130 72 20 74 6f 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  r to OP_NotFound
22140 20 77 69 74 68 20 74 68 65 20 65 78 63 65 70 74   with the except
22150 69 6f 6e 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  ions that the.**
22160 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79   branch is alway
22170 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 79 20 70  s taken if any p
22180 61 72 74 20 6f 66 20 74 68 65 20 73 65 61 72 63  art of the searc
22190 68 20 6b 65 79 20 69 6e 70 75 74 20 69 73 20 4e  h key input is N
221a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
221b0 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73  operation leaves
221c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
221d0 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
221e0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 61 64 76  cannot be.** adv
221f0 61 6e 63 65 64 20 69 6e 20 65 69 74 68 65 72 20  anced in either 
22200 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
22210 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
22220 4e 65 78 74 20 61 6e 64 20 50 72 65 76 0a 2a 2a  Next and Prev.**
22230 20 6f 70 63 6f 64 65 73 20 64 6f 20 6e 6f 74 20   opcodes do not 
22240 77 6f 72 6b 20 61 66 74 65 72 20 74 68 69 73 20  work after this 
22250 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
22260 20 53 65 65 20 61 6c 73 6f 3a 20 4e 6f 74 46 6f   See also: NotFo
22270 75 6e 64 2c 20 46 6f 75 6e 64 2c 20 4e 6f 74 45  und, Found, NotE
22280 78 69 73 74 73 0a 2a 2f 0a 63 61 73 65 20 4f 50  xists.*/.case OP
22290 5f 4e 6f 43 6f 6e 66 6c 69 63 74 3a 20 20 20 20  _NoConflict:    
222a0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
222b0 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e  .case OP_NotFoun
222c0 64 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  d:       /* jump
222d0 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50  , in3 */.case OP
222e0 5f 46 6f 75 6e 64 3a 20 7b 20 20 20 20 20 20 20  _Found: {       
222f0 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a 2f   /* jump, in3 */
22300 0a 20 20 69 6e 74 20 61 6c 72 65 61 64 79 45 78  .  int alreadyEx
22310 69 73 74 73 3b 0a 20 20 69 6e 74 20 74 61 6b 65  ists;.  int take
22320 4a 75 6d 70 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  Jump;.  int ii;.
22330 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
22340 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55  ;.  int res;.  U
22350 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22360 46 72 65 65 3b 0a 20 20 55 6e 70 61 63 6b 65 64  Free;.  Unpacked
22370 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
22380 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
22390 64 20 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d r;..#ifdef SQL
223a0 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 70  ITE_TEST.  if( p
223b0 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e  Op->opcode!=OP_N
223c0 6f 43 6f 6e 66 6c 69 63 74 20 29 20 73 71 6c 69  oConflict ) sqli
223d0 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2b  te3_found_count+
223e0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  +;.#endif..  ass
223f0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
22400 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
22410 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
22420 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
22430 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 70 43  P4_INT32 );.  pC
22440 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
22450 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
22460 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  pC!=0 );.#ifdef 
22470 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
22480 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d  C->seekOp = pOp-
22490 3e 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  >opcode;.#endif.
224a0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
224b0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73 65 72  Op->p3];.  asser
224c0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
224d0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
224e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
224f0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
22500 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
22510 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 69  sTable==0 );.  i
22520 66 28 20 70 4f 70 2d 3e 70 34 2e 69 3e 30 20 29  f( pOp->p4.i>0 )
22530 7b 0a 20 20 20 20 72 2e 70 4b 65 79 49 6e 66 6f  {.    r.pKeyInfo
22540 20 3d 20 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b   = pC->pKeyInfo;
22550 0a 20 20 20 20 72 2e 6e 46 69 65 6c 64 20 3d 20  .    r.nField = 
22560 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69 3b 0a  (u16)pOp->p4.i;.
22570 20 20 20 20 72 2e 61 4d 65 6d 20 3d 20 70 49 6e      r.aMem = pIn
22580 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  3;.#ifdef SQLITE
22590 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69  _DEBUG.    for(i
225a0 69 3d 30 3b 20 69 69 3c 72 2e 6e 46 69 65 6c 64  i=0; ii<r.nField
225b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
225c0 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
225d0 64 28 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 20 29  d(&r.aMem[ii]) )
225e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
225f0 28 72 2e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67  (r.aMem[ii].flag
22600 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
22610 20 7c 7c 20 72 2e 61 4d 65 6d 5b 69 69 5d 2e 6e   || r.aMem[ii].n
22620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
22630 20 69 69 20 29 20 52 45 47 49 53 54 45 52 5f 54   ii ) REGISTER_T
22640 52 41 43 45 28 70 4f 70 2d 3e 70 33 2b 69 69 2c  RACE(pOp->p3+ii,
22650 20 26 72 2e 61 4d 65 6d 5b 69 69 5d 29 3b 0a 20   &r.aMem[ii]);. 
22660 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22670 70 49 64 78 4b 65 79 20 3d 20 26 72 3b 0a 20 20  pIdxKey = &r;.  
22680 20 20 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d    pFree = 0;.  }
22690 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
226a0 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20  ( pIn3->flags & 
226b0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
226c0 72 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28  rc = ExpandBlob(
226d0 70 49 6e 33 29 3b 0a 20 20 20 20 61 73 73 65 72  pIn3);.    asser
226e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
226f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
22700 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
22710 72 63 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  rc ) goto no_mem
22720 3b 0a 20 20 20 20 70 46 72 65 65 20 3d 20 70 49  ;.    pFree = pI
22730 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
22740 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
22750 52 65 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49  Record(pC->pKeyI
22760 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49  nfo);.    if( pI
22770 64 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20  dxKey==0 ) goto 
22780 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  no_mem;.    sqli
22790 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
227a0 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f  ack(pC->pKeyInfo
227b0 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33 2d  , pIn3->n, pIn3-
227c0 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  >z, pIdxKey);.  
227d0 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  }.  pIdxKey->def
227e0 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 74  ault_rc = 0;.  t
227f0 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 69  akeJump = 0;.  i
22800 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
22810 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29 7b  OP_NoConflict ){
22820 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20  .    /* For the 
22830 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f 70  OP_NoConflict op
22840 63 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20 6a  code, take the j
22850 75 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ump if any of th
22860 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 66  e.    ** input f
22870 69 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c 20  ields are NULL, 
22880 73 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77 69  since any key wi
22890 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20 6e  th a NULL will n
228a0 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c 69  ot.    ** confli
228b0 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  ct */.    for(ii
228c0 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d 3e  =0; ii<pIdxKey->
228d0 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a 20  nField; ii++){. 
228e0 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
228f0 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67 73  ->aMem[ii].flags
22900 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
22910 20 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70 20         takeJump 
22920 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
22930 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22940 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
22950 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
22960 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70  npacked(pC->uc.p
22970 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79 2c  Cursor, pIdxKey,
22980 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20   0, 0, &res);.  
22990 69 66 28 20 70 46 72 65 65 20 29 20 73 71 6c 69  if( pFree ) sqli
229a0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
229b0 70 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63  pFree);.  if( rc
229c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
229d0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
229e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
229f0 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74    pC->seekResult
22a00 20 3d 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64   = res;.  alread
22a10 79 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d  yExists = (res==
22a20 30 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f  0);.  pC->nullRo
22a30 77 20 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69  w = 1-alreadyExi
22a40 73 74 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72  sts;.  pC->defer
22a50 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
22a60 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
22a70 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
22a80 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
22a90 65 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20  e==OP_Found ){. 
22aa0 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b     VdbeBranchTak
22ab0 65 6e 28 61 6c 72 65 61 64 79 45 78 69 73 74 73  en(alreadyExists
22ac0 21 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20  !=0,2);.    if( 
22ad0 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20  alreadyExists ) 
22ae0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
22af0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
22b00 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61  beBranchTaken(ta
22b10 6b 65 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45  keJump||alreadyE
22b20 78 69 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20  xists==0,2);.   
22b30 20 69 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c   if( takeJump ||
22b40 20 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20   !alreadyExists 
22b50 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
22b60 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  2;.  }.  break;.
22b70 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  }../* Opcode: Se
22b80 65 6b 52 6f 77 69 64 20 50 31 20 50 32 20 50 33  ekRowid P1 P2 P3
22b90 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
22ba0 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a  : intkey=r[P3].*
22bb0 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
22bc0 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72  ndex of a cursor
22bd0 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20   open on an SQL 
22be0 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74  table btree (wit
22bf0 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  h integer.** key
22c00 73 29 2e 20 20 49 66 20 72 65 67 69 73 74 65 72  s).  If register
22c10 20 50 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   P3 does not con
22c20 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  tain an integer 
22c30 6f 72 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f  or if P1 does no
22c40 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72  t.** contain a r
22c50 65 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64  ecord with rowid
22c60 20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d   P3 then jump im
22c70 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
22c80 20 20 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20    .** Or, if P2 
22c90 69 73 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53  is 0, raise an S
22ca0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
22cb0 72 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20  ror. If P1 does 
22cc0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63  contain.** a rec
22cd0 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50  ord with rowid P
22ce0 33 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65  3 then .** leave
22cf0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
22d00 74 69 6e 67 20 61 74 20 74 68 61 74 20 72 65 63  ting at that rec
22d10 6f 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72  ord and fall thr
22d20 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
22d30 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  .** instruction.
22d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f  .**.** The OP_No
22d50 74 45 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70  tExists opcode p
22d60 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65  erforms the same
22d70 20 6f 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20   operation, but 
22d80 77 69 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74  with OP_NotExist
22d90 73 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69  s.** the P3 regi
22da0 73 74 65 72 20 6d 75 73 74 20 62 65 20 67 75 61  ster must be gua
22db0 72 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61  ranteed to conta
22dc0 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  in an integer va
22dd0 6c 75 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a  lue.  With this.
22de0 2a 2a 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73  ** opcode, regis
22df0 74 65 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74  ter P3 might not
22e00 20 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65   contain an inte
22e10 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ger..**.** The O
22e20 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64  P_NotFound opcod
22e30 65 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73  e performs the s
22e40 61 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ame operation on
22e50 20 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a   index btrees.**
22e60 20 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79   (with arbitrary
22e70 20 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79   multi-value key
22e80 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f  s)..**.** This o
22e90 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65  pcode leaves the
22ea0 20 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61   cursor in a sta
22eb0 74 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e  te where it cann
22ec0 6f 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a  ot be advanced.*
22ed0 2a 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  * in either dire
22ee0 63 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ction.  In other
22ef0 20 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74   words, the Next
22f00 20 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65   and Prev opcode
22f10 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
22f20 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  rk following thi
22f30 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  s opcode..**.** 
22f40 53 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c  See also: Found,
22f50 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e   NotFound, NoCon
22f60 66 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64  flict, SeekRowid
22f70 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e  .*/./* Opcode: N
22f80 6f 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50  otExists P1 P2 P
22f90 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
22fa0 73 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a  s: intkey=r[P3].
22fb0 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20  **.** P1 is the 
22fc0 69 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f  index of a curso
22fd0 72 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c  r open on an SQL
22fe0 20 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69   table btree (wi
22ff0 74 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65  th integer.** ke
23000 79 73 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69  ys).  P3 is an i
23010 6e 74 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49  nteger rowid.  I
23020 66 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f  f P1 does not co
23030 6e 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77  ntain a record w
23040 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20  ith.** rowid P3 
23050 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69  then jump immedi
23060 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72  ately to P2.  Or
23070 2c 20 69 66 20 50 32 20 69 73 20 30 2c 20 72 61  , if P2 is 0, ra
23080 69 73 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ise an.** SQLITE
23090 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
230a0 49 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61  If P1 does conta
230b0 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68  in a record with
230c0 20 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a   rowid P3 then .
230d0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75 72  ** leave the cur
230e0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  sor pointing at 
230f0 74 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20  that record and 
23100 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20  fall through to 
23110 74 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74  the next.** inst
23120 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
23130 68 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20  he OP_SeekRowid 
23140 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
23150 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
23160 6f 6e 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f  on but also allo
23170 77 73 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67  ws the.** P3 reg
23180 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
23190 20 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76   a non-integer v
231a0 61 6c 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63  alue, in which c
231b0 61 73 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a  ase the jump is.
231c0 2a 2a 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e  ** always taken.
231d0 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65    This opcode re
231e0 71 75 69 72 65 73 20 74 68 61 74 20 50 33 20 61  quires that P3 a
231f0 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e  lways contain an
23200 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
23210 54 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20  The OP_NotFound 
23220 6f 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20  opcode performs 
23230 74 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69  the same operati
23240 6f 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65  on on index btre
23250 65 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69  es.** (with arbi
23260 74 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75  trary multi-valu
23270 65 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  e keys)..**.** T
23280 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
23290 73 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20  s the cursor in 
232a0 61 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74  a state where it
232b0 20 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e   cannot be advan
232c0 63 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72  ced.** in either
232d0 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20   direction.  In 
232e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
232f0 20 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f   Next and Prev o
23300 70 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  pcodes will.** n
23310 6f 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e  ot work followin
23320 67 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a  g this opcode..*
23330 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
23340 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20  ound, NotFound, 
23350 4e 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b  NoConflict, Seek
23360 52 6f 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50  Rowid.*/.case OP
23370 5f 53 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20  _SeekRowid: {   
23380 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e       /* jump, in
23390 33 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  3 */.  VdbeCurso
233a0 72 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f  r *pC;.  BtCurso
233b0 72 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20  r *pCrsr;.  int 
233c0 72 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b  res;.  u64 iKey;
233d0 0a 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  ..  pIn3 = &aMem
233e0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28  [pOp->p3];.  if(
233f0 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
23400 4d 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20  MEM_Int)==0 ){. 
23410 20 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79     applyAffinity
23420 28 70 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46  (pIn3, SQLITE_AF
23430 46 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64  F_NUMERIC, encod
23440 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ing);.    if( (p
23450 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
23460 5f 49 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20  _Int)==0 ) goto 
23470 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a  jump_to_p2;.  }.
23480 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
23490 68 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69  h into OP_NotExi
234a0 73 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e  sts */.case OP_N
234b0 6f 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20  otExists:       
234c0 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20     /* jump, in3 
234d0 2a 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65  */.  pIn3 = &aMe
234e0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73  m[pOp->p3];.  as
234f0 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67  sert( pIn3->flag
23500 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20  s & MEM_Int );. 
23510 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
23520 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
23530 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
23540 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
23550 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
23560 20 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66   pC!=0 );.#ifdef
23570 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
23580 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a  pC->seekOp = 0;.
23590 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
235a0 20 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a   pC->isTable );.
235b0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
235c0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
235d0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72  BTREE );.  pCrsr
235e0 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
235f0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72  r;.  assert( pCr
23600 73 72 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d  sr!=0 );.  res =
23610 20 30 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e   0;.  iKey = pIn
23620 33 2d 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73  3->u.i;.  rc = s
23630 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
23640 6f 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c  oUnpacked(pCrsr,
23650 20 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65   0, iKey, 0, &re
23660 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  s);.  assert( rc
23670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
23680 65 73 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d  es==0 );.  pC->m
23690 6f 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b  ovetoTarget = iK
236a0 65 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20  ey;  /* Used by 
236b0 4f 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70  OP_Delete */.  p
236c0 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  C->nullRow = 0;.
236d0 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75    pC->cacheStatu
236e0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
236f0 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d  .  pC->deferredM
23700 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62  oveto = 0;.  Vdb
23710 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
23720 21 3d 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65  !=0,2);.  pC->se
23730 65 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a  ekResult = res;.
23740 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a    if( res!=0 ){.
23750 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
23760 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
23770 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20   if( pOp->p2==0 
23780 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
23790 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
237a0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
237b0 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
237c0 5f 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _p2;.    }.  }. 
237d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
237e0 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
237f0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  r;.  break;.}../
23800 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e  * Opcode: Sequen
23810 63 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  ce P1 P2 * * *.*
23820 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
23830 5d 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72  ]=cursor[P1].ctr
23840 2b 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  ++.**.** Find th
23850 65 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  e next available
23860 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
23870 20 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a   for cursor P1..
23880 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71  ** Write the seq
23890 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74  uence number int
238a0 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
238b0 2a 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e  * The sequence n
238c0 75 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72  umber on the cur
238d0 73 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  sor is increment
238e0 65 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a  ed after this.**
238f0 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a   instruction.  .
23900 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65  */.case OP_Seque
23910 6e 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20  nce: {          
23920 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73   /* out2 */.  as
23930 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30  sert( pOp->p1>=0
23940 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e   && pOp->p1<p->n
23950 43 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65  Cursor );.  asse
23960 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  rt( p->apCsr[pOp
23970 2d 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73  ->p1]!=0 );.  as
23980 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70  sert( p->apCsr[p
23990 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70  Op->p1]->eCurTyp
239a0 65 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20  e!=CURTYPE_VTAB 
239b0 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
239c0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
239d0 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
239e0 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
239f0 70 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b  p1]->seqCount++;
23a00 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
23a10 20 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69   Opcode: NewRowi
23a20 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a  d P1 P2 P3 * *.*
23a30 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32  * Synopsis: r[P2
23a40 5d 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65  ]=rowid.**.** Ge
23a50 74 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20  t a new integer 
23a60 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61  record number (a
23a70 2e 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73  .k.a "rowid") us
23a80 65 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f  ed as the key to
23a90 20 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65   a table..** The
23aa0 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69   record number i
23ab0 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  s not previously
23ac0 20 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69   used as a key i
23ad0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
23ae0 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72  * table that cur
23af0 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f  sor P1 points to
23b00 2e 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72  .  The new recor
23b10 64 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74  d number is writ
23b20 74 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  ten.** written t
23b30 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a  o register P2..*
23b40 2a 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65  *.** If P3>0 the
23b50 6e 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74  n P3 is a regist
23b60 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
23b70 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42  rame of this VDB
23b80 45 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a  E that holds .**
23b90 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65   the largest pre
23ba0 76 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65  viously generate
23bb0 64 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e  d record number.
23bc0 20 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e   No new record n
23bd0 75 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c  umbers are.** al
23be0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73  lowed to be less
23bf0 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
23c00 2e 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75  . When this valu
23c10 65 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61  e reaches its ma
23c20 78 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51  ximum, .** an SQ
23c30 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20  LITE_FULL error 
23c40 69 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68  is generated. Th
23c50 65 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73  e P3 register is
23c60 20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68   updated with th
23c70 65 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64  e '.** generated
23c80 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
23c90 54 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73  This P3 mechanis
23ca0 6d 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c  m is used to hel
23cb0 70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  p implement the.
23cc0 2a 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  ** AUTOINCREMENT
23cd0 20 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73   feature..*/.cas
23ce0 65 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b  e OP_NewRowid: {
23cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
23d00 74 32 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20  t2 */.  i64 v;  
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d20 2a 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20  * The new rowid 
23d30 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23d40 2a 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  *pC;        /* C
23d50 75 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74  ursor of table t
23d60 6f 20 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f  o get the new ro
23d70 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  wid */.  int res
23d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d90 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20  /* Result of an 
23da0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
23db0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  () */.  int cnt;
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23dd0 2a 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d  * Counter to lim
23de0 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  it the number of
23df0 20 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d   searches */.  M
23e00 65 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20  em *pMem;       
23e10 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23e20 72 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73  r holding larges
23e30 74 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f  t rowid for AUTO
23e40 49 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56  INCREMENT */.  V
23e50 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
23e60 3b 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72  ;     /* Root fr
23e70 61 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a  ame of VDBE */..
23e80 20 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d    v = 0;.  res =
23e90 20 30 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   0;.  pOut = out
23ea0 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
23eb0 4f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Op);.  assert( p
23ec0 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
23ed0 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
23ee0 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
23ef0 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
23f00 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
23f10 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73    assert( pC->is
23f20 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
23f30 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
23f40 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
23f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
23f60 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
23f70 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  .  {.    /* The 
23f80 6e 65 78 74 20 72 6f 77 69 64 20 6f 72 20 72 65  next rowid or re
23f90 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 64 69 66  cord number (dif
23fa0 66 65 72 65 6e 74 20 74 65 72 6d 73 20 66 6f 72  ferent terms for
23fb0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
23fc0 20 74 68 69 6e 67 29 20 69 73 20 6f 62 74 61 69   thing) is obtai
23fd0 6e 65 64 20 69 6e 20 61 20 74 77 6f 2d 73 74 65  ned in a two-ste
23fe0 70 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20  p algorithm..   
23ff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
24000 20 77 65 20 61 74 74 65 6d 70 74 20 74 6f 20 66   we attempt to f
24010 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
24020 65 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 61  existing rowid a
24030 6e 64 20 61 64 64 20 6f 6e 65 0a 20 20 20 20 2a  nd add one.    *
24040 2a 20 74 6f 20 74 68 61 74 2e 20 20 42 75 74 20  * to that.  But 
24050 69 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  if the largest e
24060 78 69 73 74 69 6e 67 20 72 6f 77 69 64 20 69 73  xisting rowid is
24070 20 61 6c 72 65 61 64 79 20 74 68 65 20 6d 61 78   already the max
24080 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 70 6f 73 69  imum.    ** posi
24090 74 69 76 65 20 69 6e 74 65 67 65 72 2c 20 77 65  tive integer, we
240a0 20 68 61 76 65 20 74 6f 20 66 61 6c 6c 20 74 68   have to fall th
240b0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 73 65 63  rough to the sec
240c0 6f 6e 64 0a 20 20 20 20 2a 2a 20 70 72 6f 62 61  ond.    ** proba
240d0 62 69 6c 69 73 74 69 63 20 61 6c 67 6f 72 69 74  bilistic algorit
240e0 68 6d 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  hm.    **.    **
240f0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 6c 67 6f   The second algo
24100 72 69 74 68 6d 20 69 73 20 74 6f 20 73 65 6c 65  rithm is to sele
24110 63 74 20 61 20 72 6f 77 69 64 20 61 74 20 72 61  ct a rowid at ra
24120 6e 64 6f 6d 20 61 6e 64 20 73 65 65 20 69 66 0a  ndom and see if.
24130 20 20 20 20 2a 2a 20 69 74 20 61 6c 72 65 61 64      ** it alread
24140 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  y exists in the 
24150 74 61 62 6c 65 2e 20 20 49 66 20 69 74 20 64 6f  table.  If it do
24160 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 77 65  es not exist, we
24170 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 73 75 63   have.    ** suc
24180 63 65 65 64 65 64 2e 20 20 49 66 20 74 68 65 20  ceeded.  If the 
24190 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 64 6f 65  random rowid doe
241a0 73 20 65 78 69 73 74 2c 20 77 65 20 73 65 6c 65  s exist, we sele
241b0 63 74 20 61 20 6e 65 77 20 6f 6e 65 0a 20 20 20  ct a new one.   
241c0 20 2a 2a 20 61 6e 64 20 74 72 79 20 61 67 61 69   ** and try agai
241d0 6e 2c 20 75 70 20 74 6f 20 31 30 30 20 74 69 6d  n, up to 100 tim
241e0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
241f0 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62  ssert( pC->isTab
24200 6c 65 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  le );..#ifdef SQ
24210 4c 49 54 45 5f 33 32 42 49 54 5f 52 4f 57 49 44  LITE_32BIT_ROWID
24220 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
24230 52 4f 57 49 44 20 30 78 37 66 66 66 66 66 66 66  ROWID 0x7fffffff
24240 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 6f  .#else.    /* So
24250 6d 65 20 63 6f 6d 70 69 6c 65 72 73 20 63 6f 6d  me compilers com
24260 70 6c 61 69 6e 20 61 62 6f 75 74 20 63 6f 6e 73  plain about cons
24270 74 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  tants of the for
24280 6d 20 30 78 37 66 66 66 66 66 66 66 66 66 66 66  m 0x7fffffffffff
24290 66 66 66 66 2e 0a 20 20 20 20 2a 2a 20 4f 74 68  ffff..    ** Oth
242a0 65 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f  ers complain abo
242b0 75 74 20 30 78 37 66 66 66 66 66 66 66 66 66 66  ut 0x7ffffffffff
242c0 66 66 66 66 66 66 4c 4c 2e 20 20 54 68 65 20 66  ffffffLL.  The f
242d0 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 20 73  ollowing macro s
242e0 65 65 6d 73 0a 20 20 20 20 2a 2a 20 74 6f 20 70  eems.    ** to p
242f0 72 6f 76 69 64 65 20 74 68 65 20 63 6f 6e 73 74  rovide the const
24300 61 6e 74 20 77 68 69 6c 65 20 6d 61 6b 69 6e 67  ant while making
24310 20 61 6c 6c 20 63 6f 6d 70 69 6c 65 72 73 20 68   all compilers h
24320 61 70 70 79 2e 0a 20 20 20 20 2a 2f 0a 23 20 20  appy..    */.#  
24330 20 64 65 66 69 6e 65 20 4d 41 58 5f 52 4f 57 49   define MAX_ROWI
24340 44 20 20 28 69 36 34 29 28 20 28 28 28 75 36 34  D  (i64)( (((u64
24350 29 30 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32  )0x7fffffff)<<32
24360 29 20 7c 20 28 75 36 34 29 30 78 66 66 66 66 66  ) | (u64)0xfffff
24370 66 66 66 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20  fff ).#endif..  
24380 20 20 69 66 28 20 21 70 43 2d 3e 75 73 65 52 61    if( !pC->useRa
24390 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20  ndomRowid ){.   
243a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
243b0 74 72 65 65 4c 61 73 74 28 70 43 2d 3e 75 63 2e  treeLast(pC->uc.
243c0 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
243d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
243e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
243f0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
24400 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
24410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
24420 73 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d  s ){.        v =
24430 20 31 3b 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d   1;   /* IMP: R-
24440 36 31 39 31 34 2d 34 38 30 37 34 20 2a 2f 0a 20  61914-48074 */. 
24450 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24460 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
24470 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24480 56 61 6c 69 64 28 70 43 2d 3e 75 63 2e 70 43 75  Valid(pC->uc.pCu
24490 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
244a0 20 76 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   v = sqlite3Btre
244b0 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e  eIntegerKey(pC->
244c0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
244d0 20 20 20 20 20 69 66 28 20 76 3e 3d 4d 41 58 5f       if( v>=MAX_
244e0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20  ROWID ){.       
244f0 20 20 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d     pC->useRandom
24500 52 6f 77 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Rowid = 1;.     
24510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24520 20 20 20 20 76 2b 2b 3b 20 20 20 2f 2a 20 49 4d      v++;   /* IM
24530 50 3a 20 52 2d 32 39 35 33 38 2d 33 34 39 38 37  P: R-29538-34987
24540 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
24550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
24560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24570 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
24580 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 20 29     if( pOp->p3 )
24590 7b 0a 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72  {.      /* Asser
245a0 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20 76  t that P3 is a v
245b0 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  alid memory cell
245c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
245d0 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a  t( pOp->p3>0 );.
245e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 46 72        if( p->pFr
245f0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ame ){.        f
24600 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
24610 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
24620 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
24630 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
24640 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 72 74         /* Assert
24650 20 74 68 61 74 20 50 33 20 69 73 20 61 20 76 61   that P3 is a va
24660 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  lid memory cell.
24670 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
24680 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 70 46 72  rt( pOp->p3<=pFr
24690 61 6d 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 20  ame->nMem );.   
246a0 20 20 20 20 20 70 4d 65 6d 20 3d 20 26 70 46 72       pMem = &pFr
246b0 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70  ame->aMem[pOp->p
246c0 33 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  3];.      }else{
246d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65  .        /* Asse
246e0 72 74 20 74 68 61 74 20 50 33 20 69 73 20 61 20  rt that P3 is a 
246f0 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 63 65 6c  valid memory cel
24700 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
24710 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28  sert( pOp->p3<=(
24720 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
24730 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20  Cursor) );.     
24740 20 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b     pMem = &aMem[
24750 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
24760 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
24770 67 65 28 70 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  ge(p, pMem);.   
24780 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24790 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4d  t( memIsValid(pM
247a0 65 6d 29 20 29 3b 0a 0a 20 20 20 20 20 20 52 45  em) );..      RE
247b0 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70  GISTER_TRACE(pOp
247c0 2d 3e 70 33 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  ->p3, pMem);.   
247d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
247e0 6d 49 6e 74 65 67 65 72 69 66 79 28 70 4d 65 6d  mIntegerify(pMem
247f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24800 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
24810 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b 20 20  MEM_Int)!=0 );  
24820 2f 2a 20 6d 65 6d 28 50 33 29 20 68 6f 6c 64 73  /* mem(P3) holds
24830 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
24840 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 75       if( pMem->u
24850 2e 69 3d 3d 4d 41 58 5f 52 4f 57 49 44 20 7c 7c  .i==MAX_ROWID ||
24860 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d 52 6f   pC->useRandomRo
24870 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  wid ){.        r
24880 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
24890 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 37 38     /* IMP: R-178
248a0 31 37 2d 30 30 36 33 30 20 2a 2f 0a 20 20 20 20  17-00630 */.    
248b0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
248c0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
248d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 76     }.      if( v
248e0 3c 70 4d 65 6d 2d 3e 75 2e 69 2b 31 20 29 7b 0a  <pMem->u.i+1 ){.
248f0 20 20 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d          v = pMem
24900 2d 3e 75 2e 69 20 2b 20 31 3b 0a 20 20 20 20 20  ->u.i + 1;.     
24910 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75   }.      pMem->u
24920 2e 69 20 3d 20 76 3b 0a 20 20 20 20 7d 0a 23 65  .i = v;.    }.#e
24930 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 43 2d  ndif.    if( pC-
24940 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
24950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 4d 50 4c  ){.      /* IMPL
24960 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
24970 2d 30 37 36 37 37 2d 34 31 38 38 31 20 49 66 20  -07677-41881 If 
24980 74 68 65 20 6c 61 72 67 65 73 74 20 52 4f 57 49  the largest ROWI
24990 44 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  D is equal to th
249a0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65  e.      ** large
249b0 73 74 20 70 6f 73 73 69 62 6c 65 20 69 6e 74 65  st possible inte
249c0 67 65 72 20 28 39 32 32 33 33 37 32 30 33 36 38  ger (92233720368
249d0 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20 74  54775807) then t
249e0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
249f0 20 20 2a 2a 20 65 6e 67 69 6e 65 20 73 74 61 72    ** engine star
24a00 74 73 20 70 69 63 6b 69 6e 67 20 70 6f 73 69 74  ts picking posit
24a10 69 76 65 20 63 61 6e 64 69 64 61 74 65 20 52 4f  ive candidate RO
24a20 57 49 44 73 20 61 74 20 72 61 6e 64 6f 6d 20 75  WIDs at random u
24a30 6e 74 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ntil.      ** it
24a40 20 66 69 6e 64 73 20 6f 6e 65 20 74 68 61 74 20   finds one that 
24a50 69 73 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  is not previousl
24a60 79 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 20  y used. */.     
24a70 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
24a80 3d 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 63 61  ==0 );  /* We ca
24a90 6e 6e 6f 74 20 62 65 20 69 6e 20 72 61 6e 64 6f  nnot be in rando
24aa0 6d 20 72 6f 77 69 64 20 6d 6f 64 65 20 69 66 20  m rowid mode if 
24ab0 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 2a 2a 20 61 6e 20 41 55 54 4f 49       ** an AUTOI
24ae0 4e 43 52 45 4d 45 4e 54 20 74 61 62 6c 65 2e 20  NCREMENT table. 
24af0 2a 2f 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 30  */.      cnt = 0
24b00 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
24b10 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
24b20 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 76 29  omness(sizeof(v)
24b30 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 76  , &v);.        v
24b40 20 26 3d 20 28 4d 41 58 5f 52 4f 57 49 44 3e 3e   &= (MAX_ROWID>>
24b50 31 29 3b 20 76 2b 2b 3b 20 20 2f 2a 20 45 6e 73  1); v++;  /* Ens
24b60 75 72 65 20 74 68 61 74 20 76 20 69 73 20 67 72  ure that v is gr
24b70 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 20  eater than zero 
24b80 2a 2f 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  */.      }while(
24b90 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
24ba0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
24bb0 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  ked(pC->uc.pCurs
24bc0 6f 72 2c 20 30 2c 20 28 75 36 34 29 76 2c 0a 20  or, 0, (u64)v,. 
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c00 30 2c 20 26 72 65 73 29 29 3d 3d 53 51 4c 49 54  0, &res))==SQLIT
24c10 45 5f 4f 4b 29 0a 20 20 20 20 20 20 20 20 20 20  E_OK).          
24c20 20 20 26 26 20 28 72 65 73 3d 3d 30 29 0a 20 20    && (res==0).  
24c30 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b            && (++
24c40 63 6e 74 3c 31 30 30 29 29 3b 0a 20 20 20 20 20  cnt<100));.     
24c50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
24c60 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
24c70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  r;.      if( res
24c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
24c90 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
24ca0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 32     /* IMP: R-382
24cb0 31 39 2d 35 33 30 30 32 20 2a 2f 0a 20 20 20 20  19-53002 */.    
24cc0 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
24cd0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
24ce0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24cf0 74 28 20 76 3e 30 20 29 3b 20 20 2f 2a 20 45 56  t( v>0 );  /* EV
24d00 3a 20 52 2d 34 30 38 31 32 2d 30 33 35 37 30 20  : R-40812-03570 
24d10 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d  */.    }.    pC-
24d20 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
24d30 3d 20 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63  = 0;.    pC->cac
24d40 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
24d50 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 70 4f  _STALE;.  }.  pO
24d60 75 74 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20 62  ut->u.i = v;.  b
24d70 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
24d80 64 65 3a 20 49 6e 73 65 72 74 20 50 31 20 50 32  de: Insert P1 P2
24d90 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
24da0 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d 72 5b  opsis: intkey=r[
24db0 50 33 5d 20 64 61 74 61 3d 72 5b 50 32 5d 0a 2a  P3] data=r[P2].*
24dc0 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
24dd0 74 72 79 20 69 6e 74 6f 20 74 68 65 20 74 61 62  try into the tab
24de0 6c 65 20 6f 66 20 63 75 72 73 6f 72 20 50 31 2e  le of cursor P1.
24df0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
24e00 0a 2a 2a 20 63 72 65 61 74 65 64 20 69 66 20 69  .** created if i
24e10 74 20 64 6f 65 73 6e 27 74 20 61 6c 72 65 61 64  t doesn't alread
24e20 79 20 65 78 69 73 74 20 6f 72 20 74 68 65 20 64  y exist or the d
24e30 61 74 61 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ata for an exist
24e40 69 6e 67 0a 2a 2a 20 65 6e 74 72 79 20 69 73 20  ing.** entry is 
24e50 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 54 68  overwritten.  Th
24e60 65 20 64 61 74 61 20 69 73 20 74 68 65 20 76 61  e data is the va
24e70 6c 75 65 20 4d 45 4d 5f 42 6c 6f 62 20 73 74 6f  lue MEM_Blob sto
24e80 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 0a  red in register.
24e90 2a 2a 20 6e 75 6d 62 65 72 20 50 32 2e 20 54 68  ** number P2. Th
24ea0 65 20 6b 65 79 20 69 73 20 73 74 6f 72 65 64 20  e key is stored 
24eb0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 20  in register P3. 
24ec0 54 68 65 20 6b 65 79 20 6d 75 73 74 0a 2a 2a 20  The key must.** 
24ed0 62 65 20 61 20 4d 45 4d 5f 49 6e 74 2e 0a 2a 2a  be a MEM_Int..**
24ee0 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41  .** If the OPFLA
24ef0 47 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 6f  G_NCHANGE flag o
24f00 66 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65  f P5 is set, the
24f10 6e 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67 65  n the row change
24f20 20 63 6f 75 6e 74 20 69 73 0a 2a 2a 20 69 6e 63   count is.** inc
24f30 72 65 6d 65 6e 74 65 64 20 28 6f 74 68 65 72 77  remented (otherw
24f40 69 73 65 20 6e 6f 74 29 2e 20 20 49 66 20 74 68  ise not).  If th
24f50 65 20 4f 50 46 4c 41 47 5f 4c 41 53 54 52 4f 57  e OPFLAG_LASTROW
24f60 49 44 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  ID flag of P5 is
24f70 20 73 65 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 6f   set,.** then ro
24f80 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 66 6f  wid is stored fo
24f90 72 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 74  r subsequent ret
24fa0 75 72 6e 20 62 79 20 74 68 65 0a 2a 2a 20 73 71  urn by the.** sq
24fb0 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
24fc0 74 5f 72 6f 77 69 64 28 29 20 66 75 6e 63 74 69  t_rowid() functi
24fd0 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 20 69 74  on (otherwise it
24fe0 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 29 2e   is unmodified).
24ff0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
25000 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
25010 4c 54 20 66 6c 61 67 20 6f 66 20 50 35 20 69 73  LT flag of P5 is
25020 20 73 65 74 2c 20 74 68 65 20 69 6d 70 6c 65 6d   set, the implem
25030 65 6e 74 61 74 69 6f 6e 20 6d 69 67 68 74 0a 2a  entation might.*
25040 2a 20 72 75 6e 20 66 61 73 74 65 72 20 62 79 20  * run faster by 
25050 61 76 6f 69 64 69 6e 67 20 61 6e 20 75 6e 6e 65  avoiding an unne
25060 63 65 73 73 61 72 79 20 73 65 65 6b 20 6f 6e 20  cessary seek on 
25070 63 75 72 73 6f 72 20 50 31 2e 20 20 48 6f 77 65  cursor P1.  Howe
25080 76 65 72 2c 0a 2a 2a 20 74 68 65 20 4f 50 46 4c  ver,.** the OPFL
25090 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
250a0 20 66 6c 61 67 20 6d 75 73 74 20 6f 6e 6c 79 20   flag must only 
250b0 62 65 20 73 65 74 20 69 66 20 74 68 65 72 65 20  be set if there 
250c0 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 70 72 69  have been no pri
250d0 6f 72 0a 2a 2a 20 73 65 65 6b 73 20 6f 6e 20 74  or.** seeks on t
250e0 68 65 20 63 75 72 73 6f 72 20 6f 72 20 69 66 20  he cursor or if 
250f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
25100 73 65 65 6b 20 75 73 65 64 20 61 20 6b 65 79 20  seek used a key 
25110 65 71 75 61 6c 20 74 6f 20 50 33 2e 0a 2a 2a 0a  equal to P3..**.
25120 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
25130 5f 49 53 55 50 44 41 54 45 20 66 6c 61 67 20 69  _ISUPDATE flag i
25140 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
25150 20 6f 70 63 6f 64 65 20 69 73 20 70 61 72 74 20   opcode is part 
25160 6f 66 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  of an.** UPDATE 
25170 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 74 68 65  operation.  Othe
25180 72 77 69 73 65 20 28 69 66 20 74 68 65 20 66 6c  rwise (if the fl
25190 61 67 20 69 73 20 63 6c 65 61 72 29 20 74 68 65  ag is clear) the
251a0 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 0a 2a 2a  n this opcode.**
251b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49   is part of an I
251c0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 2e  NSERT operation.
251d0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
251e0 20 69 73 20 6f 6e 6c 79 20 69 6d 70 6f 72 74 61   is only importa
251f0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 75 70 64  nt to.** the upd
25200 61 74 65 20 68 6f 6f 6b 2e 0a 2a 2a 0a 2a 2a 20  ate hook..**.** 
25210 50 61 72 61 6d 65 74 65 72 20 50 34 20 6d 61 79  Parameter P4 may
25220 20 70 6f 69 6e 74 20 74 6f 20 61 20 54 61 62 6c   point to a Tabl
25230 65 20 73 74 72 75 63 74 75 72 65 2c 20 6f 72 20  e structure, or 
25240 6d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 49 66 20  may be NULL. If 
25250 69 74 20 69 73 20 0a 2a 2a 20 6e 6f 74 20 4e 55  it is .** not NU
25260 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 75 70 64  LL, then the upd
25270 61 74 65 2d 68 6f 6f 6b 20 28 73 71 6c 69 74 65  ate-hook (sqlite
25280 33 2e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  3.xUpdateCallbac
25290 6b 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 0a 2a  k) is invoked .*
252a0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 73 75  * following a su
252b0 63 63 65 73 73 66 75 6c 20 69 6e 73 65 72 74 2e  ccessful insert.
252c0 0a 2a 2a 0a 2a 2a 20 28 57 41 52 4e 49 4e 47 2f  .**.** (WARNING/
252d0 54 4f 44 4f 3a 20 49 66 20 50 31 20 69 73 20 61  TODO: If P1 is a
252e0 20 70 73 65 75 64 6f 2d 63 75 72 73 6f 72 20 61   pseudo-cursor a
252f0 6e 64 20 50 32 20 69 73 20 64 79 6e 61 6d 69 63  nd P2 is dynamic
25300 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
25310 64 2c 20 74 68 65 6e 20 6f 77 6e 65 72 73 68 69  d, then ownershi
25320 70 20 6f 66 20 50 32 20 69 73 20 74 72 61 6e 73  p of P2 is trans
25330 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 70 73  ferred to the ps
25340 65 75 64 6f 2d 63 75 72 73 6f 72 0a 2a 2a 20 61  eudo-cursor.** a
25350 6e 64 20 72 65 67 69 73 74 65 72 20 50 32 20 62  nd register P2 b
25360 65 63 6f 6d 65 73 20 65 70 68 65 6d 65 72 61 6c  ecomes ephemeral
25370 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25380 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
25390 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 72 65 67  .** value of reg
253a0 69 73 74 65 72 20 50 32 20 77 69 6c 6c 20 74 68  ister P2 will th
253b0 65 6e 20 63 68 61 6e 67 65 2e 20 20 4d 61 6b 65  en change.  Make
253c0 20 73 75 72 65 20 74 68 69 73 20 64 6f 65 73 20   sure this does 
253d0 6e 6f 74 0a 2a 2a 20 63 61 75 73 65 20 61 6e 79  not.** cause any
253e0 20 70 72 6f 62 6c 65 6d 73 2e 29 0a 2a 2a 0a 2a   problems.).**.*
253f0 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69  * This instructi
25400 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  on only works on
25410 20 74 61 62 6c 65 73 2e 20 20 54 68 65 20 65 71   tables.  The eq
25420 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63  uivalent instruc
25430 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 69 6e 64 69  tion.** for indi
25440 63 65 73 20 69 73 20 4f 50 5f 49 64 78 49 6e 73  ces is OP_IdxIns
25450 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64  ert..*/./* Opcod
25460 65 3a 20 49 6e 73 65 72 74 49 6e 74 20 50 31 20  e: InsertInt P1 
25470 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
25480 79 6e 6f 70 73 69 73 3a 20 69 6e 74 6b 65 79 3d  ynopsis: intkey=
25490 50 33 20 64 61 74 61 3d 72 5b 50 32 5d 0a 2a 2a  P3 data=r[P2].**
254a0 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 65  .** This works e
254b0 78 61 63 74 6c 79 20 6c 69 6b 65 20 4f 50 5f 49  xactly like OP_I
254c0 6e 73 65 72 74 20 65 78 63 65 70 74 20 74 68 61  nsert except tha
254d0 74 20 74 68 65 20 6b 65 79 20 69 73 20 74 68 65  t the key is the
254e0 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75  .** integer valu
254f0 65 20 50 33 2c 20 6e 6f 74 20 74 68 65 20 76 61  e P3, not the va
25500 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
25510 65 72 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  er stored in reg
25520 69 73 74 65 72 20 50 33 2e 0a 2a 2f 0a 63 61 73  ister P3..*/.cas
25530 65 20 4f 50 5f 49 6e 73 65 72 74 3a 20 0a 63 61  e OP_Insert: .ca
25540 73 65 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 3a  se OP_InsertInt:
25550 20 7b 0a 20 20 4d 65 6d 20 2a 70 44 61 74 61 3b   {.  Mem *pData;
25560 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65         /* MEM ce
25570 6c 6c 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  ll holding data 
25580 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 74  for the record t
25590 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f  o be inserted */
255a0 0a 20 20 4d 65 6d 20 2a 70 4b 65 79 3b 20 20 20  .  Mem *pKey;   
255b0 20 20 20 20 20 2f 2a 20 4d 45 4d 20 63 65 6c 6c       /* MEM cell
255c0 20 68 6f 6c 64 69 6e 67 20 6b 65 79 20 20 66 6f   holding key  fo
255d0 72 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  r the record */.
255e0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
255f0 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f  ;   /* Cursor to
25600 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 63   table into whic
25610 68 20 69 6e 73 65 72 74 20 69 73 20 77 72 69 74  h insert is writ
25620 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  ten */.  int see
25630 6b 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 52 65  kResult;   /* Re
25640 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 73 65  sult of prior se
25650 65 6b 20 6f 72 20 30 20 69 66 20 6e 6f 20 55 53  ek or 0 if no US
25660 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
25670 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
25680 20 2a 7a 44 62 3b 20 20 2f 2a 20 64 61 74 61 62   *zDb;  /* datab
25690 61 73 65 20 6e 61 6d 65 20 2d 20 75 73 65 64 20  ase name - used 
256a0 62 79 20 74 68 65 20 75 70 64 61 74 65 20 68 6f  by the update ho
256b0 6f 6b 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ok */.  Table *p
256c0 54 61 62 3b 20 20 20 20 20 20 2f 2a 20 54 61 62  Tab;      /* Tab
256d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 2d 20 75  le structure - u
256e0 73 65 64 20 62 79 20 75 70 64 61 74 65 20 61 6e  sed by update an
256f0 64 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  d pre-update hoo
25700 6b 73 20 2a 2f 0a 20 20 42 74 72 65 65 50 61 79  ks */.  BtreePay
25710 6c 6f 61 64 20 78 3b 20 20 20 2f 2a 20 50 61 79  load x;   /* Pay
25720 6c 6f 61 64 20 74 6f 20 62 65 20 69 6e 73 65 72  load to be inser
25730 74 65 64 20 2a 2f 0a 0a 20 20 70 44 61 74 61 20  ted */..  pData 
25740 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
25750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
25760 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1>=0 && pOp->p
25770 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a  1<p->nCursor );.
25780 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
25790 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a 20  alid(pData) );. 
257a0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
257b0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
257c0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
257d0 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
257e0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
257f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
25800 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
25810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
25820 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
25830 49 53 4e 4f 4f 50 29 20 7c 7c 20 70 43 2d 3e 69  ISNOOP) || pC->i
25840 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
25850 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
25860 3d 50 34 5f 54 41 42 4c 45 20 7c 7c 20 70 4f 70  =P4_TABLE || pOp
25870 2d 3e 70 34 74 79 70 65 3e 3d 50 34 5f 53 54 41  ->p4type>=P4_STA
25880 54 49 43 20 29 3b 0a 20 20 52 45 47 49 53 54 45  TIC );.  REGISTE
25890 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c  R_TRACE(pOp->p2,
258a0 20 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74   pData);.  sqlit
258b0 65 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43  e3VdbeIncrWriteC
258c0 6f 75 6e 74 65 72 28 70 2c 20 70 43 29 3b 0a 0a  ounter(p, pC);..
258d0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
258e0 65 3d 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a  e==OP_Insert ){.
258f0 20 20 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d      pKey = &aMem
25900 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61  [pOp->p3];.    a
25910 73 73 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61  ssert( pKey->fla
25920 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a  gs & MEM_Int );.
25930 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
25940 73 56 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a  sValid(pKey) );.
25950 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
25960 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79  CE(pOp->p3, pKey
25970 29 3b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20  );.    x.nKey = 
25980 70 4b 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c  pKey->u.i;.  }el
25990 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
259a0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
259b0 49 6e 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20  InsertInt );.   
259c0 20 78 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d 3e 70   x.nKey = pOp->p
259d0 33 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f  3;.  }..  if( pO
259e0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41  p->p4type==P4_TA
259f0 42 4c 45 20 26 26 20 48 41 53 5f 55 50 44 41 54  BLE && HAS_UPDAT
25a00 45 5f 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20  E_HOOK(db) ){.  
25a10 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69 44    assert( pC->iD
25a20 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7a 44 62 20  b>=0 );.    zDb 
25a30 3d 20 64 62 2d 3e 61 44 62 5b 70 43 2d 3e 69 44  = db->aDb[pC->iD
25a40 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
25a50 20 70 54 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e   pTab = pOp->p4.
25a60 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
25a70 28 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  ( (pOp->p5 & OPF
25a80 4c 41 47 5f 49 53 4e 4f 4f 50 29 20 7c 7c 20 48  LAG_ISNOOP) || H
25a90 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 3b  asRowid(pTab) );
25aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
25ab0 61 62 20 3d 20 30 3b 0a 20 20 20 20 7a 44 62 20  ab = 0;.    zDb 
25ac0 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65  = 0;  /* Not nee
25ad0 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20 61 20  ded.  Silence a 
25ae0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
25af0 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64 65 66  . */.  }..#ifdef
25b00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
25b10 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 20 20  REUPDATE_HOOK.  
25b20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  /* Invoke the pr
25b30 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 69  e-update hook, i
25b40 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28 20 70  f any */.  if( p
25b50 54 61 62 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Tab ){.    if( d
25b60 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
25b70 6c 62 61 63 6b 20 26 26 20 21 28 70 4f 70 2d 3e  lback && !(pOp->
25b80 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53 55 50  p5 & OPFLAG_ISUP
25b90 44 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 73  DATE) ){.      s
25ba0 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
25bb0 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c 20 53  ateHook(p, pC, S
25bc0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 7a 44  QLITE_INSERT, zD
25bd0 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65 79 2c  b, pTab, x.nKey,
25be0 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  pOp->p2);.    }.
25bf0 20 20 20 20 69 66 28 20 64 62 2d 3e 78 55 70 64      if( db->xUpd
25c00 61 74 65 43 61 6c 6c 62 61 63 6b 3d 3d 30 20 7c  ateCallback==0 |
25c10 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 3d 3d 30 20  | pTab->aCol==0 
25c20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  ){.      /* Prev
25c30 65 6e 74 20 70 6f 73 74 2d 75 70 64 61 74 65 20  ent post-update 
25c40 68 6f 6f 6b 20 66 72 6f 6d 20 72 75 6e 6e 69 6e  hook from runnin
25c50 67 20 69 6e 20 63 61 73 65 73 20 77 68 65 6e 20  g in cases when 
25c60 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 2a 2f  it should not */
25c70 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
25c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
25c90 20 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41   pOp->p5 & OPFLA
25ca0 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b  G_ISNOOP ) break
25cb0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
25cc0 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25cd0 5f 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43  _NCHANGE ) p->nC
25ce0 68 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70  hange++;.  if( p
25cf0 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
25d00 4c 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e  LASTROWID ) db->
25d10 6c 61 73 74 52 6f 77 69 64 20 3d 20 78 2e 6e 4b  lastRowid = x.nK
25d20 65 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ey;.  assert( pD
25d30 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 28 4d 45  ata->flags & (ME
25d40 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 53 74 72 29 20  M_Blob|MEM_Str) 
25d50 29 3b 0a 20 20 78 2e 70 44 61 74 61 20 3d 20 70  );.  x.pData = p
25d60 44 61 74 61 2d 3e 7a 3b 0a 20 20 78 2e 6e 44 61  Data->z;.  x.nDa
25d70 74 61 20 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20  ta = pData->n;. 
25d80 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28 28   seekResult = ((
25d90 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47  pOp->p5 & OPFLAG
25da0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 20  _USESEEKRESULT) 
25db0 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74  ? pC->seekResult
25dc0 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44 61   : 0);.  if( pDa
25dd0 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ta->flags & MEM_
25de0 5a 65 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e 5a  Zero ){.    x.nZ
25df0 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e 6e  ero = pData->u.n
25e00 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Zero;.  }else{. 
25e10 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b 0a     x.nZero = 0;.
25e20 20 20 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20 30    }.  x.pKey = 0
25e30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
25e40 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d 3e  BtreeInsert(pC->
25e50 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c 0a  uc.pCursor, &x,.
25e60 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26        (pOp->p5 &
25e70 20 28 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 7c   (OPFLAG_APPEND|
25e80 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
25e90 49 4f 4e 29 29 2c 20 73 65 65 6b 52 65 73 75 6c  ION)), seekResul
25ea0 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64 65 66  t.  );.  pC->def
25eb0 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
25ec0 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
25ed0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
25ee0 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
25ef0 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69  he update-hook i
25f00 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
25f10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
25f20 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
25f30 72 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  r;.  if( pTab ){
25f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
25f50 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
25f60 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
25f70 74 28 20 70 54 61 62 2d 3e 61 43 6f 6c 21 3d 30  t( pTab->aCol!=0
25f80 20 29 3b 0a 20 20 20 20 64 62 2d 3e 78 55 70 64   );.    db->xUpd
25f90 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
25fa0 70 55 70 64 61 74 65 41 72 67 2c 0a 20 20 20 20  pUpdateArg,.    
25fb0 20 20 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20         (pOp->p5 
25fc0 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
25fd0 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
25fe0 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
25ff0 52 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  RT,.           z
26000 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Db, pTab->zName,
26010 20 78 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20   x.nKey);.  }.  
26020 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
26030 6f 64 65 3a 20 44 65 6c 65 74 65 20 50 31 20 50  ode: Delete P1 P
26040 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a  2 P3 P4 P5.**.**
26050 20 44 65 6c 65 74 65 20 74 68 65 20 72 65 63 6f   Delete the reco
26060 72 64 20 61 74 20 77 68 69 63 68 20 74 68 65 20  rd at which the 
26070 50 31 20 63 75 72 73 6f 72 20 69 73 20 63 75 72  P1 cursor is cur
26080 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
26090 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f 50  .**.** If the OP
260a0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
260b0 4e 20 62 69 74 20 6f 66 20 74 68 65 20 50 35 20  N bit of the P5 
260c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 65 74  parameter is set
260d0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
260e0 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 6c 65 66  rsor will be lef
260f0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 20 65  t pointing at  e
26100 69 74 68 65 72 20 74 68 65 20 6e 65 78 74 20 6f  ither the next o
26110 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  r the previous.*
26120 2a 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * record in the 
26130 74 61 62 6c 65 2e 20 49 66 20 69 74 20 69 73 20  table. If it is 
26140 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
26150 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
26160 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6e 65  , then.** the ne
26170 78 74 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74  xt Next instruct
26180 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f  ion will be a no
26190 2d 6f 70 2e 20 41 73 20 61 20 72 65 73 75 6c 74  -op. As a result
261a0 2c 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  , in this case.*
261b0 2a 20 69 74 20 69 73 20 6f 6b 20 74 6f 20 64 65  * it is ok to de
261c0 6c 65 74 65 20 61 20 72 65 63 6f 72 64 20 66 72  lete a record fr
261d0 6f 6d 20 77 69 74 68 69 6e 20 61 20 4e 65 78 74  om within a Next
261e0 20 6c 6f 6f 70 2e 20 49 66 20 0a 2a 2a 20 4f 50   loop. If .** OP
261f0 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f  FLAG_SAVEPOSITIO
26200 4e 20 62 69 74 20 6f 66 20 50 35 20 69 73 20 63  N bit of P5 is c
26210 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63  lear, then the c
26220 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 0a 2a 2a  ursor will be.**
26230 20 6c 65 66 74 20 69 6e 20 61 6e 20 75 6e 64 65   left in an unde
26240 66 69 6e 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  fined state..**.
26250 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
26260 5f 41 55 58 44 45 4c 45 54 45 20 62 69 74 20 69  _AUXDELETE bit i
26270 73 20 73 65 74 20 6f 6e 20 50 35 2c 20 74 68 61  s set on P5, tha
26280 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
26290 20 74 68 69 73 0a 2a 2a 20 64 65 6c 65 74 65 20   this.** delete 
262a0 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 61  one of several a
262b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64  ssociated with d
262c0 65 6c 65 74 69 6e 67 20 61 20 74 61 62 6c 65 20  eleting a table 
262d0 72 6f 77 20 61 6e 64 20 61 6c 6c 20 69 74 73 0a  row and all its.
262e0 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ** associated in
262f0 64 65 78 20 65 6e 74 72 69 65 73 2e 20 20 45 78  dex entries.  Ex
26300 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 6f  actly one of tho
26310 73 65 20 64 65 6c 65 74 65 73 20 69 73 20 74 68  se deletes is th
26320 65 20 22 70 72 69 6d 61 72 79 22 0a 2a 2a 20 64  e "primary".** d
26330 65 6c 65 74 65 2e 20 20 54 68 65 20 6f 74 68 65  elete.  The othe
26340 72 73 20 61 72 65 20 61 6c 6c 20 6f 6e 20 4f 50  rs are all on OP
26350 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 63  FLAG_FORDELETE c
26360 75 72 73 6f 72 73 20 6f 72 20 65 6c 73 65 20 61  ursors or else a
26370 72 65 0a 2a 2a 20 6d 61 72 6b 65 64 20 77 69 74  re.** marked wit
26380 68 20 74 68 65 20 41 55 58 44 45 4c 45 54 45 20  h the AUXDELETE 
26390 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  flag..**.** If t
263a0 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47  he OPFLAG_NCHANG
263b0 45 20 66 6c 61 67 20 6f 66 20 50 32 20 28 4e 42  E flag of P2 (NB
263c0 3a 20 50 32 20 6e 6f 74 20 50 35 29 20 69 73 20  : P2 not P5) is 
263d0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  set, then the ro
263e0 77 0a 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e  w.** change coun
263f0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
26400 20 28 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29   (otherwise not)
26410 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 6d 75 73 74 20  ..**.** P1 must 
26420 6e 6f 74 20 62 65 20 70 73 65 75 64 6f 2d 74 61  not be pseudo-ta
26430 62 6c 65 2e 20 20 49 74 20 68 61 73 20 74 6f 20  ble.  It has to 
26440 62 65 20 61 20 72 65 61 6c 20 74 61 62 6c 65 20  be a real table 
26450 77 69 74 68 0a 2a 2a 20 6d 75 6c 74 69 70 6c 65  with.** multiple
26460 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   rows..**.** If 
26470 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  P4 is not NULL t
26480 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hen it points to
26490 20 61 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e   a Table object.
264a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 65 69   In this case ei
264b0 74 68 65 72 20 0a 2a 2a 20 74 68 65 20 75 70 64  ther .** the upd
264c0 61 74 65 20 6f 72 20 70 72 65 2d 75 70 64 61 74  ate or pre-updat
264d0 65 20 68 6f 6f 6b 2c 20 6f 72 20 62 6f 74 68 2c  e hook, or both,
264e0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 2e   may be invoked.
264f0 20 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d   The P1 cursor m
26500 75 73 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ust.** have been
26510 20 70 6f 73 69 74 69 6f 6e 65 64 20 75 73 69 6e   positioned usin
26520 67 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 70 72  g OP_NotFound pr
26530 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
26540 74 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 20 0a  this opcode in .
26550 2a 2a 20 74 68 69 73 20 63 61 73 65 2e 20 53 70  ** this case. Sp
26560 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 66 20 6f  ecifically, if o
26570 6e 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  ne is configured
26580 2c 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  , the pre-update
26590 20 68 6f 6f 6b 20 69 73 20 0a 2a 2a 20 69 6e 76   hook is .** inv
265a0 6f 6b 65 64 20 69 66 20 50 34 20 69 73 20 6e 6f  oked if P4 is no
265b0 74 20 4e 55 4c 4c 2e 20 54 68 65 20 75 70 64 61  t NULL. The upda
265c0 74 65 2d 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te-hook is invok
265d0 65 64 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e  ed if one is con
265e0 66 69 67 75 72 65 64 2c 20 0a 2a 2a 20 50 34 20  figured, .** P4 
265f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
26600 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48 41   the OPFLAG_NCHA
26610 4e 47 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  NGE flag is set 
26620 69 6e 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  in P2..**.** If 
26630 74 68 65 20 4f 50 46 4c 41 47 5f 49 53 55 50 44  the OPFLAG_ISUPD
26640 41 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20  ATE flag is set 
26650 69 6e 20 50 32 2c 20 74 68 65 6e 20 50 33 20 63  in P2, then P3 c
26660 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72  ontains the addr
26670 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 65  ess.** of the me
26680 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 63  mory cell that c
26690 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
266a0 65 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  e that the rowid
266b0 20 6f 66 20 74 68 65 20 72 6f 77 20 77 69 6c 6c   of the row will
266c0 0a 2a 2a 20 62 65 20 73 65 74 20 74 6f 20 62 79  .** be set to by
266d0 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a 2f 0a   the update..*/.
266e0 63 61 73 65 20 4f 50 5f 44 65 6c 65 74 65 3a 20  case OP_Delete: 
266f0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
26700 70 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pC;.  const char
26710 20 2a 7a 44 62 3b 0a 20 20 54 61 62 6c 65 20 2a   *zDb;.  Table *
26720 70 54 61 62 3b 0a 20 20 69 6e 74 20 6f 70 66 6c  pTab;.  int opfl
26730 61 67 73 3b 0a 0a 20 20 6f 70 66 6c 61 67 73 20  ags;..  opflags 
26740 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73  = pOp->p2;.  ass
26750 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
26760 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
26770 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
26780 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
26790 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
267a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
267b0 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
267c0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
267d0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e   assert( pC->uc.
267e0 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
267f0 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
26800 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
26810 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e  .  sqlite3VdbeIn
26820 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70  crWriteCounter(p
26830 2c 20 70 43 29 3b 0a 0a 23 69 66 64 65 66 20 53  , pC);..#ifdef S
26840 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
26850 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
26860 34 5f 54 41 42 4c 45 20 26 26 20 48 61 73 52 6f  4_TABLE && HasRo
26870 77 69 64 28 70 4f 70 2d 3e 70 34 2e 70 54 61 62  wid(pOp->p4.pTab
26880 29 20 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ) && pOp->p5==0 
26890 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 35 20  ){.    /* If p5 
268a0 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 65 65  is zero, the see
268b0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
268c0 20 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20   positioned the 
268d0 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 0a  cursor prior to.
268e0 20 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65      ** OP_Delete
268f0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 73 6f 20   will have also 
26900 73 65 74 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65  set the pC->move
26910 74 6f 54 61 72 67 65 74 20 66 69 65 6c 64 20 74  toTarget field t
26920 6f 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 20  o the rowid of. 
26930 20 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 74 68     ** the row th
26940 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
26950 74 65 64 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  ted */.    i64 i
26960 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
26970 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d  eeIntegerKey(pC-
26980 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
26990 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6d 6f    assert( pC->mo
269a0 76 65 74 6f 54 61 72 67 65 74 3d 3d 69 4b 65 79  vetoTarget==iKey
269b0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
269c0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61    /* If the upda
269d0 74 65 2d 68 6f 6f 6b 20 6f 72 20 70 72 65 2d 75  te-hook or pre-u
269e0 70 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20  pdate-hook will 
269f0 62 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20  be invoked, set 
26a00 7a 44 62 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  zDb to.  ** the 
26a10 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 62 20 74  name of the db t
26a20 6f 20 70 61 73 73 20 61 73 20 74 6f 20 69 74 2e  o pass as to it.
26a30 20 41 6c 73 6f 20 73 65 74 20 6c 6f 63 61 6c 20   Also set local 
26a40 70 54 61 62 20 74 6f 20 61 20 63 6f 70 79 0a 20  pTab to a copy. 
26a50 20 2a 2a 20 6f 66 20 70 34 2e 70 54 61 62 2e 20   ** of p4.pTab. 
26a60 46 69 6e 61 6c 6c 79 2c 20 69 66 20 70 35 20 69  Finally, if p5 i
26a70 73 20 74 72 75 65 2c 20 69 6e 64 69 63 61 74 69  s true, indicati
26a80 6e 67 20 74 68 61 74 20 74 68 69 73 20 63 75 72  ng that this cur
26a90 73 6f 72 20 77 61 73 0a 20 20 2a 2a 20 6c 61 73  sor was.  ** las
26aa0 74 20 6d 6f 76 65 64 20 77 69 74 68 20 4f 50 5f  t moved with OP_
26ab0 4e 65 78 74 20 6f 72 20 4f 50 5f 50 72 65 76 2c  Next or OP_Prev,
26ac0 20 6e 6f 74 20 53 65 65 6b 20 6f 72 20 4e 6f 74   not Seek or Not
26ad0 46 6f 75 6e 64 2c 20 73 65 74 20 0a 20 20 2a 2a  Found, set .  **
26ae0 20 56 64 62 65 43 75 72 73 6f 72 2e 6d 6f 76 65   VdbeCursor.move
26af0 74 6f 54 61 72 67 65 74 20 74 6f 20 74 68 65 20  toTarget to the 
26b00 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 20  current rowid.  
26b10 2a 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  */.  if( pOp->p4
26b20 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26  type==P4_TABLE &
26b30 26 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f  & HAS_UPDATE_HOO
26b40 4b 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73  K(db) ){.    ass
26b50 65 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20  ert( pC->iDb>=0 
26b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26b70 4f 70 2d 3e 70 34 2e 70 54 61 62 21 3d 30 20 29  Op->p4.pTab!=0 )
26b80 3b 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e  ;.    zDb = db->
26b90 61 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62  aDb[pC->iDb].zDb
26ba0 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20  SName;.    pTab 
26bb0 3d 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a  = pOp->p4.pTab;.
26bc0 20 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35      if( (pOp->p5
26bd0 20 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   & OPFLAG_SAVEPO
26be0 53 49 54 49 4f 4e 29 21 3d 30 20 26 26 20 70 43  SITION)!=0 && pC
26bf0 2d 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20  ->isTable ){.   
26c00 20 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72     pC->movetoTar
26c10 67 65 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72  get = sqlite3Btr
26c20 65 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d  eeIntegerKey(pC-
26c30 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
26c40 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26c50 20 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 4e   zDb = 0;   /* N
26c60 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65  ot needed.  Sile
26c70 6e 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77  nce a compiler w
26c80 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70  arning. */.    p
26c90 54 61 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  Tab = 0;  /* Not
26ca0 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63   needed.  Silenc
26cb0 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  e a compiler war
26cc0 6e 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69  ning. */.  }..#i
26cd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26ce0 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
26cf0 4b 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  K.  /* Invoke th
26d00 65 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f  e pre-update-hoo
26d10 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  k if required. *
26d20 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65  /.  if( db->xPre
26d30 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
26d40 26 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 20 29  & pOp->p4.pTab )
26d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  {.    assert( !(
26d60 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  opflags & OPFLAG
26d70 5f 49 53 55 50 44 41 54 45 29 20 0a 20 20 20 20  _ISUPDATE) .    
26d80 20 20 20 20 20 7c 7c 20 48 61 73 52 6f 77 69 64       || HasRowid
26d90 28 70 54 61 62 29 3d 3d 30 20 0a 20 20 20 20 20  (pTab)==0 .     
26da0 20 20 20 20 7c 7c 20 28 61 4d 65 6d 5b 70 4f 70      || (aMem[pOp
26db0 2d 3e 70 33 5d 2e 66 6c 61 67 73 20 26 20 4d 45  ->p3].flags & ME
26dc0 4d 5f 49 6e 74 29 20 0a 20 20 20 20 29 3b 0a 20  M_Int) .    );. 
26dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
26de0 65 55 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70  eUpdateHook(p, p
26df0 43 2c 0a 20 20 20 20 20 20 20 20 28 6f 70 66 6c  C,.        (opfl
26e00 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 49 53 55  ags & OPFLAG_ISU
26e10 50 44 41 54 45 29 20 3f 20 53 51 4c 49 54 45 5f  PDATE) ? SQLITE_
26e20 55 50 44 41 54 45 20 3a 20 53 51 4c 49 54 45 5f  UPDATE : SQLITE_
26e30 44 45 4c 45 54 45 2c 20 0a 20 20 20 20 20 20 20  DELETE, .       
26e40 20 7a 44 62 2c 20 70 54 61 62 2c 20 70 43 2d 3e   zDb, pTab, pC->
26e50 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 0a 20 20  movetoTarget,.  
26e60 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 0a 20 20        pOp->p3.  
26e70 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f    );.  }.  if( o
26e80 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
26e90 49 53 4e 4f 4f 50 20 29 20 62 72 65 61 6b 3b 0a  ISNOOP ) break;.
26ea0 23 65 6e 64 69 66 0a 20 0a 20 20 2f 2a 20 4f 6e  #endif. .  /* On
26eb0 6c 79 20 66 6c 61 67 73 20 74 68 61 74 20 63 61  ly flags that ca
26ec0 6e 20 62 65 20 73 65 74 20 61 72 65 20 53 41 56  n be set are SAV
26ed0 45 50 4f 49 53 54 49 4f 4e 20 61 6e 64 20 41 55  EPOISTION and AU
26ee0 58 44 45 4c 45 54 45 20 2a 2f 20 0a 20 20 61 73  XDELETE */ .  as
26ef0 73 65 72 74 28 20 28 70 4f 70 2d 3e 70 35 20 26  sert( (pOp->p5 &
26f00 20 7e 28 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f   ~(OPFLAG_SAVEPO
26f10 53 49 54 49 4f 4e 7c 4f 50 46 4c 41 47 5f 41 55  SITION|OPFLAG_AU
26f20 58 44 45 4c 45 54 45 29 29 3d 3d 30 20 29 3b 0a  XDELETE))==0 );.
26f30 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c 41 47    assert( OPFLAG
26f40 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 3d 3d 42  _SAVEPOSITION==B
26f50 54 52 45 45 5f 53 41 56 45 50 4f 53 49 54 49 4f  TREE_SAVEPOSITIO
26f60 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f  N );.  assert( O
26f70 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 3d  PFLAG_AUXDELETE=
26f80 3d 42 54 52 45 45 5f 41 55 58 44 45 4c 45 54 45  =BTREE_AUXDELETE
26f90 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
26fa0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
26fb0 2d 3e 70 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  ->pFrame==0 ){. 
26fc0 20 20 20 69 66 28 20 70 43 2d 3e 69 73 45 70 68     if( pC->isEph
26fd0 65 6d 65 72 61 6c 3d 3d 30 0a 20 20 20 20 20 20  emeral==0.      
26fe0 20 20 26 26 20 28 70 4f 70 2d 3e 70 35 20 26 20    && (pOp->p5 & 
26ff0 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45  OPFLAG_AUXDELETE
27000 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
27010 28 70 43 2d 3e 77 72 46 6c 61 67 20 26 20 4f 50  (pC->wrFlag & OP
27020 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 29 3d  FLAG_FORDELETE)=
27030 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
27040 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2b 2b    nExtraDelete++
27050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27060 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46 4c 41 47  pOp->p2 & OPFLAG
27070 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20 20 20 20  _NCHANGE ){.    
27080 20 20 6e 45 78 74 72 61 44 65 6c 65 74 65 2d 2d    nExtraDelete--
27090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
270a0 69 66 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  if..  rc = sqlit
270b0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 70 43  e3BtreeDelete(pC
270c0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 70 4f  ->uc.pCursor, pO
270d0 70 2d 3e 70 35 29 3b 0a 20 20 70 43 2d 3e 63 61  p->p5);.  pC->ca
270e0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
270f0 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73  E_STALE;.  pC->s
27100 65 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20  eekResult = 0;. 
27110 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
27120 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
27130 72 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  r;..  /* Invoke 
27140 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20  the update-hook 
27150 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
27160 20 20 69 66 28 20 6f 70 66 6c 61 67 73 20 26 20    if( opflags & 
27170 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29  OPFLAG_NCHANGE )
27180 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65  {.    p->nChange
27190 2b 2b 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ++;.    if( db->
271a0 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
271b0 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
271c0 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 78  ) ){.      db->x
271d0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
271e0 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20 53  b->pUpdateArg, S
271f0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 44  QLITE_DELETE, zD
27200 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  b, pTab->zName,.
27210 20 20 20 20 20 20 20 20 20 20 70 43 2d 3e 6d 6f            pC->mo
27220 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
27230 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69     assert( pC->i
27240 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  Db>=0 );.    }. 
27250 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 2f   }..  break;.}./
27260 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73 65 74 43  * Opcode: ResetC
27270 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20 2a 0a 2a  ount * * * * *.*
27280 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  *.** The value o
27290 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
272a0 6e 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74  nter is copied t
272b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
272c0 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e 67 65 20  andle.** change 
272d0 63 6f 75 6e 74 65 72 20 28 72 65 74 75 72 6e 65  counter (returne
272e0 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
272f0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
27300 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a 2a 2a 20  _changes())..** 
27310 54 68 65 6e 20 74 68 65 20 56 4d 73 20 69 6e 74  Then the VMs int
27320 65 72 6e 61 6c 20 63 68 61 6e 67 65 20 63 6f 75  ernal change cou
27330 6e 74 65 72 20 72 65 73 65 74 73 20 74 6f 20 30  nter resets to 0
27340 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  ..** This is use
27350 64 20 62 79 20 74 72 69 67 67 65 72 20 70 72 6f  d by trigger pro
27360 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  grams..*/.case O
27370 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a 20 7b 0a  P_ResetCount: {.
27380 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
27390 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
273a0 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d 3e 6e 43  Change);.  p->nC
273b0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 62 72 65  hange = 0;.  bre
273c0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
273d0 3a 20 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 20  : SorterCompare 
273e0 50 31 20 50 32 20 50 33 20 50 34 0a 2a 2a 20 53  P1 P2 P3 P4.** S
273f0 79 6e 6f 70 73 69 73 3a 20 69 66 20 6b 65 79 28  ynopsis: if key(
27400 50 31 29 21 3d 74 72 69 6d 28 72 5b 50 33 5d 2c  P1)!=trim(r[P3],
27410 50 34 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  P4) goto P2.**.*
27420 2a 20 50 31 20 69 73 20 61 20 73 6f 72 74 65 72  * P1 is a sorter
27430 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20 69 6e   cursor. This in
27440 73 74 72 75 63 74 69 6f 6e 20 63 6f 6d 70 61 72  struction compar
27450 65 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  es a prefix of t
27460 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 62 6c 6f  he.** record blo
27470 62 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  b in register P3
27480 20 61 67 61 69 6e 73 74 20 61 20 70 72 65 66 69   against a prefi
27490 78 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  x of the entry t
274a0 68 61 74 20 0a 2a 2a 20 74 68 65 20 73 6f 72 74  hat .** the sort
274b0 65 72 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  er cursor curren
274c0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
274d0 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 50  Only the first P
274e0 34 20 66 69 65 6c 64 73 0a 2a 2a 20 6f 66 20 72  4 fields.** of r
274f0 5b 50 33 5d 20 61 6e 64 20 74 68 65 20 73 6f 72  [P3] and the sor
27500 74 65 72 20 72 65 63 6f 72 64 20 61 72 65 20 63  ter record are c
27510 6f 6d 70 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ompared..**.** I
27520 66 20 65 69 74 68 65 72 20 50 33 20 6f 72 20 74  f either P3 or t
27530 68 65 20 73 6f 72 74 65 72 20 63 6f 6e 74 61 69  he sorter contai
27540 6e 73 20 61 20 4e 55 4c 4c 20 69 6e 20 6f 6e 65  ns a NULL in one
27550 20 6f 66 20 74 68 65 69 72 20 73 69 67 6e 69 66   of their signif
27560 69 63 61 6e 74 0a 2a 2a 20 66 69 65 6c 64 73 20  icant.** fields 
27570 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
27580 65 20 50 34 20 66 69 65 6c 64 73 20 61 74 20 74  e P4 fields at t
27590 68 65 20 65 6e 64 20 77 68 69 63 68 20 61 72 65  he end which are
275a0 20 69 67 6e 6f 72 65 64 29 20 74 68 65 6e 0a 2a   ignored) then.*
275b0 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
275c0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
275d0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 46  e equal..**.** F
275e0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 6e  all through to n
275f0 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
27600 69 66 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72  if the two recor
27610 64 73 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  ds compare equal
27620 20 74 6f 0a 2a 2a 20 65 61 63 68 20 6f 74 68 65   to.** each othe
27630 72 2e 20 20 4a 75 6d 70 20 74 6f 20 50 32 20 69  r.  Jump to P2 i
27640 66 20 74 68 65 79 20 61 72 65 20 64 69 66 66 65  f they are diffe
27650 72 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  rent..*/.case OP
27660 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 3a 20  _SorterCompare: 
27670 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
27680 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  pC;.  int res;. 
27690 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 0a 0a 20   int nKeyCol;.. 
276a0 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
276b0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
276c0 74 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 20  t( isSorter(pC) 
276d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
276e0 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
276f0 33 32 20 29 3b 0a 20 20 70 49 6e 33 20 3d 20 26  32 );.  pIn3 = &
27700 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
27710 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 4f 70 2d 3e   nKeyCol = pOp->
27720 70 34 2e 69 3b 0a 20 20 72 65 73 20 3d 20 30 3b  p4.i;.  res = 0;
27730 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
27740 64 62 65 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  dbeSorterCompare
27750 28 70 43 2c 20 70 49 6e 33 2c 20 6e 4b 65 79 43  (pC, pIn3, nKeyC
27760 6f 6c 2c 20 26 72 65 73 29 3b 0a 20 20 56 64 62  ol, &res);.  Vdb
27770 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
27780 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 63  !=0,2);.  if( rc
27790 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
277a0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66  e_to_error;.  if
277b0 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75 6d  ( res ) goto jum
277c0 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b  p_to_p2;.  break
277d0 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ;.};../* Opcode:
277e0 20 53 6f 72 74 65 72 44 61 74 61 20 50 31 20 50   SorterData P1 P
277f0 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
27800 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61  psis: r[P2]=data
27810 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74  .**.** Write int
27820 6f 20 72 65 67 69 73 74 65 72 20 50 32 20 74 68  o register P2 th
27830 65 20 63 75 72 72 65 6e 74 20 73 6f 72 74 65 72  e current sorter
27840 20 64 61 74 61 20 66 6f 72 20 73 6f 72 74 65 72   data for sorter
27850 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a 2a 20 54   cursor P1..** T
27860 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 63 6f  hen clear the co
27870 6c 75 6d 6e 20 68 65 61 64 65 72 20 63 61 63 68  lumn header cach
27880 65 20 6f 6e 20 63 75 72 73 6f 72 20 50 33 2e 0a  e on cursor P3..
27890 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
278a0 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 75 73  e is normally us
278b0 65 20 74 6f 20 6d 6f 76 65 20 61 20 72 65 63 6f  e to move a reco
278c0 72 64 20 6f 75 74 20 6f 66 20 74 68 65 20 73 6f  rd out of the so
278d0 72 74 65 72 20 61 6e 64 20 69 6e 74 6f 0a 2a 2a  rter and into.**
278e0 20 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74   a register that
278f0 20 69 73 20 74 68 65 20 73 6f 75 72 63 65 20 66   is the source f
27900 6f 72 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  or a pseudo-tabl
27910 65 20 63 75 72 73 6f 72 20 63 72 65 61 74 65 64  e cursor created
27920 20 75 73 69 6e 67 0a 2a 2a 20 4f 70 65 6e 50 73   using.** OpenPs
27930 65 75 64 6f 2e 20 20 54 68 61 74 20 70 73 65 75  eudo.  That pseu
27940 64 6f 2d 74 61 62 6c 65 20 63 75 72 73 6f 72 20  do-table cursor 
27950 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  is the one that 
27960 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
27970 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 50 33  .** parameter P3
27980 2e 20 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20  .  Clearing the 
27990 50 33 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  P3 column cache 
279a0 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
279b0 6f 70 63 6f 64 65 20 73 61 76 65 73 0a 2a 2a 20  opcode saves.** 
279c0 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
279d0 6f 20 69 73 73 75 65 20 61 20 73 65 70 61 72 61  o issue a separa
279e0 74 65 20 4e 75 6c 6c 52 6f 77 20 69 6e 73 74 72  te NullRow instr
279f0 75 63 74 69 6f 6e 20 74 6f 20 63 6c 65 61 72 20  uction to clear 
27a00 74 68 61 74 20 63 61 63 68 65 2e 0a 2a 2f 0a 63  that cache..*/.c
27a10 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  ase OP_SorterDat
27a20 61 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  a: {.  VdbeCurso
27a30 72 20 2a 70 43 3b 0a 0a 20 20 70 4f 75 74 20 3d  r *pC;..  pOut =
27a40 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
27a50 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
27a60 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
27a70 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70 43  ert( isSorter(pC
27a80 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
27a90 74 65 33 56 64 62 65 53 6f 72 74 65 72 52 6f 77  te3VdbeSorterRow
27aa0 6b 65 79 28 70 43 2c 20 70 4f 75 74 29 3b 0a 20  key(pC, pOut);. 
27ab0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27ac0 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4f 75 74 2d  ITE_OK || (pOut-
27ad0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
27ae0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
27af0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
27b00 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
27b10 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   );.  if( rc ) g
27b20 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
27b30 5f 65 72 72 6f 72 3b 0a 20 20 70 2d 3e 61 70 43  _error;.  p->apC
27b40 73 72 5b 70 4f 70 2d 3e 70 33 5d 2d 3e 63 61 63  sr[pOp->p3]->cac
27b50 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
27b60 5f 53 54 41 4c 45 3b 0a 20 20 62 72 65 61 6b 3b  _STALE;.  break;
27b70 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
27b80 6f 77 44 61 74 61 20 50 31 20 50 32 20 50 33 20  owData P1 P2 P3 
27b90 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
27ba0 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a 0a 2a   r[P2]=data.**.*
27bb0 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72 65 67  * Write into reg
27bc0 69 73 74 65 72 20 50 32 20 74 68 65 20 63 6f 6d  ister P2 the com
27bd0 70 6c 65 74 65 20 72 6f 77 20 63 6f 6e 74 65 6e  plete row conten
27be0 74 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  t for the row at
27bf0 20 0a 2a 2a 20 77 68 69 63 68 20 63 75 72 73 6f   .** which curso
27c00 72 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  r P1 is currentl
27c10 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 20 54  y pointing..** T
27c20 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74 65 72  here is no inter
27c30 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  pretation of the
27c40 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74 20 69   data.  .** It i
27c50 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20 6f 6e  s just copied on
27c60 74 6f 20 74 68 65 20 50 32 20 72 65 67 69 73 74  to the P2 regist
27c70 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 0a 2a  er exactly as .*
27c80 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20 69 6e  * it is found in
27c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27ca0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72  le..**.** If cur
27cb0 73 6f 72 20 50 31 20 69 73 20 61 6e 20 69 6e 64  sor P1 is an ind
27cc0 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ex, then the con
27cd0 74 65 6e 74 20 69 73 20 74 68 65 20 6b 65 79 20  tent is the key 
27ce0 6f 66 20 74 68 65 20 72 6f 77 2e 0a 2a 2a 20 49  of the row..** I
27cf0 66 20 63 75 72 73 6f 72 20 50 32 20 69 73 20 61  f cursor P2 is a
27d00 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
27d10 20 63 6f 6e 74 65 6e 74 20 65 78 74 72 61 63 74   content extract
27d20 65 64 20 69 73 20 74 68 65 20 64 61 74 61 2e 0a  ed is the data..
27d30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20  **.** If the P1 
27d40 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 20 70  cursor must be p
27d50 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
27d60 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20 4e 55  id row (not a NU
27d70 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20 61 20  LL row).** of a 
27d80 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
27d90 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a  a pseudo-table..
27da0 2a 2a 0a 2a 2a 20 49 66 20 50 33 21 3d 30 20 74  **.** If P3!=0 t
27db0 68 65 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20  hen this opcode 
27dc0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  is allowed to ma
27dd0 6b 65 20 61 6e 20 65 70 68 65 72 6d 65 72 61 6c  ke an ephermeral
27de0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 6e 74 6f   pointer.** into
27df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
27e00 67 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  ge.  That means 
27e10 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
27e20 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 0a 2a   of the output.*
27e30 2a 20 72 65 67 69 73 74 65 72 20 77 69 6c 6c 20  * register will 
27e40 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  be invalidated a
27e50 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 75  s soon as the cu
27e60 72 73 6f 72 20 6d 6f 76 65 73 20 2d 20 69 6e 63  rsor moves - inc
27e70 6c 75 64 69 6e 67 0a 2a 2a 20 6d 6f 76 65 73 20  luding.** moves 
27e80 63 61 75 73 65 64 20 62 79 20 6f 74 68 65 72 20  caused by other 
27e90 63 75 72 73 6f 72 73 20 74 68 61 74 20 22 73 61  cursors that "sa
27ea0 76 65 22 20 74 68 65 20 74 68 65 20 63 75 72 72  ve" the the curr
27eb0 65 6e 74 20 63 75 72 73 6f 72 73 0a 2a 2a 20 70  ent cursors.** p
27ec0 6f 73 69 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72  osition in order
27ed0 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 77   that they can w
27ee0 72 69 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65  rite to the same
27ef0 20 74 61 62 6c 65 2e 20 20 49 66 20 50 33 3d 3d   table.  If P3==
27f00 30 0a 2a 2a 20 74 68 65 6e 20 61 20 63 6f 70 79  0.** then a copy
27f10 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
27f20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
27f30 2e 20 20 50 33 21 3d 30 20 69 73 20 66 61 73 74  .  P3!=0 is fast
27f40 65 72 2c 20 62 75 74 0a 2a 2a 20 50 33 3d 3d 30  er, but.** P3==0
27f50 20 69 73 20 73 61 66 65 72 2e 0a 2a 2a 0a 2a 2a   is safer..**.**
27f60 20 49 66 20 50 33 21 3d 30 20 74 68 65 6e 20 74   If P3!=0 then t
27f70 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
27f80 65 20 50 32 20 72 65 67 69 73 74 65 72 20 69 73  e P2 register is
27f90 20 75 6e 73 75 69 74 61 62 6c 65 20 66 6f 72 20   unsuitable for 
27fa0 75 73 65 0a 2a 2a 20 69 6e 20 4f 50 5f 52 65 73  use.** in OP_Res
27fb0 75 6c 74 20 61 6e 64 20 61 6e 79 20 4f 50 5f 52  ult and any OP_R
27fc0 65 73 75 6c 74 20 77 69 6c 6c 20 69 6e 76 61 6c  esult will inval
27fd0 69 64 61 74 65 20 74 68 65 20 50 32 20 72 65 67  idate the P2 reg
27fe0 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ister content..*
27ff0 2a 20 54 68 65 20 50 32 20 72 65 67 69 73 74 65  * The P2 registe
28000 72 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 76  r content is inv
28010 61 6c 69 64 61 74 65 64 20 62 79 20 6f 70 63 6f  alidated by opco
28020 64 65 73 20 6c 69 6b 65 20 4f 50 5f 46 75 6e 63  des like OP_Func
28030 74 69 6f 6e 20 6f 72 0a 2a 2a 20 62 79 20 61 6e  tion or.** by an
28040 79 20 75 73 65 20 6f 66 20 61 6e 6f 74 68 65 72  y use of another
28050 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
28060 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
28070 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  le..*/.case OP_R
28080 6f 77 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65  owData: {.  Vdbe
28090 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74  Cursor *pC;.  Bt
280a0 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20  Cursor *pCrsr;. 
280b0 20 75 33 32 20 6e 3b 0a 0a 20 20 70 4f 75 74 20   u32 n;..  pOut 
280c0 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
280d0 28 70 2c 20 70 4f 70 29 3b 0a 0a 20 20 61 73 73  (p, pOp);..  ass
280e0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
280f0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
28100 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
28110 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
28120 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21  ];.  assert( pC!
28130 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28140 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
28150 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
28160 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
28170 72 28 70 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  r(pC)==0 );.  as
28180 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f  sert( pC->nullRo
28190 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
281a0 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
281b0 21 3d 30 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  !=0 );.  pCrsr =
281c0 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
281d0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50 5f 52 6f  ..  /* The OP_Ro
281e0 77 44 61 74 61 20 6f 70 63 6f 64 65 73 20 61 6c  wData opcodes al
281f0 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f 50 5f 4e  ways follow OP_N
28200 6f 74 45 78 69 73 74 73 20 6f 72 0a 20 20 2a 2a  otExists or.  **
28210 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f 72   OP_SeekRowid or
28220 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70 5f 4e 65   OP_Rewind/Op_Ne
28230 78 74 20 77 69 74 68 20 6e 6f 20 69 6e 74 65 72  xt with no inter
28240 76 65 6e 69 6e 67 20 69 6e 73 74 72 75 63 74 69  vening instructi
28250 6f 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 69  ons.  ** that mi
28260 67 68 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74  ght invalidate t
28270 68 65 20 63 75 72 73 6f 72 2e 0a 20 20 2a 2a 20  he cursor..  ** 
28280 49 66 20 74 68 69 73 20 77 68 65 72 65 20 6e 6f  If this where no
28290 74 20 74 68 65 20 63 61 73 65 2c 20 6f 6e 20 6f  t the case, on o
282a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
282b0 61 73 73 65 72 74 28 29 73 0a 20 20 2a 2a 20 77  assert()s.  ** w
282c0 6f 75 6c 64 20 66 61 69 6c 2e 20 20 53 68 6f 75  ould fail.  Shou
282d0 6c 64 20 74 68 69 73 20 65 76 65 72 20 63 68 61  ld this ever cha
282e0 6e 67 65 20 28 62 65 63 61 75 73 65 20 6f 66 20  nge (because of 
282f0 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 63  changes in the c
28300 6f 64 65 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74  ode.  ** generat
28310 6f 72 29 20 74 68 65 6e 20 74 68 65 20 66 69 78  or) then the fix
28320 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 69 6e 73   would be to ins
28330 65 72 74 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20  ert a call to.  
28340 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  ** sqlite3VdbeCu
28350 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e 0a 20 20  rsorMoveto()..  
28360 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  */.  assert( pC-
28370 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
28380 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28390 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
283a0 6f 72 49 73 56 61 6c 69 64 28 70 43 72 73 72 29  orIsValid(pCrsr)
283b0 20 29 3b 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f   );.#if 0  /* No
283c0 74 20 72 65 71 75 69 72 65 64 20 64 75 65 20 74  t required due t
283d0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  o the previous t
283e0 6f 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  o assert() state
283f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 72 63 20 3d 20  ments */.  rc = 
28400 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
28410 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a 20 20 69  rMoveto(pC);.  i
28420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28430 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
28440 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23 65 6e 64  e_to_error;.#end
28450 69 66 0a 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  if..  n = sqlite
28460 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
28470 65 28 70 43 72 73 72 29 3b 0a 20 20 69 66 28 20  e(pCrsr);.  if( 
28480 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d 69  n>(u32)db->aLimi
28490 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
284a0 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 67 6f  ENGTH] ){.    go
284b0 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a  to too_big;.  }.
284c0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 30    testcase( n==0
284d0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
284e0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
284f0 65 65 28 70 43 72 73 72 2c 20 30 2c 20 6e 2c 20  ee(pCrsr, 0, n, 
28500 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 72 63 20  pOut);.  if( rc 
28510 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
28520 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28  _to_error;.  if(
28530 20 21 70 4f 70 2d 3e 70 33 20 29 20 44 65 65 70   !pOp->p3 ) Deep
28540 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
28550 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
28560 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
28570 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
28580 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a  pOp->p2, pOut);.
28590 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
285a0 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20  pcode: Rowid P1 
285b0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
285c0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
285d0 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e  d.**.** Store in
285e0 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20   register P2 an 
285f0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
28600 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
28610 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74  table entry that
28620 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e  .** P1 is curren
28630 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a  tly point to..**
28640 0a 2a 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69  .** P1 can be ei
28650 74 68 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79  ther an ordinary
28660 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
28670 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72  ual table.  Ther
28680 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20  e used to.** be 
28690 61 20 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52  a separate OP_VR
286a0 6f 77 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  owid opcode for 
286b0 75 73 65 20 77 69 74 68 20 76 69 72 74 75 61 6c  use with virtual
286c0 20 74 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69   tables, but thi
286d0 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20  s.** one opcode 
286e0 6e 6f 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  now works for bo
286f0 74 68 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a  th table types..
28700 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64  */.case OP_Rowid
28710 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
28720 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
28730 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
28740 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69  .  i64 v;.  sqli
28750 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
28760 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
28770 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
28780 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
28790 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
287a0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
287b0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
287c0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
287d0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
287e0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
287f0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
28800 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
28810 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50  rType!=CURTYPE_P
28820 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c  SEUDO || pC->nul
28830 6c 52 6f 77 20 29 3b 0a 20 20 69 66 28 20 70 43  lRow );.  if( pC
28840 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
28850 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
28860 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65  EM_Null;.    bre
28870 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ak;.  }else if( 
28880 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
28890 74 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43  to ){.    v = pC
288a0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
288b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
288c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
288d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d  .  }else if( pC-
288e0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
288f0 50 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 61  PE_VTAB ){.    a
28900 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 56  ssert( pC->uc.pV
28910 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 70 56  Cur!=0 );.    pV
28920 74 61 62 20 3d 20 70 43 2d 3e 75 63 2e 70 56 43  tab = pC->uc.pVC
28930 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70  ur->pVtab;.    p
28940 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
28950 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
28960 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  ert( pModule->xR
28970 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d  owid );.    rc =
28980 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64   pModule->xRowid
28990 28 70 43 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26  (pC->uc.pVCur, &
289a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
289b0 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
289c0 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  p, pVtab);.    i
289d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
289e0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
289f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
28a00 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28a10 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  BLE */.  }else{.
28a20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
28a30 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
28a40 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61  E_BTREE );.    a
28a50 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
28a60 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
28a70 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
28a80 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43  CursorRestore(pC
28a90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28aa0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
28ab0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  o_error;.    if(
28ac0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
28ad0 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67        pOut->flag
28ae0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
28af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28b00 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
28b10 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
28b20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
28b30 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
28b40 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = v;.  break;.}
28b50 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
28b60 6c 52 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  lRow P1 * * * *.
28b70 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
28b80 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75  ursor P1 to a nu
28b90 6c 6c 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f  ll row.  Any OP_
28ba0 43 6f 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e  Column operation
28bb0 73 0a 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20  s.** that occur 
28bc0 77 68 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72  while the cursor
28bd0 20 69 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20   is on the null 
28be0 72 6f 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  row will always.
28bf0 2a 2a 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e  ** write a NULL.
28c00 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
28c10 52 6f 77 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  Row: {.  VdbeCur
28c20 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65  sor *pC;..  asse
28c30 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
28c40 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
28c50 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
28c60 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
28c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
28c80 30 20 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  0 );.  pC->nullR
28c90 6f 77 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 63 61  ow = 1;.  pC->ca
28ca0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
28cb0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70  E_STALE;.  if( p
28cc0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
28cd0 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
28ce0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
28cf0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
28d00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
28d10 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 75  learCursor(pC->u
28d20 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  c.pCursor);.  }.
28d30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
28d40 70 63 6f 64 65 3a 20 53 65 65 6b 45 6e 64 20 50  pcode: SeekEnd P
28d50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  1 * * * *.**.** 
28d60 50 6f 73 69 74 69 6f 6e 20 63 75 72 73 6f 72 20  Position cursor 
28d70 50 31 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  P1 at the end of
28d80 20 74 68 65 20 62 74 72 65 65 20 66 6f 72 20 74   the btree for t
28d90 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
28da0 20 61 70 70 65 6e 64 69 6e 67 20 61 20 6e 65 77   appending a new
28db0 20 65 6e 74 72 79 20 6f 6e 74 6f 20 74 68 65 20   entry onto the 
28dc0 62 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  btree..**.** It 
28dd0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
28de0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  the cursor is us
28df0 65 64 20 6f 6e 6c 79 20 66 6f 72 20 61 70 70 65  ed only for appe
28e00 6e 64 69 6e 67 20 61 6e 64 20 73 6f 0a 2a 2a 20  nding and so.** 
28e10 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
28e20 20 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65   valid, then the
28e30 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c 72   cursor must alr
28e40 65 61 64 79 20 62 65 20 70 6f 69 6e 74 69 6e 67  eady be pointing
28e50 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
28e60 66 20 74 68 65 20 62 74 72 65 65 20 61 6e 64 20  f the btree and 
28e70 73 6f 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  so no changes ar
28e80 65 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 74 68 65  e made to.** the
28e90 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 2f 2a 20 4f   cursor..*/./* O
28ea0 70 63 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50  pcode: Last P1 P
28eb0 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68  2 * * *.**.** Th
28ec0 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74 68  e next use of th
28ed0 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75 6d  e Rowid or Colum
28ee0 6e 20 6f 72 20 50 72 65 76 20 69 6e 73 74 72 75  n or Prev instru
28ef0 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a 2a  ction for P1 .**
28f00 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20 74   will refer to t
28f10 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
28f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
28f30 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
28f40 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   If the table or
28f50 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
28f60 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20 6a  and P2>0, then j
28f70 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ump immediately 
28f80 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32 20  to P2..** If P2 
28f90 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20 74  is 0 or if the t
28fa0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73  able or index is
28fb0 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c   not empty, fall
28fc0 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20 74   through.** to t
28fd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73  he following ins
28fe0 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
28ff0 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76  This opcode leav
29000 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f  es the cursor co
29010 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65  nfigured to move
29020 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
29030 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 65  r,.** from the e
29040 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62 65  nd toward the be
29050 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74 68  ginning.  In oth
29060 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75  er words, the cu
29070 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69  rsor is.** confi
29080 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72 65  gured to use Pre
29090 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2f 0a  v, not Next..*/.
290a0 63 61 73 65 20 4f 50 5f 53 65 65 6b 45 6e 64 3a  case OP_SeekEnd:
290b0 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20 7b  .case OP_Last: {
290c0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
290d0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
290e0 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
290f0 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
29100 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  s;..  assert( pO
29110 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
29120 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
29130 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
29140 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
29150 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
29160 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
29170 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
29180 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
29190 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
291a0 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 61  ;.  res = 0;.  a
291b0 73 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20  ssert( pCrsr!=0 
291c0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
291d0 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65  _DEBUG.  pC->see
291e0 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  kOp = pOp->opcod
291f0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
29200 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
29210 53 65 65 6b 45 6e 64 20 29 7b 0a 20 20 20 20 61  SeekEnd ){.    a
29220 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
29230 30 20 29 3b 0a 20 20 20 20 70 43 2d 3e 73 65 65  0 );.    pC->see
29240 6b 52 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 20 20  kResult = -1;.  
29250 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
29260 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
29270 4e 28 70 43 72 73 72 29 20 29 7b 0a 20 20 20 20  N(pCrsr) ){.    
29280 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
29290 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
292a0 33 42 74 72 65 65 4c 61 73 74 28 70 43 72 73 72  3BtreeLast(pCrsr
292b0 2c 20 26 72 65 73 29 3b 0a 20 20 70 43 2d 3e 6e  , &res);.  pC->n
292c0 75 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73  ullRow = (u8)res
292d0 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64  ;.  pC->deferred
292e0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43  Moveto = 0;.  pC
292f0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
29300 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
29310 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
29320 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
29330 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 30  .  if( pOp->p2>0
29340 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e   ){.    VdbeBran
29350 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c 32  chTaken(res!=0,2
29360 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
29370 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
29380 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
29390 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 53  ../* Opcode: IfS
293a0 6d 61 6c 6c 65 72 20 50 31 20 50 32 20 50 33 20  maller P1 P2 P3 
293b0 2a 20 2a 0a 2a 2a 0a 2a 2a 20 45 73 74 69 6d 61  * *.**.** Estima
293c0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
293d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
293e0 6c 65 20 50 31 2e 20 20 4a 75 6d 70 20 74 6f 20  le P1.  Jump to 
293f0 50 32 20 69 66 20 74 68 61 74 0a 2a 2a 20 65 73  P2 if that.** es
29400 74 69 6d 61 74 65 20 69 73 20 6c 65 73 73 20 74  timate is less t
29410 68 61 6e 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  han approximatel
29420 79 20 32 2a 2a 28 30 2e 31 2a 50 33 29 2e 0a 2a  y 2**(0.1*P3)..*
29430 2f 0a 63 61 73 65 20 4f 50 5f 49 66 53 6d 61 6c  /.case OP_IfSmal
29440 6c 65 72 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  ler: {        /*
29450 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64 62 65 43   jump */.  VdbeC
29460 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43  ursor *pC;.  BtC
29470 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20  ursor *pCrsr;.  
29480 69 6e 74 20 72 65 73 3b 0a 20 20 69 36 34 20 73  int res;.  i64 s
29490 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  z;..  assert( pO
294a0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
294b0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
294c0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
294d0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
294e0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
294f0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
29500 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
29510 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 72 63  t( pCrsr );.  rc
29520 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 46   = sqlite3BtreeF
29530 69 72 73 74 28 70 43 72 73 72 2c 20 26 72 65 73  irst(pCrsr, &res
29540 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29550 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
29560 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
29570 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20  ==0 ){.    sz = 
29580 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
29590 6f 75 6e 74 45 73 74 28 70 43 72 73 72 29 3b 0a  ountEst(pCrsr);.
295a0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 73      if( ALWAYS(s
295b0 7a 3e 3d 30 29 20 26 26 20 73 71 6c 69 74 65 33  z>=0) && sqlite3
295c0 4c 6f 67 45 73 74 28 28 75 36 34 29 73 7a 29 3c  LogEst((u64)sz)<
295d0 70 4f 70 2d 3e 70 33 20 29 20 72 65 73 20 3d 20  pOp->p3 ) res = 
295e0 31 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72 61  1;.  }.  VdbeBra
295f0 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d 30 2c  nchTaken(res!=0,
29600 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20 29 20  2);.  if( res ) 
29610 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
29620 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a  .  break;.}.../*
29630 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 53   Opcode: SorterS
29640 6f 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ort P1 P2 * * *.
29650 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  **.** After all 
29660 72 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65  records have bee
29670 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
29680 74 68 65 20 53 6f 72 74 65 72 20 6f 62 6a 65 63  the Sorter objec
29690 74 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20  t.** identified 
296a0 62 79 20 50 31 2c 20 69 6e 76 6f 6b 65 20 74 68  by P1, invoke th
296b0 69 73 20 6f 70 63 6f 64 65 20 74 6f 20 61 63 74  is opcode to act
296c0 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 73 6f 72  ually do the sor
296d0 74 69 6e 67 2e 0a 2a 2a 20 4a 75 6d 70 20 74 6f  ting..** Jump to
296e0 20 50 32 20 69 66 20 74 68 65 72 65 20 61 72 65   P2 if there are
296f0 20 6e 6f 20 72 65 63 6f 72 64 73 20 74 6f 20 62   no records to b
29700 65 20 73 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  e sorted..**.** 
29710 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 61  This opcode is a
29720 6e 20 61 6c 69 61 73 20 66 6f 72 20 4f 50 5f 53  n alias for OP_S
29730 6f 72 74 20 61 6e 64 20 4f 50 5f 52 65 77 69 6e  ort and OP_Rewin
29740 64 20 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a  d that is used.*
29750 2a 20 66 6f 72 20 53 6f 72 74 65 72 20 6f 62 6a  * for Sorter obj
29760 65 63 74 73 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  ects..*/./* Opco
29770 64 65 3a 20 53 6f 72 74 20 50 31 20 50 32 20 2a  de: Sort P1 P2 *
29780 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   * *.**.** This 
29790 6f 70 63 6f 64 65 20 64 6f 65 73 20 65 78 61 63  opcode does exac
297a0 74 6c 79 20 74 68 65 20 73 61 6d 65 20 74 68 69  tly the same thi
297b0 6e 67 20 61 73 20 4f 50 5f 52 65 77 69 6e 64 20  ng as OP_Rewind 
297c0 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 69  except that.** i
297d0 74 20 69 6e 63 72 65 6d 65 6e 74 73 20 61 6e 20  t increments an 
297e0 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 67 6c 6f  undocumented glo
297f0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 75 73 65  bal variable use
29800 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
29810 2a 0a 2a 2a 20 53 6f 72 74 69 6e 67 20 69 73 20  *.** Sorting is 
29820 61 63 63 6f 6d 70 6c 69 73 68 65 64 20 62 79 20  accomplished by 
29830 77 72 69 74 69 6e 67 20 72 65 63 6f 72 64 73 20  writing records 
29840 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
29850 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ndex,.** then re
29860 77 69 6e 64 69 6e 67 20 74 68 61 74 20 69 6e 64  winding that ind
29870 65 78 20 61 6e 64 20 70 6c 61 79 69 6e 67 20 69  ex and playing i
29880 74 20 62 61 63 6b 20 66 72 6f 6d 20 62 65 67 69  t back from begi
29890 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 65 6e 64 2e  nning to.** end.
298a0 20 20 57 65 20 75 73 65 20 74 68 65 20 4f 50 5f    We use the OP_
298b0 53 6f 72 74 20 6f 70 63 6f 64 65 20 69 6e 73 74  Sort opcode inst
298c0 65 61 64 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64  ead of OP_Rewind
298d0 20 74 6f 20 64 6f 20 74 68 65 0a 2a 2a 20 72 65   to do the.** re
298e0 77 69 6e 64 69 6e 67 20 73 6f 20 74 68 61 74 20  winding so that 
298f0 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
29900 62 6c 65 20 77 69 6c 6c 20 62 65 20 69 6e 63 72  ble will be incr
29910 65 6d 65 6e 74 65 64 20 61 6e 64 0a 2a 2a 20 72  emented and.** r
29920 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
29930 63 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 77 68  can determine wh
29940 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
29950 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 0a 2a 2a   optimizer is.**
29960 20 63 6f 72 72 65 63 74 6c 79 20 6f 70 74 69 6d   correctly optim
29970 69 7a 69 6e 67 20 6f 75 74 20 73 6f 72 74 73 2e  izing out sorts.
29980 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74  .*/.case OP_Sort
29990 65 72 53 6f 72 74 3a 20 20 20 20 2f 2a 20 6a 75  erSort:    /* ju
299a0 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  mp */.case OP_So
299b0 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  rt: {        /* 
299c0 6a 75 6d 70 20 2a 2f 0a 23 69 66 64 65 66 20 53  jump */.#ifdef S
299d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
299e0 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2b  ite3_sort_count+
299f0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  +;.  sqlite3_sea
29a00 72 63 68 5f 63 6f 75 6e 74 2d 2d 3b 0a 23 65 6e  rch_count--;.#en
29a10 64 69 66 0a 20 20 70 2d 3e 61 43 6f 75 6e 74 65  dif.  p->aCounte
29a20 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  r[SQLITE_STMTSTA
29a30 54 55 53 5f 53 4f 52 54 5d 2b 2b 3b 0a 20 20 2f  TUS_SORT]++;.  /
29a40 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
29a50 6e 74 6f 20 4f 50 5f 52 65 77 69 6e 64 20 2a 2f  nto OP_Rewind */
29a60 0a 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65  .}./* Opcode: Re
29a70 77 69 6e 64 20 50 31 20 50 32 20 2a 20 2a 20 2a  wind P1 P2 * * *
29a80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20  .**.** The next 
29a90 75 73 65 20 6f 66 20 74 68 65 20 52 6f 77 69 64  use of the Rowid
29aa0 20 6f 72 20 43 6f 6c 75 6d 6e 20 6f 72 20 4e 65   or Column or Ne
29ab0 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  xt instruction f
29ac0 6f 72 20 50 31 20 0a 2a 2a 20 77 69 6c 6c 20 72  or P1 .** will r
29ad0 65 66 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  efer to the firs
29ae0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
29af0 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
29b00 20 69 6e 64 65 78 2e 0a 2a 2a 20 49 66 20 74 68   index..** If th
29b10 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
29b20 20 69 73 20 65 6d 70 74 79 2c 20 6a 75 6d 70 20   is empty, jump 
29b30 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50  immediately to P
29b40 32 2e 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  2..** If the tab
29b50 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 6e  le or index is n
29b60 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c 6c 20 74  ot empty, fall t
29b70 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 66 6f  hrough to the fo
29b80 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 69 6e 73 74  llowing .** inst
29b90 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ruction..**.** T
29ba0 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65  his opcode leave
29bb0 73 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 6e  s the cursor con
29bc0 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76 65 20  figured to move 
29bd0 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72  in forward order
29be0 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 62 65  ,.** from the be
29bf0 67 69 6e 6e 69 6e 67 20 74 6f 77 61 72 64 20 74  ginning toward t
29c00 68 65 20 65 6e 64 2e 20 20 49 6e 20 6f 74 68 65  he end.  In othe
29c10 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 75 72  r words, the cur
29c20 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67  sor is.** config
29c30 75 72 65 64 20 74 6f 20 75 73 65 20 4e 65 78 74  ured to use Next
29c40 2c 20 6e 6f 74 20 50 72 65 76 2e 0a 2a 2f 0a 63  , not Prev..*/.c
29c50 61 73 65 20 4f 50 5f 52 65 77 69 6e 64 3a 20 7b  ase OP_Rewind: {
29c60 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
29c70 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
29c80 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  *pC;.  BtCursor 
29c90 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72 65  *pCrsr;.  int re
29ca0 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  s;..  assert( pO
29cb0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
29cc0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
29cd0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
29ce0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
29cf0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
29d00 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
29d10 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63  r(pC)==(pOp->opc
29d20 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 53 6f  ode==OP_SorterSo
29d30 72 74 29 20 29 3b 0a 20 20 72 65 73 20 3d 20 31  rt) );.  res = 1
29d40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29d50 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b  DEBUG.  pC->seek
29d60 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a  Op = OP_Rewind;.
29d70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 53  #endif.  if( isS
29d80 6f 72 74 65 72 28 70 43 29 20 29 7b 0a 20 20 20  orter(pC) ){.   
29d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
29da0 65 53 6f 72 74 65 72 52 65 77 69 6e 64 28 70 43  eSorterRewind(pC
29db0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 65 6c 73 65  , &res);.  }else
29dc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
29dd0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
29de0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  YPE_BTREE );.   
29df0 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
29e00 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 61 73 73  pCursor;.    ass
29e10 65 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20  ert( pCrsr );.  
29e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29e30 72 65 65 46 69 72 73 74 28 70 43 72 73 72 2c 20  reeFirst(pCrsr, 
29e40 26 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 64  &res);.    pC->d
29e50 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
29e60 30 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65  0;.    pC->cache
29e70 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
29e80 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TALE;.  }.  if( 
29e90 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
29ea0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
29eb0 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 28 75  pC->nullRow = (u
29ec0 38 29 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  8)res;.  assert(
29ed0 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70 4f   pOp->p2>0 && pO
29ee0 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b 0a  p->p2<p->nOp );.
29ef0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
29f00 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
29f10 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75  f( res ) goto ju
29f20 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
29f30 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
29f40 20 4e 65 78 74 20 50 31 20 50 32 20 50 33 20 50   Next P1 P2 P3 P
29f50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  4 P5.**.** Advan
29f60 63 65 20 63 75 72 73 6f 72 20 50 31 20 73 6f 20  ce cursor P1 so 
29f70 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
29f80 6f 20 74 68 65 20 6e 65 78 74 20 6b 65 79 2f 64  o the next key/d
29f90 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
29fa0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
29fb0 78 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  x.  If there are
29fc0 20 6e 6f 20 6d 6f 72 65 20 6b 65 79 2f 76 61 6c   no more key/val
29fd0 75 65 20 70 61 69 72 73 20 74 68 65 6e 20 66 61  ue pairs then fa
29fe0 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f  ll through.** to
29ff0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2a000 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 42 75 74  nstruction.  But
2a010 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2a020 64 76 61 6e 63 65 20 77 61 73 20 73 75 63 63 65  dvance was succe
2a030 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70 20 69  ssful,.** jump i
2a040 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
2a050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e 65 78 74  ..**.** The Next
2a060 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20   opcode is only 
2a070 76 61 6c 69 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  valid following 
2a080 61 6e 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47  an SeekGT, SeekG
2a090 45 2c 20 6f 72 0a 2a 2a 20 4f 50 5f 52 65 77 69  E, or.** OP_Rewi
2a0a0 6e 64 20 6f 70 63 6f 64 65 20 75 73 65 64 20 74  nd opcode used t
2a0b0 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  o position the c
2a0c0 75 72 73 6f 72 2e 20 20 4e 65 78 74 20 69 73 20  ursor.  Next is 
2a0d0 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  not allowed.** t
2a0e0 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b 4c 54 2c  o follow SeekLT,
2a0f0 20 53 65 65 6b 4c 45 2c 20 6f 72 20 4f 50 5f 4c   SeekLE, or OP_L
2a100 61 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ast..**.** The P
2a110 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
2a120 20 66 6f 72 20 61 20 72 65 61 6c 20 74 61 62 6c   for a real tabl
2a130 65 2c 20 6e 6f 74 20 61 20 70 73 65 75 64 6f 2d  e, not a pseudo-
2a140 74 61 62 6c 65 2e 20 20 50 31 20 6d 75 73 74 20  table.  P1 must 
2a150 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 6f 70 65  have.** been ope
2a160 6e 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ned prior to thi
2a170 73 20 6f 70 63 6f 64 65 20 6f 72 20 74 68 65 20  s opcode or the 
2a180 70 72 6f 67 72 61 6d 20 77 69 6c 6c 20 73 65 67  program will seg
2a190 66 61 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fault..**.** The
2a1a0 20 50 33 20 76 61 6c 75 65 20 69 73 20 61 20 68   P3 value is a h
2a1b0 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72 65 65  int to the btree
2a1c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
2a1d0 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61 74 0a   If P3==1, that.
2a1e0 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73 20 61  ** means P1 is a
2a1f0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
2a200 74 68 61 74 20 74 68 69 73 20 69 6e 73 74 72 75  that this instru
2a210 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ction could have
2a220 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74 65 64   been.** omitted
2a230 20 69 66 20 74 68 61 74 20 69 6e 64 65 78 20 68   if that index h
2a240 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65 2e 20  ad been unique. 
2a250 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79 20 30   P3 is usually 0
2a260 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c 77 61  .  P3 is.** alwa
2a270 79 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 31  ys either 0 or 1
2a280 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 6c  ..**.** P4 is al
2a290 77 61 79 73 20 6f 66 20 74 79 70 65 20 50 34 5f  ways of type P4_
2a2a0 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66 75 6e  ADVANCE. The fun
2a2b0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 70 6f  ction pointer po
2a2c0 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  ints to.** sqlit
2a2d0 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 0a 2a  e3BtreeNext()..*
2a2e0 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f  *.** If P5 is po
2a2f0 73 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a  sitive and the j
2a300 75 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68  ump is taken, th
2a310 65 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72  en event counter
2a320 0a 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20  .** number P5-1 
2a330 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
2a340 73 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63  statement is inc
2a350 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
2a360 53 65 65 20 61 6c 73 6f 3a 20 50 72 65 76 2c 20  See also: Prev, 
2a370 4e 65 78 74 49 66 4f 70 65 6e 0a 2a 2f 0a 2f 2a  NextIfOpen.*/./*
2a380 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 49 66 4f   Opcode: NextIfO
2a390 70 65 6e 20 50 31 20 50 32 20 50 33 20 50 34 20  pen P1 P2 P3 P4 
2a3a0 50 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P5.**.** This op
2a3b0 63 6f 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20  code works just 
2a3c0 6c 69 6b 65 20 4e 65 78 74 20 65 78 63 65 70 74  like Next except
2a3d0 20 74 68 61 74 20 69 66 20 63 75 72 73 6f 72 20   that if cursor 
2a3e0 50 31 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65  P1 is not.** ope
2a3f0 6e 20 69 74 20 62 65 68 61 76 65 73 20 61 20 6e  n it behaves a n
2a400 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  o-op..*/./* Opco
2a410 64 65 3a 20 50 72 65 76 20 50 31 20 50 32 20 50  de: Prev P1 P2 P
2a420 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 61  3 P4 P5.**.** Ba
2a430 63 6b 20 75 70 20 63 75 72 73 6f 72 20 50 31 20  ck up cursor P1 
2a440 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2a450 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  s to the previou
2a460 73 20 6b 65 79 2f 64 61 74 61 20 70 61 69 72 20  s key/data pair 
2a470 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c 65 20  in its.** table 
2a480 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68  or index.  If th
2a490 65 72 65 20 69 73 20 6e 6f 20 70 72 65 76 69 6f  ere is no previo
2a4a0 75 73 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69  us key/value pai
2a4b0 72 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72  rs then fall thr
2a4c0 6f 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ough.** to the f
2a4d0 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63  ollowing instruc
2a4e0 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68  tion.  But if th
2a4f0 65 20 63 75 72 73 6f 72 20 62 61 63 6b 75 70 20  e cursor backup 
2a500 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
2a510 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
2a520 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
2a530 0a 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63  .** The Prev opc
2a540 6f 64 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ode is only vali
2a550 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53  d following an S
2a560 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45 2c 20 6f  eekLT, SeekLE, o
2a570 72 0a 2a 2a 20 4f 50 5f 4c 61 73 74 20 6f 70 63  r.** OP_Last opc
2a580 6f 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69  ode used to posi
2a590 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e  tion the cursor.
2a5a0 20 20 50 72 65 76 20 69 73 20 6e 6f 74 20 61 6c    Prev is not al
2a5b0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c  lowed.** to foll
2a5c0 6f 77 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47  ow SeekGT, SeekG
2a5d0 45 2c 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2e  E, or OP_Rewind.
2a5e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 31 20 63 75  .**.** The P1 cu
2a5f0 72 73 6f 72 20 6d 75 73 74 20 62 65 20 66 6f 72  rsor must be for
2a600 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e   a real table, n
2a610 6f 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c  ot a pseudo-tabl
2a620 65 2e 20 20 49 66 20 50 31 20 69 73 0a 2a 2a 20  e.  If P1 is.** 
2a630 6e 6f 74 20 6f 70 65 6e 20 74 68 65 6e 20 74 68  not open then th
2a640 65 20 62 65 68 61 76 69 6f 72 20 69 73 20 75 6e  e behavior is un
2a650 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  defined..**.** T
2a660 68 65 20 50 33 20 76 61 6c 75 65 20 69 73 20 61  he P3 value is a
2a670 20 68 69 6e 74 20 74 6f 20 74 68 65 20 62 74 72   hint to the btr
2a680 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2a690 6e 2e 20 49 66 20 50 33 3d 3d 31 2c 20 74 68 61  n. If P3==1, tha
2a6a0 74 0a 2a 2a 20 6d 65 61 6e 73 20 50 31 20 69 73  t.** means P1 is
2a6b0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2a6c0 64 20 74 68 61 74 20 74 68 69 73 20 69 6e 73 74  d that this inst
2a6d0 72 75 63 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  ruction could ha
2a6e0 76 65 20 62 65 65 6e 0a 2a 2a 20 6f 6d 69 74 74  ve been.** omitt
2a6f0 65 64 20 69 66 20 74 68 61 74 20 69 6e 64 65 78  ed if that index
2a700 20 68 61 64 20 62 65 65 6e 20 75 6e 69 71 75 65   had been unique
2a710 2e 20 20 50 33 20 69 73 20 75 73 75 61 6c 6c 79  .  P3 is usually
2a720 20 30 2e 20 20 50 33 20 69 73 0a 2a 2a 20 61 6c   0.  P3 is.** al
2a730 77 61 79 73 20 65 69 74 68 65 72 20 30 20 6f 72  ways either 0 or
2a740 20 31 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20   1..**.** P4 is 
2a750 61 6c 77 61 79 73 20 6f 66 20 74 79 70 65 20 50  always of type P
2a760 34 5f 41 44 56 41 4e 43 45 2e 20 54 68 65 20 66  4_ADVANCE. The f
2a770 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
2a780 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 73 71 6c  points to.** sql
2a790 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2a7a0 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35  s()..**.** If P5
2a7b0 20 69 73 20 70 6f 73 69 74 69 76 65 20 61 6e 64   is positive and
2a7c0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
2a7d0 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e 74 20 63  en, then event c
2a7e0 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72  ounter.** number
2a7f0 20 50 35 2d 31 20 69 6e 20 74 68 65 20 70 72 65   P5-1 in the pre
2a800 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
2a810 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2a820 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72  */./* Opcode: Pr
2a830 65 76 49 66 4f 70 65 6e 20 50 31 20 50 32 20 50  evIfOpen P1 P2 P
2a840 33 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 54 68  3 P4 P5.**.** Th
2a850 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20  is opcode works 
2a860 6a 75 73 74 20 6c 69 6b 65 20 50 72 65 76 20 65  just like Prev e
2a870 78 63 65 70 74 20 74 68 61 74 20 69 66 20 63 75  xcept that if cu
2a880 72 73 6f 72 20 50 31 20 69 73 20 6e 6f 74 0a 2a  rsor P1 is not.*
2a890 2a 20 6f 70 65 6e 20 69 74 20 62 65 68 61 76 65  * open it behave
2a8a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 2f 2a  s a no-op..*/./*
2a8b0 20 4f 70 63 6f 64 65 3a 20 53 6f 72 74 65 72 4e   Opcode: SorterN
2a8c0 65 78 74 20 50 31 20 50 32 20 2a 20 2a 20 50 35  ext P1 P2 * * P5
2a8d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
2a8e0 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
2a8f0 6b 65 20 4f 50 5f 4e 65 78 74 20 65 78 63 65 70  ke OP_Next excep
2a900 74 20 74 68 61 74 20 50 31 20 6d 75 73 74 20 62  t that P1 must b
2a910 65 20 61 0a 2a 2a 20 73 6f 72 74 65 72 20 6f 62  e a.** sorter ob
2a920 6a 65 63 74 20 66 6f 72 20 77 68 69 63 68 20 74  ject for which t
2a930 68 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  he OP_SorterSort
2a940 20 6f 70 63 6f 64 65 20 68 61 73 20 62 65 65 6e   opcode has been
2a950 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68  .** invoked.  Th
2a960 69 73 20 6f 70 63 6f 64 65 20 61 64 76 61 6e 63  is opcode advanc
2a970 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  es the cursor to
2a980 20 74 68 65 20 6e 65 78 74 20 73 6f 72 74 65 64   the next sorted
2a990 0a 2a 2a 20 72 65 63 6f 72 64 2c 20 6f 72 20 6a  .** record, or j
2a9a0 75 6d 70 73 20 74 6f 20 50 32 20 69 66 20 74 68  umps to P2 if th
2a9b0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
2a9c0 73 6f 72 74 65 64 20 72 65 63 6f 72 64 73 2e 0a  sorted records..
2a9d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65  */.case OP_Sorte
2a9e0 72 4e 65 78 74 3a 20 7b 20 20 2f 2a 20 6a 75 6d  rNext: {  /* jum
2a9f0 70 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  p */.  VdbeCurso
2aa00 72 20 2a 70 43 3b 0a 0a 20 20 70 43 20 3d 20 70  r *pC;..  pC = p
2aa10 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
2aa20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
2aa30 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 72 63  rter(pC) );.  rc
2aa40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f   = sqlite3VdbeSo
2aa50 72 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43 29  rterNext(db, pC)
2aa60 3b 0a 20 20 67 6f 74 6f 20 6e 65 78 74 5f 74 61  ;.  goto next_ta
2aa70 69 6c 3b 0a 63 61 73 65 20 4f 50 5f 50 72 65 76  il;.case OP_Prev
2aa80 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a 20 6a 75  IfOpen:    /* ju
2aa90 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65  mp */.case OP_Ne
2aaa0 78 74 49 66 4f 70 65 6e 3a 20 20 20 20 2f 2a 20  xtIfOpen:    /* 
2aab0 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70 2d  jump */.  if( p-
2aac0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3d  >apCsr[pOp->p1]=
2aad0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a  =0 ) break;.  /*
2aae0 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
2aaf0 0a 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 20 20  .case OP_Prev:  
2ab00 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
2ab10 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a  */.case OP_Next:
2ab20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d            /* jum
2ab30 70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  p */.  assert( p
2ab40 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2ab50 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
2ab60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
2ab70 2d 3e 70 35 3c 41 72 72 61 79 53 69 7a 65 28 70  ->p5<ArraySize(p
2ab80 2d 3e 61 43 6f 75 6e 74 65 72 29 20 29 3b 0a 20  ->aCounter) );. 
2ab90 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70   pC = p->apCsr[p
2aba0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72  Op->p1];.  asser
2abb0 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73  t( pC!=0 );.  as
2abc0 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
2abd0 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
2abe0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
2abf0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
2ac00 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
2ac10 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
2ac20 50 5f 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 70  P_Next || pOp->p
2ac30 34 2e 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69  4.xAdvance==sqli
2ac40 74 65 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a  te3BtreeNext );.
2ac50 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2ac60 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c  pcode!=OP_Prev |
2ac70 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  | pOp->p4.xAdvan
2ac80 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ce==sqlite3Btree
2ac90 50 72 65 76 69 6f 75 73 20 29 3b 0a 20 20 61 73  Previous );.  as
2aca0 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
2acb0 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  e!=OP_NextIfOpen
2acc0 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76   || pOp->p4.xAdv
2acd0 61 6e 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72  ance==sqlite3Btr
2ace0 65 65 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65  eeNext );.  asse
2acf0 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
2ad00 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 7c  =OP_PrevIfOpen |
2ad10 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  | pOp->p4.xAdvan
2ad20 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ce==sqlite3Btree
2ad30 50 72 65 76 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a  Previous);..  /*
2ad40 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65   The Next opcode
2ad50 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66   is only used af
2ad60 74 65 72 20 53 65 65 6b 47 54 2c 20 53 65 65 6b  ter SeekGT, Seek
2ad70 47 45 2c 20 61 6e 64 20 52 65 77 69 6e 64 2e 0a  GE, and Rewind..
2ad80 20 20 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70    ** The Prev op
2ad90 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  code is only use
2ada0 64 20 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20  d after SeekLT, 
2adb0 53 65 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74  SeekLE, and Last
2adc0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2add0 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e  Op->opcode!=OP_N
2ade0 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  ext || pOp->opco
2adf0 64 65 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65  de!=OP_NextIfOpe
2ae00 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e  n.       || pC->
2ae10 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47  seekOp==OP_SeekG
2ae20 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d  T || pC->seekOp=
2ae30 3d 4f 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20  =OP_SeekGE.     
2ae40 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d    || pC->seekOp=
2ae50 3d 4f 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43  =OP_Rewind || pC
2ae60 2d 3e 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75  ->seekOp==OP_Fou
2ae70 6e 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nd);.  assert( p
2ae80 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50  Op->opcode!=OP_P
2ae90 72 65 76 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  rev || pOp->opco
2aea0 64 65 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65  de!=OP_PrevIfOpe
2aeb0 6e 0a 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e  n.       || pC->
2aec0 73 65 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  seekOp==OP_SeekL
2aed0 54 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d  T || pC->seekOp=
2aee0 3d 4f 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20  =OP_SeekLE.     
2aef0 20 20 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d    || pC->seekOp=
2af00 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 0a 20 20 72  =OP_Last );..  r
2af10 63 20 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76  c = pOp->p4.xAdv
2af20 61 6e 63 65 28 70 43 2d 3e 75 63 2e 70 43 75 72  ance(pC->uc.pCur
2af30 73 6f 72 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 6e  sor, pOp->p3);.n
2af40 65 78 74 5f 74 61 69 6c 3a 0a 20 20 70 43 2d 3e  ext_tail:.  pC->
2af50 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
2af60 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 56 64 62  CHE_STALE;.  Vdb
2af70 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 63 3d  eBranchTaken(rc=
2af80 3d 53 51 4c 49 54 45 5f 4f 4b 2c 32 29 3b 0a 20  =SQLITE_OK,2);. 
2af90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2afa0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e 75  OK ){.    pC->nu
2afb0 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  llRow = 0;.    p
2afc0 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d 3e  ->aCounter[pOp->
2afd0 70 35 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51  p5]++;.#ifdef SQ
2afe0 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
2aff0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
2b000 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
2b010 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
2b020 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69  _and_check_for_i
2b030 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 0a 20 20  nterrupt;.  }.  
2b040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
2b050 4f 4e 45 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  ONE ) goto abort
2b060 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2b070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b080 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  .  pC->nullRow =
2b090 20 31 3b 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b   1;.  goto check
2b0a0 5f 66 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a  _for_interrupt;.
2b0b0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64  }../* Opcode: Id
2b0c0 78 49 6e 73 65 72 74 20 50 31 20 50 32 20 50 33  xInsert P1 P2 P3
2b0d0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
2b0e0 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a 2a  is: key=r[P2].**
2b0f0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32 20  .** Register P2 
2b100 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e 64  holds an SQL ind
2b110 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69 6e  ex key made usin
2b120 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65 63  g the.** MakeRec
2b130 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ord instructions
2b140 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77  .  This opcode w
2b150 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a 2a  rites that key.*
2b160 2a 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 65 78  * into the index
2b170 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72 20 74   P1.  Data for t
2b180 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69 6c 2e  he entry is nil.
2b190 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34 20 69 73 20  .**.** If P4 is 
2b1a0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  not zero, then i
2b1b0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2b1c0 6f 66 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  of values in the
2b1d0 20 75 6e 70 61 63 6b 65 64 0a 2a 2a 20 6b 65 79   unpacked.** key
2b1e0 20 6f 66 20 72 65 67 28 50 32 29 2e 20 20 49 6e   of reg(P2).  In
2b1f0 20 74 68 61 74 20 63 61 73 65 2c 20 50 33 20 69   that case, P3 i
2b200 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
2b210 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
2b220 72 0a 2a 2a 20 66 6f 72 20 74 68 65 20 75 6e 70  r.** for the unp
2b230 61 63 6b 65 64 20 6b 65 79 2e 20 20 54 68 65 20  acked key.  The 
2b240 61 76 61 69 6c 61 62 69 6c 69 74 79 20 6f 66 20  availability of 
2b250 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b 65 79  the unpacked key
2b260 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a   can sometimes.*
2b270 2a 20 62 65 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * be an optimiza
2b280 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  tion..**.** If P
2b290 35 20 68 61 73 20 74 68 65 20 4f 50 46 4c 41 47  5 has the OPFLAG
2b2a0 5f 41 50 50 45 4e 44 20 62 69 74 20 73 65 74 2c  _APPEND bit set,
2b2b0 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
2b2c0 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
2b2d0 79 65 72 0a 2a 2a 20 74 68 61 74 20 74 68 69 73  yer.** that this
2b2e0 20 69 6e 73 65 72 74 20 69 73 20 6c 69 6b 65 6c   insert is likel
2b2f0 79 20 74 6f 20 62 65 20 61 6e 20 61 70 70 65 6e  y to be an appen
2b300 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 68  d..**.** If P5 h
2b310 61 73 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43  as the OPFLAG_NC
2b320 48 41 4e 47 45 20 62 69 74 20 73 65 74 2c 20 74  HANGE bit set, t
2b330 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63  hen the change c
2b340 6f 75 6e 74 65 72 20 69 73 0a 2a 2a 20 69 6e 63  ounter is.** inc
2b350 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73  remented by this
2b360 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 49   instruction.  I
2b370 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e 43 48  f the OPFLAG_NCH
2b380 41 4e 47 45 20 62 69 74 20 69 73 20 63 6c 65 61  ANGE bit is clea
2b390 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  r,.** then the c
2b3a0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 69 73  hange counter is
2b3b0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
2b3c0 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
2b3d0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c  USESEEKRESULT fl
2b3e0 61 67 20 6f 66 20 50 35 20 69 73 20 73 65 74 2c  ag of P5 is set,
2b3f0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2b400 69 6f 6e 20 6d 69 67 68 74 0a 2a 2a 20 72 75 6e  ion might.** run
2b410 20 66 61 73 74 65 72 20 62 79 20 61 76 6f 69 64   faster by avoid
2b420 69 6e 67 20 61 6e 20 75 6e 6e 65 63 65 73 73 61  ing an unnecessa
2b430 72 79 20 73 65 65 6b 20 6f 6e 20 63 75 72 73 6f  ry seek on curso
2b440 72 20 50 31 2e 20 20 48 6f 77 65 76 65 72 2c 0a  r P1.  However,.
2b450 2a 2a 20 74 68 65 20 4f 50 46 4c 41 47 5f 55 53  ** the OPFLAG_US
2b460 45 53 45 45 4b 52 45 53 55 4c 54 20 66 6c 61 67  ESEEKRESULT flag
2b470 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 73 65   must only be se
2b480 74 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  t if there have 
2b490 62 65 65 6e 20 6e 6f 20 70 72 69 6f 72 0a 2a 2a  been no prior.**
2b4a0 20 73 65 65 6b 73 20 6f 6e 20 74 68 65 20 63 75   seeks on the cu
2b4b0 72 73 6f 72 20 6f 72 20 69 66 20 74 68 65 20 6d  rsor or if the m
2b4c0 6f 73 74 20 72 65 63 65 6e 74 20 73 65 65 6b 20  ost recent seek 
2b4d0 75 73 65 64 20 61 20 6b 65 79 20 65 71 75 69 76  used a key equiv
2b4e0 61 6c 65 6e 74 0a 2a 2a 20 74 6f 20 50 32 2e 20  alent.** to P2. 
2b4f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
2b500 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  ruction only wor
2b510 6b 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e 20  ks for indices. 
2b520 20 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   The equivalent 
2b530 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66  instruction.** f
2b540 6f 72 20 74 61 62 6c 65 73 20 69 73 20 4f 50 5f  or tables is OP_
2b550 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70  Insert..*/./* Op
2b560 63 6f 64 65 3a 20 53 6f 72 74 65 72 49 6e 73 65  code: SorterInse
2b570 72 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  rt P1 P2 * * *.*
2b580 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d  * Synopsis: key=
2b590 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67 69  r[P2].**.** Regi
2b5a0 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61 6e  ster P2 holds an
2b5b0 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20 6d   SQL index key m
2b5c0 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ade using the.**
2b5d0 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73 74   MakeRecord inst
2b5e0 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  ructions.  This 
2b5f0 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74 68  opcode writes th
2b600 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20 74  at key.** into t
2b610 68 65 20 73 6f 72 74 65 72 20 50 31 2e 20 20 44  he sorter P1.  D
2b620 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72  ata for the entr
2b630 79 20 69 73 20 6e 69 6c 2e 0a 2a 2f 0a 63 61 73  y is nil..*/.cas
2b640 65 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  e OP_SorterInser
2b650 74 3a 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20  t:       /* in2 
2b660 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 49 6e  */.case OP_IdxIn
2b670 73 65 72 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  sert: {        /
2b680 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 43  * in2 */.  VdbeC
2b690 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 72  ursor *pC;.  Btr
2b6a0 65 65 50 61 79 6c 6f 61 64 20 78 3b 0a 0a 20 20  eePayload x;..  
2b6b0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2b6c0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2b6d0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2b6e0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2b6f0 3e 70 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56  >p1];.  sqlite3V
2b700 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e  dbeIncrWriteCoun
2b710 74 65 72 28 70 2c 20 70 43 29 3b 0a 20 20 61 73  ter(p, pC);.  as
2b720 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
2b730 20 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65   assert( isSorte
2b740 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e 6f 70 63  r(pC)==(pOp->opc
2b750 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 49 6e  ode==OP_SorterIn
2b760 73 65 72 74 29 20 29 3b 0a 20 20 70 49 6e 32 20  sert) );.  pIn2 
2b770 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d  = &aMem[pOp->p2]
2b780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 32  ;.  assert( pIn2
2b790 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
2b7a0 6f 62 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d  ob );.  if( pOp-
2b7b0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48  >p5 & OPFLAG_NCH
2b7c0 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68 61 6e 67  ANGE ) p->nChang
2b7d0 65 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e++;.  assert( p
2b7e0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
2b7f0 54 59 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 4f  TYPE_BTREE || pO
2b800 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f  p->opcode==OP_So
2b810 72 74 65 72 49 6e 73 65 72 74 20 29 3b 0a 20 20  rterInsert );.  
2b820 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
2b830 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ble==0 );.  rc =
2b840 20 45 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32   ExpandBlob(pIn2
2b850 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2b860 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
2b870 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70 4f 70  error;.  if( pOp
2b880 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  ->opcode==OP_Sor
2b890 74 65 72 49 6e 73 65 72 74 20 29 7b 0a 20 20 20  terInsert ){.   
2b8a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
2b8b0 65 53 6f 72 74 65 72 57 72 69 74 65 28 70 43 2c  eSorterWrite(pC,
2b8c0 20 70 49 6e 32 29 3b 0a 20 20 7d 65 6c 73 65 7b   pIn2);.  }else{
2b8d0 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 49  .    x.nKey = pI
2b8e0 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78 2e 70 4b 65  n2->n;.    x.pKe
2b8f0 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a 20 20 20  y = pIn2->z;.   
2b900 20 78 2e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 2b   x.aMem = aMem +
2b910 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 78 2e   pOp->p3;.    x.
2b920 6e 4d 65 6d 20 3d 20 28 75 31 36 29 70 4f 70 2d  nMem = (u16)pOp-
2b930 3e 70 34 2e 69 3b 0a 20 20 20 20 72 63 20 3d 20  >p4.i;.    rc = 
2b940 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
2b950 72 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  rt(pC->uc.pCurso
2b960 72 2c 20 26 78 2c 0a 20 20 20 20 20 20 20 20 20  r, &x,.         
2b970 28 70 4f 70 2d 3e 70 35 20 26 20 28 4f 50 46 4c  (pOp->p5 & (OPFL
2b980 41 47 5f 41 50 50 45 4e 44 7c 4f 50 46 4c 41 47  AG_APPEND|OPFLAG
2b990 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29 29 2c  _SAVEPOSITION)),
2b9a0 20 0a 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d   .        ((pOp-
2b9b0 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45  >p5 & OPFLAG_USE
2b9c0 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43  SEEKRESULT) ? pC
2b9d0 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30  ->seekResult : 0
2b9e0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2b9f0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
2ba00 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
2ba10 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
2ba20 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2ba30 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ALE;.  }.  if( r
2ba40 63 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75  c) goto abort_du
2ba50 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
2ba60 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2ba70 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20  e: IdxDelete P1 
2ba80 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
2ba90 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 40  opsis: key=r[P2@
2baa0 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  P3].**.** The co
2bab0 6e 74 65 6e 74 20 6f 66 20 50 33 20 72 65 67 69  ntent of P3 regi
2bac0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
2bad0 74 20 72 65 67 69 73 74 65 72 20 50 32 20 66 6f  t register P2 fo
2bae0 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61 63 6b 65  rm.** an unpacke
2baf0 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 54 68 69  d index key. Thi
2bb00 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65 73  s opcode removes
2bb10 20 74 68 61 74 20 65 6e 74 72 79 20 66 72 6f 6d   that entry from
2bb20 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
2bb30 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20  pened by cursor 
2bb40 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  P1..*/.case OP_I
2bb50 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64  dxDelete: {.  Vd
2bb60 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
2bb70 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
2bb80 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e  .  int res;.  Un
2bb90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
2bba0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2bbb0 70 33 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p3>0 );.  assert
2bbc0 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70  ( pOp->p2>0 && p
2bbd0 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d  Op->p2+pOp->p3<=
2bbe0 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
2bbf0 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
2bc00 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2bc10 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2bc20 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2bc30 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2bc40 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2bc50 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
2bc60 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2bc70 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2bc80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 49  ;.  sqlite3VdbeI
2bc90 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65 72 28  ncrWriteCounter(
2bca0 70 2c 20 70 43 29 3b 0a 20 20 70 43 72 73 72 20  p, pC);.  pCrsr 
2bcb0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
2bcc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
2bcd0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
2bce0 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a  ( pOp->p5==0 );.
2bcf0 20 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70    r.pKeyInfo = p
2bd00 43 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72  C->pKeyInfo;.  r
2bd10 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70  .nField = (u16)p
2bd20 4f 70 2d 3e 70 33 3b 0a 20 20 72 2e 64 65 66 61  Op->p3;.  r.defa
2bd30 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 72 2e  ult_rc = 0;.  r.
2bd40 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
2bd50 2d 3e 70 32 5d 3b 0a 20 20 72 63 20 3d 20 73 71  ->p2];.  rc = sq
2bd60 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2bd70 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20  Unpacked(pCrsr, 
2bd80 26 72 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b  &r, 0, 0, &res);
2bd90 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2bda0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2bdb0 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  ror;.  if( res==
2bdc0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2bdd0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2bde0 28 70 43 72 73 72 2c 20 42 54 52 45 45 5f 41 55  (pCrsr, BTREE_AU
2bdf0 58 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 69 66  XDELETE);.    if
2be00 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
2be10 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2be20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2be30 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
2be40 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 63 61 63  ==0 );.  pC->cac
2be50 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
2be60 5f 53 54 41 4c 45 3b 0a 20 20 70 43 2d 3e 73 65  _STALE;.  pC->se
2be70 65 6b 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  ekResult = 0;.  
2be80 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2be90 6f 64 65 3a 20 44 65 66 65 72 72 65 64 53 65 65  ode: DeferredSee
2bea0 6b 20 50 31 20 2a 20 50 33 20 50 34 20 2a 0a 2a  k P1 * P3 P4 *.*
2beb0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f 76 65  * Synopsis: Move
2bec0 20 50 33 20 74 6f 20 50 31 2e 72 6f 77 69 64 20   P3 to P1.rowid 
2bed0 69 66 20 6e 65 65 64 65 64 0a 2a 2a 0a 2a 2a 20  if needed.**.** 
2bee0 50 31 20 69 73 20 61 6e 20 6f 70 65 6e 20 69 6e  P1 is an open in
2bef0 64 65 78 20 63 75 72 73 6f 72 20 61 6e 64 20 50  dex cursor and P
2bf00 33 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 6e  3 is a cursor on
2bf10 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2bf20 6e 67 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ng.** table.  Th
2bf30 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 61  is opcode does a
2bf40 20 64 65 66 65 72 72 65 64 20 73 65 65 6b 20 6f   deferred seek o
2bf50 66 20 74 68 65 20 50 33 20 74 61 62 6c 65 20 63  f the P3 table c
2bf60 75 72 73 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20  ursor.** to the 
2bf70 72 6f 77 20 74 68 61 74 20 63 6f 72 72 65 73 70  row that corresp
2bf80 6f 6e 64 73 20 74 6f 20 74 68 65 20 63 75 72 72  onds to the curr
2bf90 65 6e 74 20 72 6f 77 20 6f 66 20 50 31 2e 0a 2a  ent row of P1..*
2bfa0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
2bfb0 65 66 65 72 72 65 64 20 73 65 65 6b 2e 20 20 4e  eferred seek.  N
2bfc0 6f 74 68 69 6e 67 20 61 63 74 75 61 6c 6c 79 20  othing actually 
2bfd0 68 61 70 70 65 6e 73 20 75 6e 74 69 6c 0a 2a 2a  happens until.**
2bfe0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   the cursor is u
2bff0 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 72 65  sed to read a re
2c000 63 6f 72 64 2e 20 20 54 68 61 74 20 77 61 79 2c  cord.  That way,
2c010 20 69 66 20 6e 6f 20 72 65 61 64 73 0a 2a 2a 20   if no reads.** 
2c020 6f 63 63 75 72 2c 20 6e 6f 20 75 6e 6e 65 63 65  occur, no unnece
2c030 73 73 61 72 79 20 49 2f 4f 20 68 61 70 70 65 6e  ssary I/O happen
2c040 73 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79 20  s..**.** P4 may 
2c050 62 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  be an array of i
2c060 6e 74 65 67 65 72 73 20 28 74 79 70 65 20 50 34  ntegers (type P4
2c070 5f 49 4e 54 41 52 52 41 59 29 20 63 6f 6e 74 61  _INTARRAY) conta
2c080 69 6e 69 6e 67 0a 2a 2a 20 6f 6e 65 20 65 6e 74  ining.** one ent
2c090 72 79 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ry for each colu
2c0a0 6d 6e 20 69 6e 20 74 68 65 20 50 33 20 74 61 62  mn in the P3 tab
2c0b0 6c 65 2e 20 20 49 66 20 61 72 72 61 79 20 65 6e  le.  If array en
2c0c0 74 72 79 20 61 28 69 29 0a 2a 2a 20 69 73 20 6e  try a(i).** is n
2c0d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 72 65  on-zero, then re
2c0e0 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 28 69  ading column a(i
2c0f0 29 2d 31 20 66 72 6f 6d 20 63 75 72 73 6f 72 20  )-1 from cursor 
2c100 50 33 20 69 73 20 0a 2a 2a 20 65 71 75 69 76 61  P3 is .** equiva
2c110 6c 65 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 69  lent to performi
2c120 6e 67 20 74 68 65 20 64 65 66 65 72 72 65 64 20  ng the deferred 
2c130 73 65 65 6b 20 61 6e 64 20 74 68 65 6e 20 72 65  seek and then re
2c140 61 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 20 0a  ading column i .
2c150 2a 2a 20 66 72 6f 6d 20 50 31 2e 20 20 54 68 69  ** from P1.  Thi
2c160 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2c170 20 73 74 6f 72 65 64 20 69 6e 20 50 33 20 61 6e   stored in P3 an
2c180 64 20 75 73 65 64 20 74 6f 20 72 65 64 69 72 65  d used to redire
2c190 63 74 0a 2a 2a 20 72 65 61 64 73 20 61 67 61 69  ct.** reads agai
2c1a0 6e 73 74 20 50 33 20 6f 76 65 72 20 74 6f 20 50  nst P3 over to P
2c1b0 31 2c 20 74 68 75 73 20 70 6f 73 73 69 62 6c 79  1, thus possibly
2c1c0 20 61 76 6f 69 64 69 6e 67 20 74 68 65 20 6e 65   avoiding the ne
2c1d0 65 64 20 74 6f 0a 2a 2a 20 73 65 65 6b 20 61 6e  ed to.** seek an
2c1e0 64 20 72 65 61 64 20 63 75 72 73 6f 72 20 50 33  d read cursor P3
2c1f0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2c200 49 64 78 52 6f 77 69 64 20 50 31 20 50 32 20 2a  IdxRowid P1 P2 *
2c210 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
2c220 3a 20 72 5b 50 32 5d 3d 72 6f 77 69 64 0a 2a 2a  : r[P2]=rowid.**
2c230 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
2c240 65 67 69 73 74 65 72 20 50 32 20 61 6e 20 69 6e  egister P2 an in
2c250 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
2c260 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c270 20 74 68 65 20 72 65 63 6f 72 64 20 61 74 0a 2a   the record at.*
2c280 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
2c290 20 69 6e 64 65 78 20 6b 65 79 20 70 6f 69 6e 74   index key point
2c2a0 65 64 20 74 6f 20 62 79 20 63 75 72 73 6f 72 20  ed to by cursor 
2c2b0 50 31 2e 20 20 54 68 69 73 20 69 6e 74 65 67 65  P1.  This intege
2c2c0 72 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  r should be.** t
2c2d0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
2c2e0 74 61 62 6c 65 20 65 6e 74 72 79 20 74 6f 20 77  table entry to w
2c2f0 68 69 63 68 20 74 68 69 73 20 69 6e 64 65 78 20  hich this index 
2c300 65 6e 74 72 79 20 70 6f 69 6e 74 73 2e 0a 2a 2a  entry points..**
2c310 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 52 6f  .** See also: Ro
2c320 77 69 64 2c 20 4d 61 6b 65 52 65 63 6f 72 64 2e  wid, MakeRecord.
2c330 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 66 65  .*/.case OP_Defe
2c340 72 72 65 64 53 65 65 6b 3a 0a 63 61 73 65 20 4f  rredSeek:.case O
2c350 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20  P_IdxRowid: {   
2c360 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20          /* out2 
2c370 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
2c380 2a 70 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pC;            
2c390 20 2f 2a 20 54 68 65 20 50 31 20 69 6e 64 65 78   /* The P1 index
2c3a0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 56 64 62   cursor */.  Vdb
2c3b0 65 43 75 72 73 6f 72 20 2a 70 54 61 62 43 75 72  eCursor *pTabCur
2c3c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
2c3d0 50 32 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  P2 table cursor 
2c3e0 28 4f 50 5f 44 65 66 65 72 72 65 64 53 65 65 6b  (OP_DeferredSeek
2c3f0 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34 20   only) */.  i64 
2c400 72 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  rowid;          
2c410 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2c420 20 74 68 61 74 20 50 31 20 63 75 72 72 65 6e 74   that P1 current
2c430 20 70 6f 69 6e 74 73 20 74 6f 20 2a 2f 0a 0a 20   points to */.. 
2c440 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2c450 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2c460 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2c470 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2c480 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2c490 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2c4a0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
2c4b0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
2c4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2c4d0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
2c4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2c4f0 69 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  isTable==0 );.  
2c500 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
2c510 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
2c520 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 2d 3e  .  assert( !pC->
2c530 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70 4f 70 2d 3e  nullRow || pOp->
2c540 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f  opcode==OP_IdxRo
2c550 77 69 64 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  wid );..  /* The
2c560 20 49 64 78 52 6f 77 69 64 20 61 6e 64 20 53 65   IdxRowid and Se
2c570 65 6b 20 6f 70 63 6f 64 65 73 20 61 72 65 20 63  ek opcodes are c
2c580 6f 6d 62 69 6e 65 64 20 62 65 63 61 75 73 65 20  ombined because 
2c590 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 61 6c 69  of the commonali
2c5a0 74 79 0a 20 20 2a 2a 20 6f 66 20 73 71 6c 69 74  ty.  ** of sqlit
2c5b0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2c5c0 6f 72 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ore() and sqlite
2c5d0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 29 2e  3VdbeIdxRowid().
2c5e0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2c5f0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
2c600 6f 72 65 28 70 43 29 3b 0a 0a 20 20 2f 2a 20 73  ore(pC);..  /* s
2c610 71 6c 69 74 65 33 56 62 65 43 75 72 73 6f 72 52  qlite3VbeCursorR
2c620 65 73 74 6f 72 65 28 29 20 63 61 6e 20 6f 6e 6c  estore() can onl
2c630 79 20 66 61 69 6c 20 69 66 20 74 68 65 20 72 65  y fail if the re
2c640 63 6f 72 64 20 68 61 73 20 62 65 65 6e 20 64 65  cord has been de
2c650 6c 65 74 65 64 0a 20 20 2a 2a 20 6f 75 74 20 66  leted.  ** out f
2c660 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
2c670 72 73 6f 72 2e 20 20 54 68 61 74 20 77 69 6c 6c  rsor.  That will
2c680 20 6e 65 76 65 72 20 68 61 70 70 65 6e 73 20 66   never happens f
2c690 6f 72 20 61 6e 20 49 64 78 52 6f 77 69 64 0a 20  or an IdxRowid. 
2c6a0 20 2a 2a 20 6f 72 20 53 65 65 6b 20 6f 70 63 6f   ** or Seek opco
2c6b0 64 65 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  de */.  if( NEVE
2c6c0 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  R(rc!=SQLITE_OK)
2c6d0 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75   ) goto abort_du
2c6e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 69  e_to_error;..  i
2c6f0 66 28 20 21 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20  f( !pC->nullRow 
2c700 29 7b 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 30  ){.    rowid = 0
2c710 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64  ;  /* Not needed
2c720 2e 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20  .  Only used to 
2c730 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e  silence a warnin
2c740 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2c750 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
2c760 69 64 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 43  id(db, pC->uc.pC
2c770 75 72 73 6f 72 2c 20 26 72 6f 77 69 64 29 3b 0a  ursor, &rowid);.
2c780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2c7a0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2c7b0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
2c7c0 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
2c7d0 65 3d 3d 4f 50 5f 44 65 66 65 72 72 65 64 53 65  e==OP_DeferredSe
2c7e0 65 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ek ){.      asse
2c7f0 72 74 28 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 26  rt( pOp->p3>=0 &
2c800 26 20 70 4f 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75  & pOp->p3<p->nCu
2c810 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 70 54  rsor );.      pT
2c820 61 62 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72  abCur = p->apCsr
2c830 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20  [pOp->p3];.     
2c840 20 61 73 73 65 72 74 28 20 70 54 61 62 43 75 72   assert( pTabCur
2c850 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2c860 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e 65 43  ert( pTabCur->eC
2c870 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
2c880 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 61  BTREE );.      a
2c890 73 73 65 72 74 28 20 70 54 61 62 43 75 72 2d 3e  ssert( pTabCur->
2c8a0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
2c8b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c8c0 54 61 62 43 75 72 2d 3e 69 73 54 61 62 6c 65 20  TabCur->isTable 
2c8d0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  );.      pTabCur
2c8e0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
2c8f0 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6d 6f       pTabCur->mo
2c900 76 65 74 6f 54 61 72 67 65 74 20 3d 20 72 6f 77  vetoTarget = row
2c910 69 64 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75  id;.      pTabCu
2c920 72 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  r->deferredMovet
2c930 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  o = 1;.      ass
2c940 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
2c950 3d 3d 50 34 5f 49 4e 54 41 52 52 41 59 20 7c 7c  ==P4_INTARRAY ||
2c960 20 70 4f 70 2d 3e 70 34 2e 61 69 3d 3d 30 20 29   pOp->p4.ai==0 )
2c970 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72 2d  ;.      pTabCur-
2c980 3e 61 41 6c 74 4d 61 70 20 3d 20 70 4f 70 2d 3e  >aAltMap = pOp->
2c990 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 70 54 61  p4.ai;.      pTa
2c9a0 62 43 75 72 2d 3e 70 41 6c 74 43 75 72 73 6f 72  bCur->pAltCursor
2c9b0 20 3d 20 70 43 3b 0a 20 20 20 20 7d 65 6c 73 65   = pC;.    }else
2c9c0 7b 0a 20 20 20 20 20 20 70 4f 75 74 20 3d 20 6f  {.      pOut = o
2c9d0 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
2c9e0 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 70 4f 75   pOp);.      pOu
2c9f0 74 2d 3e 75 2e 69 20 3d 20 72 6f 77 69 64 3b 0a  t->u.i = rowid;.
2ca00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2ca10 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
2ca20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 52 6f  opcode==OP_IdxRo
2ca30 77 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  wid );.    sqlit
2ca40 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c  e3VdbeMemSetNull
2ca50 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 29  (&aMem[pOp->p2])
2ca60 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
2ca70 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 64 78  ../* Opcode: Idx
2ca80 47 45 20 50 31 20 50 32 20 50 33 20 50 34 20 50  GE P1 P2 P3 P4 P
2ca90 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b  5.** Synopsis: k
2caa0 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a 2a  ey=r[P3@P4].**.*
2cab0 2a 20 54 68 65 20 50 34 20 72 65 67 69 73 74 65  * The P4 registe
2cac0 72 20 76 61 6c 75 65 73 20 62 65 67 69 6e 6e 69  r values beginni
2cad0 6e 67 20 77 69 74 68 20 50 33 20 66 6f 72 6d 20  ng with P3 form 
2cae0 61 6e 20 75 6e 70 61 63 6b 65 64 20 69 6e 64 65  an unpacked inde
2caf0 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61 74 20 6f  x .** key that o
2cb00 6d 69 74 73 20 74 68 65 20 50 52 49 4d 41 52 59  mits the PRIMARY
2cb10 20 4b 45 59 2e 20 20 43 6f 6d 70 61 72 65 20 74   KEY.  Compare t
2cb20 68 69 73 20 6b 65 79 20 76 61 6c 75 65 20 61 67  his key value ag
2cb30 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
2cb40 0a 2a 2a 20 74 68 61 74 20 50 31 20 69 73 20 63  .** that P1 is c
2cb50 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2cb60 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67 20 74  g to, ignoring t
2cb70 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2cb80 72 20 52 4f 57 49 44 20 0a 2a 2a 20 66 69 65 6c  r ROWID .** fiel
2cb90 64 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a  ds at the end..*
2cba0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69  *.** If the P1 i
2cbb0 6e 64 65 78 20 65 6e 74 72 79 20 69 73 20 67 72  ndex entry is gr
2cbc0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
2cbd0 75 61 6c 20 74 6f 20 74 68 65 20 6b 65 79 20 76  ual to the key v
2cbe0 61 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d  alue.** then jum
2cbf0 70 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77  p to P2.  Otherw
2cc00 69 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  ise fall through
2cc10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73   to the next ins
2cc20 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20  truction..*/./* 
2cc30 4f 70 63 6f 64 65 3a 20 49 64 78 47 54 20 50 31  Opcode: IdxGT P1
2cc40 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20   P2 P3 P4 P5.** 
2cc50 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
2cc60 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  P3@P4].**.** The
2cc70 20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c   P4 register val
2cc80 75 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  ues beginning wi
2cc90 74 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e  th P3 form an un
2cca0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a  packed index .**
2ccb0 20 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20   key that omits 
2ccc0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
2ccd0 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b    Compare this k
2cce0 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74  ey value against
2ccf0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74   the index .** t
2cd00 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e  hat P1 is curren
2cd10 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c  tly pointing to,
2cd20 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52   ignoring the PR
2cd30 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57  IMARY KEY or ROW
2cd40 49 44 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74  ID .** fields at
2cd50 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
2cd60 49 66 20 74 68 65 20 50 31 20 69 6e 64 65 78 20  If the P1 index 
2cd70 65 6e 74 72 79 20 69 73 20 67 72 65 61 74 65 72  entry is greater
2cd80 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61   than the key va
2cd90 6c 75 65 0a 2a 2a 20 74 68 65 6e 20 6a 75 6d 70  lue.** then jump
2cda0 20 74 6f 20 50 32 2e 20 20 4f 74 68 65 72 77 69   to P2.  Otherwi
2cdb0 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2cdc0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2cdd0 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  ruction..*/./* O
2cde0 70 63 6f 64 65 3a 20 49 64 78 4c 54 20 50 31 20  pcode: IdxLT P1 
2cdf0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2ce00 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2ce10 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3@P4].**.** The 
2ce20 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  P4 register valu
2ce30 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  es beginning wit
2ce40 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70  h P3 form an unp
2ce50 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20  acked index .** 
2ce60 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74  key that omits t
2ce70 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2ce80 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  r ROWID.  Compar
2ce90 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2cea0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
2ceb0 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73  index that P1 is
2cec0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2ced0 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
2cee0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2cef0 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20   or.** ROWID on 
2cf00 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a  the P1 index..**
2cf10 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2cf20 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73  dex entry is les
2cf30 73 20 74 68 61 6e 20 74 68 65 20 6b 65 79 20 76  s than the key v
2cf40 61 6c 75 65 20 74 68 65 6e 20 6a 75 6d 70 20 74  alue then jump t
2cf50 6f 20 50 32 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o P2..** Otherwi
2cf60 73 65 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  se fall through 
2cf70 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  to the next inst
2cf80 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f  ruction..*/./* O
2cf90 70 63 6f 64 65 3a 20 49 64 78 4c 45 20 50 31 20  pcode: IdxLE P1 
2cfa0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53  P2 P3 P4 P5.** S
2cfb0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
2cfc0 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  3@P4].**.** The 
2cfd0 50 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75  P4 register valu
2cfe0 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  es beginning wit
2cff0 68 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70  h P3 form an unp
2d000 61 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20  acked index .** 
2d010 6b 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74  key that omits t
2d020 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2d030 72 20 52 4f 57 49 44 2e 20 20 43 6f 6d 70 61 72  r ROWID.  Compar
2d040 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75 65  e this key value
2d050 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
2d060 69 6e 64 65 78 20 74 68 61 74 20 50 31 20 69 73  index that P1 is
2d070 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2d080 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69 6e 67  ing to, ignoring
2d090 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
2d0a0 20 6f 72 0a 2a 2a 20 52 4f 57 49 44 20 6f 6e 20   or.** ROWID on 
2d0b0 74 68 65 20 50 31 20 69 6e 64 65 78 2e 0a 2a 2a  the P1 index..**
2d0c0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 69 6e  .** If the P1 in
2d0d0 64 65 78 20 65 6e 74 72 79 20 69 73 20 6c 65 73  dex entry is les
2d0e0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2d0f0 74 6f 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  to the key value
2d100 20 74 68 65 6e 20 6a 75 6d 70 0a 2a 2a 20 74 6f   then jump.** to
2d110 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 20 66   P2. Otherwise f
2d120 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
2d130 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2d140 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ion..*/.case OP_
2d150 49 64 78 4c 45 3a 20 20 20 20 20 20 20 20 20 20  IdxLE:          
2d160 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
2d170 4f 50 5f 49 64 78 47 54 3a 20 20 20 20 20 20 20  OP_IdxGT:       
2d180 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61     /* jump */.ca
2d190 73 65 20 4f 50 5f 49 64 78 4c 54 3a 20 20 20 20  se OP_IdxLT:    
2d1a0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
2d1b0 0a 63 61 73 65 20 4f 50 5f 49 64 78 47 45 3a 20  .case OP_IdxGE: 
2d1c0 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70   {       /* jump
2d1d0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
2d1e0 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73 3b   *pC;.  int res;
2d1f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2d200 64 20 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d r;..  assert( 
2d210 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2d220 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2d230 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2d240 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2d250 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2d260 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
2d270 73 4f 72 64 65 72 65 64 20 29 3b 0a 20 20 61 73  sOrdered );.  as
2d280 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
2d290 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2d2a0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
2d2b0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  C->uc.pCursor!=0
2d2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
2d2d0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
2d2e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d2f0 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
2d300 70 2d 3e 70 35 3d 3d 31 20 29 3b 0a 20 20 61 73  p->p5==1 );.  as
2d310 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70  sert( pOp->p4typ
2d320 65 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20  e==P4_INT32 );. 
2d330 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
2d340 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 72 2e  ->pKeyInfo;.  r.
2d350 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 70 4f  nField = (u16)pO
2d360 70 2d 3e 70 34 2e 69 3b 0a 20 20 69 66 28 20 70  p->p4.i;.  if( p
2d370 4f 70 2d 3e 6f 70 63 6f 64 65 3c 4f 50 5f 49 64  Op->opcode<OP_Id
2d380 78 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72  xLT ){.    asser
2d390 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
2d3a0 4f 50 5f 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d  OP_IdxLE || pOp-
2d3b0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47  >opcode==OP_IdxG
2d3c0 54 20 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75  T );.    r.defau
2d3d0 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65  lt_rc = -1;.  }e
2d3e0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2d3f0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2d400 5f 49 64 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f  _IdxGE || pOp->o
2d410 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20  pcode==OP_IdxLT 
2d420 29 3b 0a 20 20 20 20 72 2e 64 65 66 61 75 6c 74  );.    r.default
2d430 5f 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  _rc = 0;.  }.  r
2d440 2e 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f  .aMem = &aMem[pO
2d450 70 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53  p->p3];.#ifdef S
2d460 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
2d470 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b 20  int i; for(i=0; 
2d480 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  i<r.nField; i++)
2d490 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
2d4a0 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29 20  lid(&r.aMem[i]) 
2d4b0 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  ); }.#endif.  re
2d4c0 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e  s = 0;  /* Not n
2d4d0 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65  eeded.  Only use
2d4e0 64 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77  d to silence a w
2d4f0 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  arning. */.  rc 
2d500 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
2d510 4b 65 79 43 6f 6d 70 61 72 65 28 64 62 2c 20 70  KeyCompare(db, p
2d520 43 2c 20 26 72 2c 20 26 72 65 73 29 3b 0a 20 20  C, &r, &res);.  
2d530 61 73 73 65 72 74 28 20 28 4f 50 5f 49 64 78 4c  assert( (OP_IdxL
2d540 45 26 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26  E&1)==(OP_IdxLT&
2d550 31 29 20 26 26 20 28 4f 50 5f 49 64 78 47 45 26  1) && (OP_IdxGE&
2d560 31 29 3d 3d 28 4f 50 5f 49 64 78 47 54 26 31 29  1)==(OP_IdxGT&1)
2d570 20 29 3b 0a 20 20 69 66 28 20 28 70 4f 70 2d 3e   );.  if( (pOp->
2d580 6f 70 63 6f 64 65 26 31 29 3d 3d 28 4f 50 5f 49  opcode&1)==(OP_I
2d590 64 78 4c 54 26 31 29 20 29 7b 0a 20 20 20 20 61  dxLT&1) ){.    a
2d5a0 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2d5b0 64 65 3d 3d 4f 50 5f 49 64 78 4c 45 20 7c 7c 20  de==OP_IdxLE || 
2d5c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2d5d0 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 72 65 73  IdxLT );.    res
2d5e0 20 3d 20 2d 72 65 73 3b 0a 20 20 7d 65 6c 73 65   = -res;.  }else
2d5f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
2d600 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  p->opcode==OP_Id
2d610 78 47 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f  xGE || pOp->opco
2d620 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  de==OP_IdxGT );.
2d630 20 20 20 20 72 65 73 2b 2b 3b 0a 20 20 7d 0a 20      res++;.  }. 
2d640 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
2d650 28 72 65 73 3e 30 2c 32 29 3b 0a 20 20 69 66 28  (res>0,2);.  if(
2d660 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2d670 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2d680 20 69 66 28 20 72 65 73 3e 30 20 29 20 67 6f 74   if( res>0 ) got
2d690 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
2d6a0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2d6b0 6f 64 65 3a 20 44 65 73 74 72 6f 79 20 50 31 20  ode: Destroy P1 
2d6c0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20  P2 P3 * *.**.** 
2d6d0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
2d6e0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
2d6f0 6f 72 20 69 6e 64 65 78 20 77 68 6f 73 65 20 72  or index whose r
2d700 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2d710 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
2d720 20 69 73 20 67 69 76 65 6e 20 62 79 20 50 31 2e   is given by P1.
2d730 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
2d740 20 62 65 69 6e 67 20 64 65 73 74 72 6f 79 65 64   being destroyed
2d750 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
2d760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
2d770 20 50 33 3d 3d 30 2e 20 20 49 66 0a 2a 2a 20 50   P3==0.  If.** P
2d780 33 3d 3d 31 20 74 68 65 6e 20 74 68 65 20 74 61  3==1 then the ta
2d790 62 6c 65 20 74 6f 20 62 65 20 63 6c 65 61 72 20  ble to be clear 
2d7a0 69 73 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  is in the auxili
2d7b0 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
2d7c0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 75 73 65  e.** that is use
2d7d0 64 20 74 6f 20 73 74 6f 72 65 20 74 61 62 6c 65  d to store table
2d7e0 73 20 63 72 65 61 74 65 20 75 73 69 6e 67 20 43  s create using C
2d7f0 52 45 41 54 45 20 54 45 4d 50 4f 52 41 52 59 20  REATE TEMPORARY 
2d800 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TABLE..**.** If 
2d810 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2d820 61 62 6c 65 64 20 74 68 65 6e 20 69 74 20 69 73  abled then it is
2d830 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 61   possible that a
2d840 6e 6f 74 68 65 72 20 72 6f 6f 74 20 70 61 67 65  nother root page
2d850 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 6d 6f 76  .** might be mov
2d860 65 64 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 6c  ed into the newl
2d870 79 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 20 70  y deleted root p
2d880 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
2d890 6b 65 65 70 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  keep all.** root
2d8a0 20 70 61 67 65 73 20 63 6f 6e 74 69 67 75 6f 75   pages contiguou
2d8b0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
2d8c0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
2d8d0 73 65 2e 20 20 54 68 65 20 66 6f 72 6d 65 72 0a  se.  The former.
2d8e0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
2d8f0 72 6f 6f 74 20 70 61 67 65 20 74 68 61 74 20 6d  root page that m
2d900 6f 76 65 64 20 2d 20 69 74 73 20 76 61 6c 75 65  oved - its value
2d910 20 62 65 66 6f 72 65 20 74 68 65 20 6d 6f 76 65   before the move
2d920 20 6f 63 63 75 72 72 65 64 20 2d 0a 2a 2a 20 69   occurred -.** i
2d930 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
2d940 73 74 65 72 20 50 32 2e 20 49 66 20 6e 6f 20 70  ster P2. If no p
2d950 61 67 65 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73  age movement was
2d960 20 72 65 71 75 69 72 65 64 20 28 62 65 63 61 75   required (becau
2d970 73 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  se the.** table 
2d980 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 77 61  being dropped wa
2d990 73 20 61 6c 72 65 61 64 79 20 74 68 65 20 6c 61  s already the la
2d9a0 73 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61  st one in the da
2d9b0 74 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 0a  tabase) then a .
2d9c0 2a 2a 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65  ** zero is store
2d9d0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
2d9e0 2e 20 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  .  If AUTOVACUUM
2d9f0 20 69 73 20 64 69 73 61 62 6c 65 64 20 74 68 65   is disabled the
2da00 6e 20 61 20 7a 65 72 6f 20 0a 2a 2a 20 69 73 20  n a zero .** is 
2da10 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74  stored in regist
2da20 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
2da30 73 20 6f 70 63 6f 64 65 20 74 68 72 6f 77 73 20  s opcode throws 
2da40 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 72  an error if ther
2da50 65 20 61 72 65 20 61 6e 79 20 61 63 74 69 76 65  e are any active
2da60 20 72 65 61 64 65 72 20 56 4d 73 20 77 68 65 6e   reader VMs when
2da70 0a 2a 2a 20 69 74 20 69 73 20 69 6e 76 6f 6b 65  .** it is invoke
2da80 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
2da90 74 6f 20 61 76 6f 69 64 20 74 68 65 20 64 69 66  to avoid the dif
2daa0 66 69 63 75 6c 74 79 20 61 73 73 6f 63 69 61 74  ficulty associat
2dab0 65 64 20 77 69 74 68 20 0a 2a 2a 20 75 70 64 61  ed with .** upda
2dac0 74 69 6e 67 20 65 78 69 73 74 69 6e 67 20 63 75  ting existing cu
2dad0 72 73 6f 72 73 20 77 68 65 6e 20 61 20 72 6f 6f  rsors when a roo
2dae0 74 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  t page is moved 
2daf0 69 6e 20 61 6e 20 41 55 54 4f 56 41 43 55 55 4d  in an AUTOVACUUM
2db00 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
2db10 68 69 73 20 65 72 72 6f 72 20 69 73 20 74 68 72  his error is thr
2db20 6f 77 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20  own even if the 
2db30 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
2db40 61 6e 20 41 55 54 4f 56 41 43 55 55 4d 20 0a 2a  an AUTOVACUUM .*
2db50 2a 20 64 62 20 69 6e 20 6f 72 64 65 72 20 74 6f  * db in order to
2db60 20 61 76 6f 69 64 20 69 6e 74 72 6f 64 75 63 69   avoid introduci
2db70 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
2db80 69 6c 69 74 79 20 62 65 74 77 65 65 6e 20 61 75  ility between au
2db90 74 6f 76 61 63 75 75 6d 20 0a 2a 2a 20 61 6e 64  tovacuum .** and
2dba0 20 6e 6f 6e 2d 61 75 74 6f 76 61 63 75 75 6d 20   non-autovacuum 
2dbb0 6d 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  modes..**.** See
2dbc0 20 61 6c 73 6f 3a 20 43 6c 65 61 72 0a 2a 2f 0a   also: Clear.*/.
2dbd0 63 61 73 65 20 4f 50 5f 44 65 73 74 72 6f 79 3a  case OP_Destroy:
2dbe0 20 7b 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a   {     /* out2 *
2dbf0 2f 0a 20 20 69 6e 74 20 69 4d 6f 76 65 64 3b 0a  /.  int iMoved;.
2dc00 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 73 71    int iDb;..  sq
2dc10 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57 72 69  lite3VdbeIncrWri
2dc20 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30 29 3b  teCounter(p, 0);
2dc30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
2dc40 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
2dc50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 31  ssert( pOp->p1>1
2dc60 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74   );.  pOut = out
2dc70 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70  2Prerelease(p, p
2dc80 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  Op);.  pOut->fla
2dc90 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
2dca0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 52 65   if( db->nVdbeRe
2dcb0 61 64 20 3e 20 64 62 2d 3e 6e 56 44 65 73 74 72  ad > db->nVDestr
2dcc0 6f 79 2b 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  oy+1 ){.    rc =
2dcd0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
2dce0 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
2dcf0 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
2dd00 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
2dd10 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 65  e_to_error;.  }e
2dd20 6c 73 65 7b 0a 20 20 20 20 69 44 62 20 3d 20 70  lse{.    iDb = p
2dd30 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 61 73 73 65  Op->p3;.    asse
2dd40 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  rt( DbMaskTest(p
2dd50 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44 62  ->btreeMask, iDb
2dd60 29 20 29 3b 0a 20 20 20 20 69 4d 6f 76 65 64 20  ) );.    iMoved 
2dd70 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65 65  = 0;  /* Not nee
2dd80 64 65 64 2e 20 20 4f 6e 6c 79 20 74 6f 20 73 69  ded.  Only to si
2dd90 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e  lence a warning.
2dda0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2ddb0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
2ddc0 6c 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  le(db->aDb[iDb].
2ddd0 70 42 74 2c 20 70 4f 70 2d 3e 70 31 2c 20 26 69  pBt, pOp->p1, &i
2dde0 4d 6f 76 65 64 29 3b 0a 20 20 20 20 70 4f 75 74  Moved);.    pOut
2ddf0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
2de00 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  t;.    pOut->u.i
2de10 20 3d 20 69 4d 6f 76 65 64 3b 0a 20 20 20 20 69   = iMoved;.    i
2de20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
2de30 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
2de40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2de50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2de60 20 20 20 20 69 66 28 20 69 4d 6f 76 65 64 21 3d      if( iMoved!=
2de70 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2de80 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
2de90 64 62 2c 20 69 44 62 2c 20 69 4d 6f 76 65 64 2c  db, iDb, iMoved,
2dea0 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20 20   pOp->p1);.     
2deb0 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44 65 73 74 72   /* All OP_Destr
2dec0 6f 79 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  oy operations oc
2ded0 63 75 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  cur on the same 
2dee0 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 61  btree */.      a
2def0 73 73 65 72 74 28 20 72 65 73 65 74 53 63 68 65  ssert( resetSche
2df00 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30 20 7c 7c 20  maOnFault==0 || 
2df10 72 65 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75  resetSchemaOnFau
2df20 6c 74 3d 3d 69 44 62 2b 31 20 29 3b 0a 20 20 20  lt==iDb+1 );.   
2df30 20 20 20 72 65 73 65 74 53 63 68 65 6d 61 4f 6e     resetSchemaOn
2df40 46 61 75 6c 74 20 3d 20 69 44 62 2b 31 3b 0a 20  Fault = iDb+1;. 
2df50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2df60 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
2df70 70 63 6f 64 65 3a 20 43 6c 65 61 72 20 50 31 20  pcode: Clear P1 
2df80 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  P2 P3.**.** Dele
2df90 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 73 20  te all contents 
2dfa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2dfb0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 77  table or index w
2dfc0 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a  hose root page.*
2dfd0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2dfe0 65 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  e file is given 
2dff0 62 79 20 50 31 2e 20 20 42 75 74 2c 20 75 6e 6c  by P1.  But, unl
2e000 69 6b 65 20 44 65 73 74 72 6f 79 2c 20 64 6f 20  ike Destroy, do 
2e010 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  not.** remove th
2e020 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
2e030 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e040 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2e050 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63  he table being c
2e060 6c 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 6d  lear is in the m
2e070 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2e080 65 20 69 66 20 50 32 3d 3d 30 2e 20 20 49 66 0a  e if P2==0.  If.
2e090 2a 2a 20 50 32 3d 3d 31 20 74 68 65 6e 20 74 68  ** P2==1 then th
2e0a0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 63 6c  e table to be cl
2e0b0 65 61 72 20 69 73 20 69 6e 20 74 68 65 20 61 75  ear is in the au
2e0c0 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2e0d0 20 66 69 6c 65 0a 2a 2a 20 74 68 61 74 20 69 73   file.** that is
2e0e0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2e0f0 61 62 6c 65 73 20 63 72 65 61 74 65 20 75 73 69  ables create usi
2e100 6e 67 20 43 52 45 41 54 45 20 54 45 4d 50 4f 52  ng CREATE TEMPOR
2e110 41 52 59 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  ARY TABLE..**.**
2e120 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
2e130 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2e140 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  en the table ref
2e150 65 72 72 65 64 20 74 6f 20 6d 75 73 74 20 62 65  erred to must be
2e160 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 74 61   an.** intkey ta
2e170 62 6c 65 20 28 61 6e 20 53 51 4c 20 74 61 62 6c  ble (an SQL tabl
2e180 65 2c 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 29  e, not an index)
2e190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2e1a0 68 65 20 72 6f 77 20 63 68 61 6e 67 65 20 0a 2a  he row change .*
2e1b0 2a 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65  * count is incre
2e1c0 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75  mented by the nu
2e1d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
2e1e0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
2e1f0 63 6c 65 61 72 65 64 2e 20 0a 2a 2a 20 49 66 20  cleared. .** If 
2e200 50 33 20 69 73 20 67 72 65 61 74 65 72 20 74 68  P3 is greater th
2e210 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
2e220 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
2e230 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73  n register P3 is
2e240 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63 72 65 6d 65  .** also increme
2e250 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  nted by the numb
2e260 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2e270 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 63 6c  e table being cl
2e280 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  eared..**.** See
2e290 20 61 6c 73 6f 3a 20 44 65 73 74 72 6f 79 0a 2a   also: Destroy.*
2e2a0 2f 0a 63 61 73 65 20 4f 50 5f 43 6c 65 61 72 3a  /.case OP_Clear:
2e2b0 20 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65   {.  int nChange
2e2c0 3b 0a 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ;. .  sqlite3Vdb
2e2d0 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 65  eIncrWriteCounte
2e2e0 72 28 70 2c 20 30 29 3b 0a 20 20 6e 43 68 61 6e  r(p, 0);.  nChan
2e2f0 67 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ge = 0;.  assert
2e300 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
2e310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
2e320 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
2e330 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 32 29 20  eMask, pOp->p2) 
2e340 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2e350 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
2e360 28 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  (.      db->aDb[
2e370 70 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f  pOp->p2].pBt, pO
2e380 70 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20  p->p1, (pOp->p3 
2e390 3f 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a  ? &nChange : 0).
2e3a0 20 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e    );.  if( pOp->
2e3b0 70 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68  p3 ){.    p->nCh
2e3c0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
2e3d0 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  .    if( pOp->p3
2e3e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >0 ){.      asse
2e3f0 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26  rt( memIsValid(&
2e400 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29  aMem[pOp->p3]) )
2e410 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74  ;.      memAbout
2e420 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65  ToChange(p, &aMe
2e430 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20  m[pOp->p3]);.   
2e440 20 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d     aMem[pOp->p3]
2e450 2e 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  .u.i += nChange;
2e460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2e470 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2e480 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2e490 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2e4a0 63 6f 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65  code: ResetSorte
2e4b0 72 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a  r P1 * * * *.**.
2e4c0 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f  ** Delete all co
2e4d0 6e 74 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ntents from the 
2e4e0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2e4f0 6f 72 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61  or sorter.** tha
2e500 74 20 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72  t is open on cur
2e510 73 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  sor P1..**.** Th
2e520 69 73 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77  is opcode only w
2e530 6f 72 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73  orks for cursors
2e540 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
2e550 67 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20  g and.** opened 
2e560 77 69 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65  with OP_OpenEphe
2e570 6d 65 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74  meral or OP_Sort
2e580 65 72 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20  erOpen..*/.case 
2e590 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20  OP_ResetSorter: 
2e5a0 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  {.  VdbeCursor *
2e5b0 70 43 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  pC;. .  assert( 
2e5c0 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
2e5d0 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
2e5e0 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
2e5f0 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
2e600 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b  assert( pC!=0 );
2e610 0a 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28  .  if( isSorter(
2e620 70 43 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC) ){.    sqlit
2e630 65 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65  e3VdbeSorterRese
2e640 74 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 53 6f  t(db, pC->uc.pSo
2e650 72 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rter);.  }else{.
2e660 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
2e670 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
2e680 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61  E_BTREE );.    a
2e690 73 73 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68  ssert( pC->isEph
2e6a0 65 6d 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63  emeral );.    rc
2e6b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
2e6c0 6c 65 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f  learTableOfCurso
2e6d0 72 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  r(pC->uc.pCursor
2e6e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2e6f0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2e700 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62  o_error;.  }.  b
2e710 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2e720 64 65 3a 20 43 72 65 61 74 65 42 74 72 65 65 20  de: CreateBtree 
2e730 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20  P1 P2 P3 * *.** 
2e740 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2e750 72 6f 6f 74 20 69 44 62 3d 50 31 20 66 6c 61 67  root iDb=P1 flag
2e760 73 3d 50 33 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63  s=P3.**.** Alloc
2e770 61 74 65 20 61 20 6e 65 77 20 62 2d 74 72 65 65  ate a new b-tree
2e780 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
2e790 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 50 31  abase file if P1
2e7a0 3d 3d 30 20 6f 72 20 69 6e 20 74 68 65 0a 2a 2a  ==0 or in the.**
2e7b0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 66   TEMP database f
2e7c0 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20  ile if P1==1 or 
2e7d0 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  in an attached d
2e7e0 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31  atabase if.** P1
2e7f0 3e 31 2e 20 20 54 68 65 20 50 33 20 61 72 67 75  >1.  The P3 argu
2e800 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 28  ment must be 1 (
2e810 42 54 52 45 45 5f 49 4e 54 4b 45 59 29 20 66 6f  BTREE_INTKEY) fo
2e820 72 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 0a  r a rowid table.
2e830 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 32 20  ** it must be 2 
2e840 28 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 20  (BTREE_BLOBKEY) 
2e850 66 6f 72 20 61 20 69 6e 64 65 78 20 6f 72 20 57  for a index or W
2e860 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
2e870 6c 65 2e 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  le..** The root 
2e880 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2e890 68 65 20 6e 65 77 20 62 2d 74 72 65 65 20 69 73  he new b-tree is
2e8a0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
2e8b0 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ter P2..*/.case 
2e8c0 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 3a 20  OP_CreateBtree: 
2e8d0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75  {          /* ou
2e8e0 74 32 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f  t2 */.  int pgno
2e8f0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
2e900 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
2e910 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30  riteCounter(p, 0
2e920 29 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  );.  pOut = out2
2e930 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
2e940 70 29 3b 0a 20 20 70 67 6e 6f 20 3d 20 30 3b 0a  p);.  pgno = 0;.
2e950 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2e960 33 3d 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  3==BTREE_INTKEY 
2e970 7c 7c 20 70 4f 70 2d 3e 70 33 3d 3d 42 54 52 45  || pOp->p3==BTRE
2e980 45 5f 42 4c 4f 42 4b 45 59 20 29 3b 0a 20 20 61  E_BLOBKEY );.  a
2e990 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2e9a0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
2e9b0 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
2e9c0 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  ( DbMaskTest(p->
2e9d0 62 74 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e  btreeMask, pOp->
2e9e0 70 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p1) );.  assert(
2e9f0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
2ea00 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
2ea10 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  aDb[pOp->p1];.  
2ea20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 42 74  assert( pDb->pBt
2ea30 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  !=0 );.  rc = sq
2ea40 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2ea50 54 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c 20  Table(pDb->pBt, 
2ea60 26 70 67 6e 6f 2c 20 70 4f 70 2d 3e 70 33 29 3b  &pgno, pOp->p3);
2ea70 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2ea80 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2ea90 72 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  ror;.  pOut->u.i
2eaa0 20 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b   = pgno;.  break
2eab0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2eac0 53 71 6c 45 78 65 63 20 2a 20 2a 20 2a 20 50 34  SqlExec * * * P4
2ead0 20 2a 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 74 68 65   *.**.** Run the
2eae0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6f   SQL statement o
2eaf0 72 20 73 74 61 74 65 6d 65 6e 74 73 20 73 70 65  r statements spe
2eb00 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 50 34  cified in the P4
2eb10 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 61 73 65   string..*/.case
2eb20 20 4f 50 5f 53 71 6c 45 78 65 63 3a 20 7b 0a 20   OP_SqlExec: {. 
2eb30 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72   sqlite3VdbeIncr
2eb40 57 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20  WriteCounter(p, 
2eb50 30 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45 78  0);.  db->nSqlEx
2eb60 65 63 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ec++;.  rc = sql
2eb70 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 70 4f  ite3_exec(db, pO
2eb80 70 2d 3e 70 34 2e 7a 2c 20 30 2c 20 30 2c 20 30  p->p4.z, 0, 0, 0
2eb90 29 3b 0a 20 20 64 62 2d 3e 6e 53 71 6c 45 78 65  );.  db->nSqlExe
2eba0 63 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c--;.  if( rc ) 
2ebb0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
2ebc0 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b  o_error;.  break
2ebd0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
2ebe0 50 61 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a  ParseSchema P1 *
2ebf0 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65   * P4 *.**.** Re
2ec00 61 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c  ad and parse all
2ec10 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
2ec20 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
2ec30 74 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73  table of databas
2ec40 65 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74  e P1.** that mat
2ec50 63 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ch the WHERE cla
2ec60 75 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54  use P4. .**.** T
2ec70 68 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b  his opcode invok
2ec80 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  es the parser to
2ec90 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
2eca0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a  rtual machine,.*
2ecb0 2a 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20  * then runs the 
2ecc0 6e 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68  new virtual mach
2ecd0 69 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75 73  ine.  It is thus
2ece0 20 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70   a re-entrant op
2ecf0 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  code..*/.case OP
2ed00 5f 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a  _ParseSchema: {.
2ed10 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e    int iDb;.  con
2ed20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
2ed30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2ed40 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44    InitData initD
2ed50 61 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70  ata;..  /* Any p
2ed60 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2ed70 74 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74  t that invokes t
2ed80 68 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20  his opcode will 
2ed90 68 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a  hold mutexes.  *
2eda0 2a 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  * on every btree
2edb0 2e 20 20 54 68 69 73 20 69 73 20 61 20 70 72 65  .  This is a pre
2edc0 72 65 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e  requisite for in
2edd0 76 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c  voking .  ** sql
2ede0 69 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b  ite3InitCallback
2edf0 28 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ()..  */.#ifdef 
2ee00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
2ee10 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
2ee20 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
2ee30 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d     assert( iDb==
2ee40 31 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  1 || sqlite3Btre
2ee50 65 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e  eHoldsMutex(db->
2ee60 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b  aDb[iDb].pBt) );
2ee70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2ee80 44 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  Db = pOp->p1;.  
2ee90 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
2eea0 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
2eeb0 0a 20 20 61 73 73 65 72 74 28 20 44 62 48 61 73  .  assert( DbHas
2eec0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
2eed0 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
2eee0 64 29 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20  d) );.  /* Used 
2eef0 74 6f 20 62 65 20 61 20 63 6f 6e 64 69 74 69 6f  to be a conditio
2ef00 6e 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61  nal */ {.    zMa
2ef10 73 74 65 72 20 3d 20 4d 41 53 54 45 52 5f 4e 41  ster = MASTER_NA
2ef20 4d 45 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61  ME;.    initData
2ef30 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e  .db = db;.    in
2ef40 69 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70  itData.iDb = pOp
2ef50 2d 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61  ->p1;.    initDa
2ef60 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70  ta.pzErrMsg = &p
2ef70 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a  ->zErrMsg;.    z
2ef80 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Sql = sqlite3MPr
2ef90 69 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20  intf(db,.       
2efa0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f  "SELECT name, ro
2efb0 6f 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d  otpage, sql FROM
2efc0 20 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25   '%q'.%s WHERE %
2efd0 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  s ORDER BY rowid
2efe0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
2eff0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
2f000 20 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70   zMaster, pOp->p
2f010 34 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  4.z);.    if( zS
2f020 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
2f030 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2f040 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2f050 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2f060 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
2f070 20 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e   );.      db->in
2f080 69 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  it.busy = 1;.   
2f090 20 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d     initData.rc =
2f0a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f0b0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
2f0c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2f0d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f0e0 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
2f0f0 20 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c   sqlite3InitCall
2f100 62 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c  back, &initData,
2f110 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2f120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
2f130 63 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b  c = initData.rc;
2f140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2f150 46 72 65 65 4e 4e 28 64 62 2c 20 7a 53 71 6c 29  FreeNN(db, zSql)
2f160 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74  ;.      db->init
2f170 2e 62 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d  .busy = 0;.    }
2f180 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b  .  }.  if( rc ){
2f190 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
2f1a0 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
2f1b0 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
2f1c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f1d0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 67  NOMEM ){.      g
2f1e0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20  oto no_mem;.    
2f1f0 7d 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74  }.    goto abort
2f200 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2f210 20 7d 0a 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a   }.  break;  .}.
2f220 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2f230 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
2f240 45 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f  E)./* Opcode: Lo
2f250 61 64 41 6e 61 6c 79 73 69 73 20 50 31 20 2a 20  adAnalysis P1 * 
2f260 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64  * * *.**.** Read
2f270 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
2f280 31 20 74 61 62 6c 65 20 66 6f 72 20 64 61 74 61  1 table for data
2f290 62 61 73 65 20 50 31 20 61 6e 64 20 6c 6f 61 64  base P1 and load
2f2a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
2f2b0 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 6e  of that table in
2f2c0 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
2f2d0 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2f2e0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
2f2f0 73 65 0a 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73  se.** the analys
2f300 69 73 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  is to be used wh
2f310 65 6e 20 70 72 65 70 61 72 69 6e 67 20 61 6c 6c  en preparing all
2f320 20 73 75 62 73 65 71 75 65 6e 74 20 71 75 65 72   subsequent quer
2f330 69 65 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ies..*/.case OP_
2f340 4c 6f 61 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a  LoadAnalysis: {.
2f350 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
2f360 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
2f370 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20  db->nDb );.  rc 
2f380 3d 20 73 71 6c 69 74 65 33 41 6e 61 6c 79 73 69  = sqlite3Analysi
2f390 73 4c 6f 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70  sLoad(db, pOp->p
2f3a0 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
2f3b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2f3c0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
2f3d0 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
2f3e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2f3f0 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a  MIT_ANALYZE) */.
2f400 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70  ./* Opcode: Drop
2f410 54 61 62 6c 65 20 50 31 20 2a 20 2a 20 50 34 20  Table P1 * * P4 
2f420 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  *.**.** Remove t
2f430 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d  he internal (in-
2f440 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72  memory) data str
2f450 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73  uctures that des
2f460 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 61 62  cribe.** the tab
2f470 6c 65 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64  le named P4 in d
2f480 61 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69  atabase P1.  Thi
2f490 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
2f4a0 72 20 61 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20  r a table.** is 
2f4b0 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73  dropped from dis
2f4c0 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73  k (using the Des
2f4d0 74 72 6f 79 20 6f 70 63 6f 64 65 29 20 69 6e 20  troy opcode) in 
2f4e0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a  order to keep .*
2f4f0 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72  * the internal r
2f500 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2f510 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63   the.** schema c
2f520 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77  onsistent with w
2f530 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a  hat is on disk..
2f540 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 54  */.case OP_DropT
2f550 61 62 6c 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65  able: {.  sqlite
2f560 33 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f  3VdbeIncrWriteCo
2f570 75 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 73  unter(p, 0);.  s
2f580 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
2f590 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
2f5a0 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e  Op->p1, pOp->p4.
2f5b0 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  z);.  break;.}..
2f5c0 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 49  /* Opcode: DropI
2f5d0 6e 64 65 78 20 50 31 20 2a 20 2a 20 50 34 20 2a  ndex P1 * * P4 *
2f5e0 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
2f5f0 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d  e internal (in-m
2f600 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72 75  emory) data stru
2f610 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73 63  ctures that desc
2f620 72 69 62 65 0a 2a 2a 20 74 68 65 20 69 6e 64 65  ribe.** the inde
2f630 78 20 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61  x named P4 in da
2f640 74 61 62 61 73 65 20 50 31 2e 20 20 54 68 69 73  tabase P1.  This
2f650 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2f660 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 73 20   an index.** is 
2f670 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 64 69 73  dropped from dis
2f680 6b 20 28 75 73 69 6e 67 20 74 68 65 20 44 65 73  k (using the Des
2f690 74 72 6f 79 20 6f 70 63 6f 64 65 29 0a 2a 2a 20  troy opcode).** 
2f6a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
2f6b0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65   the internal re
2f6c0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2f6d0 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f  the.** schema co
2f6e0 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 77 68  nsistent with wh
2f6f0 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  at is on disk..*
2f700 2f 0a 63 61 73 65 20 4f 50 5f 44 72 6f 70 49 6e  /.case OP_DropIn
2f710 64 65 78 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33  dex: {.  sqlite3
2f720 56 64 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75  VdbeIncrWriteCou
2f730 6e 74 65 72 28 70 2c 20 30 29 3b 0a 20 20 73 71  nter(p, 0);.  sq
2f740 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
2f750 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20 70 4f  leteIndex(db, pO
2f760 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 34 2e 7a  p->p1, pOp->p4.z
2f770 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  );.  break;.}../
2f780 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 72  * Opcode: DropTr
2f790 69 67 67 65 72 20 50 31 20 2a 20 2a 20 50 34 20  igger P1 * * P4 
2f7a0 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  *.**.** Remove t
2f7b0 68 65 20 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d  he internal (in-
2f7c0 6d 65 6d 6f 72 79 29 20 64 61 74 61 20 73 74 72  memory) data str
2f7d0 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73  uctures that des
2f7e0 63 72 69 62 65 0a 2a 2a 20 74 68 65 20 74 72 69  cribe.** the tri
2f7f0 67 67 65 72 20 6e 61 6d 65 64 20 50 34 20 69 6e  gger named P4 in
2f800 20 64 61 74 61 62 61 73 65 20 50 31 2e 20 20 54   database P1.  T
2f810 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
2f820 74 65 72 20 61 20 74 72 69 67 67 65 72 0a 2a 2a  ter a trigger.**
2f830 20 69 73 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   is dropped from
2f840 20 64 69 73 6b 20 28 75 73 69 6e 67 20 74 68 65   disk (using the
2f850 20 44 65 73 74 72 6f 79 20 6f 70 63 6f 64 65 29   Destroy opcode)
2f860 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
2f870 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e  p .** the intern
2f880 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
2f890 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 63 68 65  n of the.** sche
2f8a0 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69  ma consistent wi
2f8b0 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
2f8c0 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  sk..*/.case OP_D
2f8d0 72 6f 70 54 72 69 67 67 65 72 3a 20 7b 0a 20 20  ropTrigger: {.  
2f8e0 73 71 6c 69 74 65 33 56 64 62 65 49 6e 63 72 57  sqlite3VdbeIncrW
2f8f0 72 69 74 65 43 6f 75 6e 74 65 72 28 70 2c 20 30  riteCounter(p, 0
2f900 29 3b 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69  );.  sqlite3Unli
2f910 6e 6b 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67  nkAndDeleteTrigg
2f920 65 72 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  er(db, pOp->p1, 
2f930 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
2f940 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  eak;.}...#ifndef
2f950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
2f960 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20  EGRITY_CHECK./* 
2f970 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74  Opcode: Integrit
2f980 79 43 6b 20 50 31 20 50 32 20 50 33 20 50 34 20  yCk P1 P2 P3 P4 
2f990 50 35 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61  P5.**.** Do an a
2f9a0 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63  nalysis of the c
2f9b0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61  urrently open da
2f9c0 74 61 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69  tabase.  Store i
2f9d0 6e 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31  n.** register P1
2f9e0 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20   the text of an 
2f9f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65  error message de
2fa00 73 63 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f  scribing any pro
2fa10 62 6c 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  blems..** If no 
2fa20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
2fa30 6e 64 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c  nd, store a NULL
2fa40 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e   in register P1.
2fa50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73  .**.** The regis
2fa60 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20  ter P3 contains 
2fa70 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68  one less than th
2fa80 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2fa90 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f   of allowed erro
2faa0 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72  rs..** At most r
2fab0 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69  eg(P3) errors wi
2fac0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a  ll be reported..
2fad0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
2fae0 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  s, the analysis 
2faf0 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73  stops as soon as
2fb00 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20   reg(P1) errors 
2fb10 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52  are .** seen.  R
2fb20 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65  eg(P1) is update
2fb30 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65  d with the numbe
2fb40 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61  r of errors rema
2fb50 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ining..**.** The
2fb60 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
2fb70 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  rs of all tables
2fb80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fb90 20 61 72 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   are integers.**
2fba0 20 73 74 6f 72 65 64 20 69 6e 20 50 34 5f 49 4e   stored in P4_IN
2fbb0 54 41 52 52 41 59 20 61 72 67 75 6d 65 6e 74 2e  TARRAY argument.
2fbc0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
2fbd0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20 63 68  not zero, the ch
2fbe0 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74  eck is done on t
2fbf0 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2fc00 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e  abase.** file, n
2fc10 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ot the main data
2fc20 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2fc30 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
2fc40 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
2fc50 74 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 5f  t the integrity_
2fc60 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f  check pragma..*/
2fc70 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 72 69  .case OP_Integri
2fc80 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52  tyCk: {.  int nR
2fc90 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  oot;      /* Num
2fca0 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ber of tables to
2fcb0 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72   check.  (Number
2fcc0 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 2e 29   of root pages.)
2fcd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
2fce0 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fcf0 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  f rootpage numbe
2fd00 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  rs for tables to
2fd10 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
2fd20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
2fd30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
2fd40 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f  rors reported */
2fd50 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
2fd60 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
2fd70 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a  e error report *
2fd80 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20  /.  Mem *pnErr; 
2fd90 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
2fda0 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
2fdb0 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
2fdc0 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
2fdd0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
2fde0 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70    nRoot = pOp->p
2fdf0 32 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 70 4f 70  2;.  aRoot = pOp
2fe00 2d 3e 70 34 2e 61 69 3b 0a 20 20 61 73 73 65 72  ->p4.ai;.  asser
2fe10 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20  t( nRoot>0 );.  
2fe20 61 73 73 65 72 74 28 20 61 52 6f 6f 74 5b 30 5d  assert( aRoot[0]
2fe30 3d 3d 6e 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73  ==nRoot );.  ass
2fe40 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
2fe50 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
2fe60 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
2fe70 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72 72 20 3d  or) );.  pnErr =
2fe80 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2fe90 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72  .  assert( (pnEr
2fea0 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  r->flags & MEM_I
2feb0 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  nt)!=0 );.  asse
2fec0 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67  rt( (pnErr->flag
2fed0 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2fee0 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20  _Blob))==0 );.  
2fef0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
2ff00 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2ff10 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62   pOp->p5<db->nDb
2ff20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
2ff30 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
2ff40 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 35 29 20  eMask, pOp->p5) 
2ff50 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
2ff60 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68  BtreeIntegrityCh
2ff70 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  eck(db->aDb[pOp-
2ff80 3e 70 35 5d 2e 70 42 74 2c 20 26 61 52 6f 6f 74  >p5].pBt, &aRoot
2ff90 5b 31 5d 2c 20 6e 52 6f 6f 74 2c 0a 20 20 20 20  [1], nRoot,.    
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
2ffc0 74 29 70 6e 45 72 72 2d 3e 75 2e 69 2b 31 2c 20  t)pnErr->u.i+1, 
2ffd0 26 6e 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &nErr);.  sqlite
2ffe0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2fff0 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72  pIn1);.  if( nEr
30000 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  r==0 ){.    asse
30010 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65  rt( z==0 );.  }e
30020 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  lse if( z==0 ){.
30030 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
30040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 6e  .  }else{.    pn
30050 45 72 72 2d 3e 75 2e 69 20 2d 3d 20 6e 45 72 72  Err->u.i -= nErr
30060 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  -1;.    sqlite3V
30070 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 49 6e  dbeMemSetStr(pIn
30080 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  1, z, -1, SQLITE
30090 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 5f 66  _UTF8, sqlite3_f
300a0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 55 50 44 41  ree);.  }.  UPDA
300b0 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28  TE_MAX_BLOBSIZE(
300c0 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
300d0 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69  VdbeChangeEncodi
300e0 6e 67 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69 6e  ng(pIn1, encodin
300f0 67 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23  g);.  break;.}.#
30100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
30110 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
30120 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  HECK */../* Opco
30130 64 65 3a 20 52 6f 77 53 65 74 41 64 64 20 50 31  de: RowSetAdd P1
30140 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
30150 6f 70 73 69 73 3a 20 72 6f 77 73 65 74 28 50 31  opsis: rowset(P1
30160 29 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 49 6e  )=r[P2].**.** In
30170 73 65 72 74 20 74 68 65 20 69 6e 74 65 67 65 72  sert the integer
30180 20 76 61 6c 75 65 20 68 65 6c 64 20 62 79 20 72   value held by r
30190 65 67 69 73 74 65 72 20 50 32 20 69 6e 74 6f 20  egister P2 into 
301a0 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 0a  a RowSet object.
301b0 2a 2a 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73  ** held in regis
301c0 74 65 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ter P1..**.** An
301d0 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
301e0 20 69 66 20 50 32 20 69 73 20 6e 6f 74 20 61 6e   if P2 is not an
301f0 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 63 61 73   integer..*/.cas
30200 65 20 4f 50 5f 52 6f 77 53 65 74 41 64 64 3a 20  e OP_RowSetAdd: 
30210 7b 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20  {       /* in1, 
30220 69 6e 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20  in2 */.  pIn1 = 
30230 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
30240 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70    pIn2 = &aMem[p
30250 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73 73 65 72  Op->p2];.  asser
30260 74 28 20 28 70 49 6e 32 2d 3e 66 6c 61 67 73 20  t( (pIn2->flags 
30270 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 3b  & MEM_Int)!=0 );
30280 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c  .  if( (pIn1->fl
30290 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
302a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
302b0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 52 6f 77  te3VdbeMemSetRow
302c0 53 65 74 28 70 49 6e 31 29 3b 0a 20 20 20 20 69  Set(pIn1);.    i
302d0 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20  f( (pIn1->flags 
302e0 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
302f0 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
30300 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 6f 77    }.  sqlite3Row
30310 53 65 74 49 6e 73 65 72 74 28 70 49 6e 31 2d 3e  SetInsert(pIn1->
30320 75 2e 70 52 6f 77 53 65 74 2c 20 70 49 6e 32 2d  u.pRowSet, pIn2-
30330 3e 75 2e 69 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  >u.i);.  break;.
30340 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f  }../* Opcode: Ro
30350 77 53 65 74 52 65 61 64 20 50 31 20 50 32 20 50  wSetRead P1 P2 P
30360 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
30370 73 3a 20 72 5b 50 33 5d 3d 72 6f 77 73 65 74 28  s: r[P3]=rowset(
30380 50 31 29 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61 63  P1).**.** Extrac
30390 74 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 76  t the smallest v
303a0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 52 6f  alue from the Ro
303b0 77 53 65 74 20 6f 62 6a 65 63 74 20 69 6e 20 50  wSet object in P
303c0 31 0a 2a 2a 20 61 6e 64 20 70 75 74 20 74 68 61  1.** and put tha
303d0 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67  t value into reg
303e0 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 4f 72 2c  ister P3..** Or,
303f0 20 69 66 20 52 6f 77 53 65 74 20 6f 62 6a 65 63   if RowSet objec
30400 74 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c  t P1 is initiall
30410 79 20 65 6d 70 74 79 2c 20 6c 65 61 76 65 20 50  y empty, leave P
30420 33 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61  3.** unchanged a
30430 6e 64 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  nd jump to instr
30440 75 63 74 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61  uction P2..*/.ca
30450 73 65 20 4f 50 5f 52 6f 77 53 65 74 52 65 61 64  se OP_RowSetRead
30460 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d  : {       /* jum
30470 70 2c 20 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a  p, in1, out3 */.
30480 20 20 69 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49    i64 val;..  pI
30490 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
304a0 70 31 5d 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  p1];.  if( (pIn1
304b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
304c0 77 53 65 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20  wSet)==0 .   || 
304d0 73 71 6c 69 74 65 33 52 6f 77 53 65 74 4e 65 78  sqlite3RowSetNex
304e0 74 28 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65  t(pIn1->u.pRowSe
304f0 74 2c 20 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b  t, &val)==0.  ){
30500 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c  .    /* The bool
30510 65 61 6e 20 69 6e 64 65 78 20 69 73 20 65 6d 70  ean index is emp
30520 74 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ty */.    sqlite
30530 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
30540 70 49 6e 31 29 3b 0a 20 20 20 20 56 64 62 65 42  pIn1);.    VdbeB
30550 72 61 6e 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b  ranchTaken(1,2);
30560 0a 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  .    goto jump_t
30570 6f 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66  o_p2_and_check_f
30580 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20  or_interrupt;.  
30590 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20  }else{.    /* A 
305a0 76 61 6c 75 65 20 77 61 73 20 70 75 6c 6c 65 64  value was pulled
305b0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20   from the index 
305c0 2a 2f 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63  */.    VdbeBranc
305d0 68 54 61 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20  hTaken(0,2);.   
305e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
305f0 65 74 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f  etInt64(&aMem[pO
30600 70 2d 3e 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20  p->p3], val);.  
30610 7d 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66  }.  goto check_f
30620 6f 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a  or_interrupt;.}.
30630 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53  ./* Opcode: RowS
30640 65 74 54 65 73 74 20 50 31 20 50 32 20 50 33 20  etTest P1 P2 P3 
30650 50 34 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P4.** Synopsis: 
30660 69 66 20 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73  if r[P3] in rows
30670 65 74 28 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a  et(P1) goto P2.*
30680 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  *.** Register P3
30690 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
306a0 6f 6c 64 20 61 20 36 34 2d 62 69 74 20 69 6e 74  old a 64-bit int
306b0 65 67 65 72 20 76 61 6c 75 65 2e 20 49 66 20 72  eger value. If r
306c0 65 67 69 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f  egister P1.** co
306d0 6e 74 61 69 6e 73 20 61 20 52 6f 77 53 65 74 20  ntains a RowSet 
306e0 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
306f0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 63 6f  RowSet object co
30700 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61  ntains.** the va
30710 6c 75 65 20 68 65 6c 64 20 69 6e 20 50 33 2c 20  lue held in P3, 
30720 6a 75 6d 70 20 74 6f 20 72 65 67 69 73 74 65 72  jump to register
30730 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   P2. Otherwise, 
30740 69 6e 73 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e  insert the.** in
30750 74 65 67 65 72 20 69 6e 20 50 33 20 69 6e 74 6f  teger in P3 into
30760 20 74 68 65 20 52 6f 77 53 65 74 20 61 6e 64 20   the RowSet and 
30770 63 6f 6e 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74  continue on to t
30780 68 65 0a 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64  he.** next opcod
30790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77  e..**.** The Row
307a0 53 65 74 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  Set object is op
307b0 74 69 6d 69 7a 65 64 20 66 6f 72 20 74 68 65 20  timized for the 
307c0 63 61 73 65 20 77 68 65 72 65 20 73 65 74 73 20  case where sets 
307d0 6f 66 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  of integers.** a
307e0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 64  re inserted in d
307f0 69 73 74 69 6e 63 74 20 70 68 61 73 65 73 2c 20  istinct phases, 
30800 77 68 69 63 68 20 65 61 63 68 20 73 65 74 20 63  which each set c
30810 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 75 70 6c 69  ontains no dupli
30820 63 61 74 65 73 2e 0a 2a 2a 20 45 61 63 68 20 73  cates..** Each s
30830 65 74 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  et is identified
30840 20 62 79 20 61 20 75 6e 69 71 75 65 20 50 34 20   by a unique P4 
30850 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72 73 74  value. The first
30860 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68 61 76   set.** must hav
30870 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66 69 6e  e P4==0, the fin
30880 61 6c 20 73 65 74 20 6d 75 73 74 20 68 61 76 65  al set must have
30890 20 50 34 3d 3d 2d 31 2c 20 61 6e 64 20 66 6f 72   P4==-1, and for
308a0 20 61 6c 6c 20 6f 74 68 65 72 20 73 65 74 73 0a   all other sets.
308b0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 50 34 3e  ** must have P4>
308c0 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  0..**.** This al
308d0 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lows optimizatio
308e0 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d  ns: (a) when P4=
308f0 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  =0 there is no n
30900 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  eed to test.** t
30910 68 65 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  he RowSet object
30920 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69   for P3, as it i
30930 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
30940 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a   to contain it,.
30950 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d  ** (b) when P4==
30960 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  -1 there is no n
30970 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  eed to insert th
30980 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77  e value, as it w
30990 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20  ill.** never be 
309a0 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20  tested for, and 
309b0 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65  (c) when a value
309c0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
309d0 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73   set X is.** ins
309e0 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  erted, there is 
309f0 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63  no need to searc
30a00 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  h to see if the 
30a10 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a  same value was.*
30a20 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  * previously ins
30a30 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  erted as part of
30a40 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20   set X (only if 
30a50 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  it was previousl
30a60 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73  y.** inserted as
30a70 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74   part of some ot
30a80 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73  her set)..*/.cas
30a90 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  e OP_RowSetTest:
30aa0 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
30ab0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
30ac0 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  in1, in3 */.  in
30ad0 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78  t iSet;.  int ex
30ae0 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  ists;..  pIn1 = 
30af0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
30b00 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
30b10 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20  Op->p3];.  iSet 
30b20 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61  = pOp->p4.i;.  a
30b30 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
30b40 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20  gs&MEM_Int );.. 
30b50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
30b60 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
30b70 68 61 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a  han a rowset obj
30b80 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ect in memory ce
30b90 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65  ll P1,.  ** dele
30ba0 74 65 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e  te it now and in
30bb0 69 74 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68  itialize P1 with
30bc0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
30bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e  .  */.  if( (pIn
30be0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
30bf0 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
30c00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
30c10 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
30c20 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
30c30 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
30c40 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
30c50 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  mem;.  }..  asse
30c60 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
30c70 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61  =P4_INT32 );.  a
30c80 73 73 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20  ssert( iSet==-1 
30c90 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20  || iSet>=0 );.  
30ca0 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20  if( iSet ){.    
30cb0 65 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33  exists = sqlite3
30cc0 52 6f 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d  RowSetTest(pIn1-
30cd0 3e 75 2e 70 52 6f 77 53 65 74 2c 20 69 53 65 74  >u.pRowSet, iSet
30ce0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  , pIn3->u.i);.  
30cf0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
30d00 6e 28 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a  n(exists!=0,2);.
30d10 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
30d20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
30d30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74  ;.  }.  if( iSet
30d40 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
30d50 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
30d60 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
30d70 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a  pIn3->u.i);.  }.
30d80 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
30d90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30da0 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63  _TRIGGER../* Opc
30db0 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20  ode: Program P1 
30dc0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
30dd0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72  * Execute the tr
30de0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61  igger program pa
30df0 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65  ssed as P4 (type
30e00 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e   P4_SUBPROGRAM).
30e10 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61   .**.** P1 conta
30e20 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
30e30 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
30e40 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
30e50 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
30e60 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e  y .** cell in an
30e70 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73   array of values
30e80 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e   used as argumen
30e90 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72  ts to the sub-pr
30ea0 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f  ogram. P2 .** co
30eb0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
30ec0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
30ed0 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
30ee0 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52   throws an IGNOR
30ef0 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  E .** exception 
30f00 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28  using the RAISE(
30f10 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69  ) function. Regi
30f20 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
30f30 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a   the address .**
30f40 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   of a memory cel
30f50 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70  l in this (the p
30f60 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69  arent) VM that i
30f70 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
30f80 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72  te the .** memor
30f90 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  y required by th
30fa0 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75  e sub-vdbe at ru
30fb0 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ntime..**.** P4 
30fc0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
30fd0 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e  the VM containin
30fe0 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  g the trigger pr
30ff0 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
31000 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P5 is non-zero, 
31010 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 70  then recursive p
31020 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f  rogram invocatio
31030 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f  n is enabled..*/
31040 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d  .case OP_Program
31050 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
31060 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  mp */.  int nMem
31070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31080 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
31090 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 66 6f  ory registers fo
310a0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
310b0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
310c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
310d0 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73  tes of runtime s
310e0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
310f0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
31100 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20  .  Mem *pRt;    
31110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
31120 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  gister to alloca
31130 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65  te runtime space
31140 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31160 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
31170 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20   through memory 
31180 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  cells */.  Mem *
31190 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
311a0 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72     /* Last memor
311b0 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72  y cell in new ar
311c0 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ray */.  VdbeFra
311d0 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
311e0 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61   /* New vdbe fra
311f0 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e  me to execute in
31200 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
31210 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a   *pProgram;   /*
31220 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20   Sub-program to 
31230 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69  execute */.  voi
31240 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20  d *t;           
31250 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64       /* Token id
31260 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 67 65  entifying trigge
31270 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d  r */..  pProgram
31280 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
31290 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d  ram;.  pRt = &aM
312a0 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
312b0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
312c0 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f  >nOp>0 );.  .  /
312d0 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c 61 67  * If the p5 flag
312e0 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
312f0 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
31300 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
31310 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c   is .  ** disabl
31320 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73  ed for backwards
31330 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28   compatibility (
31340 70 35 20 69 73 20 73 65 74 20 69 66 20 74 68 69  p5 is set if thi
31350 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20  s sub-program.  
31360 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  ** is really a t
31370 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f  rigger, not a fo
31380 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
31390 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73  , and the flag s
313a0 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61  et.  ** and clea
313b0 72 65 64 20 62 79 20 74 68 65 20 22 50 52 41 47  red by the "PRAG
313c0 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
313d0 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69  ggers" command i
313e0 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a  s clear)..  ** .
313f0 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72    ** It is recur
31400 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
31410 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61 74 20  of triggers, at 
31420 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74  the SQL level, t
31430 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  hat is .  ** dis
31440 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63  abled. In some c
31450 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72  ases a single tr
31460 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61  igger may genera
31470 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  te more than one
31480 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61   .  ** SubProgra
31490 6d 20 28 69 66 20 74 68 65 20 74 72 69 67 67 65  m (if the trigge
314a0 72 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  r may be execute
314b0 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e  d with more than
314c0 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a   one different .
314d0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
314e0 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62   algorithm). Sub
314f0 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
31500 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
31510 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  th a.  ** single
31520 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76   trigger all hav
31530 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
31540 20 66 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67   for the SubProg
31550 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20  ram.token .  ** 
31560 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
31570 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
31580 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d     t = pProgram-
31590 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28  >token;.    for(
315a0 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
315b0 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46 72 61  ; pFrame && pFra
315c0 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46  me->token!=t; pF
315d0 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
315e0 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
315f0 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20  Frame ) break;. 
31600 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72   }..  if( p->nFr
31610 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ame>=db->aLimit[
31620 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
31630 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20  GGER_DEPTH] ){. 
31640 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
31650 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
31660 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74  3VdbeError(p, "t
31670 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
31680 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
31690 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
316a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
316b0 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  or;.  }..  /* Re
316c0 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75 73  gister pRt is us
316d0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
316e0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
316f0 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61 74  to save the stat
31700 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75  e.  ** of the cu
31710 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61  rrent program, a
31720 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  nd the memory re
31730 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
31740 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a  e to execute.  *
31750 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  * the trigger pr
31760 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74  ogram. If this t
31770 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e 20  rigger has been 
31780 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68  fired before, th
31790 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20  en pRt .  ** is 
317a0 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
317b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
317c0 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c   must be initial
317d0 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ized.  */.  if( 
317e0 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  (pRt->flags&MEM_
317f0 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Frame)==0 ){.   
31800 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e   /* SubProgram.n
31810 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68  Mem is set to th
31820 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  e number of memo
31830 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79  ry cells used by
31840 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f   the .    ** pro
31850 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53  gram stored in S
31860 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41  ubProgram.aOp. A
31870 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c  s well as these,
31880 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   one memory.    
31890 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69  ** cell is requi
318a0 72 65 64 20 66 6f 72 20 65 61 63 68 20 63 75 72  red for each cur
318b0 73 6f 72 20 75 73 65 64 20 62 79 20 74 68 65 20  sor used by the 
318c0 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63  program. Set loc
318d0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
318e0 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74  le nMem (and lat
318f0 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43  er, VdbeFrame.nC
31900 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73  hildMem) to this
31910 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
31920 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72     nMem = pProgr
31930 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67  am->nMem + pProg
31940 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61  ram->nCsr;.    a
31950 73 73 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b  ssert( nMem>0 );
31960 0a 20 20 20 20 69 66 28 20 70 50 72 6f 67 72 61  .    if( pProgra
31970 6d 2d 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65  m->nCsr==0 ) nMe
31980 6d 2b 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  m++;.    nByte =
31990 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
319a0 64 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20  dbeFrame)).     
319b0 20 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20           + nMem 
319c0 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20  * sizeof(Mem).  
319d0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
319e0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73  rogram->nCsr * s
319f0 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
31a00 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
31a10 20 2b 20 28 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f   + (pProgram->nO
31a20 70 20 2b 20 37 29 2f 38 3b 0a 20 20 20 20 70 46  p + 7)/8;.    pF
31a30 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  rame = sqlite3Db
31a40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
31a50 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
31a60 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  pFrame ){.      
31a70 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20  goto no_mem;.   
31a80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
31a90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 52 74  beMemRelease(pRt
31aa0 29 3b 0a 20 20 20 20 70 52 74 2d 3e 66 6c 61 67  );.    pRt->flag
31ab0 73 20 3d 20 4d 45 4d 5f 46 72 61 6d 65 3b 0a 20  s = MEM_Frame;. 
31ac0 20 20 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65     pRt->u.pFrame
31ad0 20 3d 20 70 46 72 61 6d 65 3b 0a 0a 20 20 20 20   = pFrame;..    
31ae0 70 46 72 61 6d 65 2d 3e 76 20 3d 20 70 3b 0a 20  pFrame->v = p;. 
31af0 20 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c     pFrame->nChil
31b00 64 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20  dMem = nMem;.   
31b10 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 43   pFrame->nChildC
31b20 73 72 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  sr = pProgram->n
31b30 43 73 72 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  Csr;.    pFrame-
31b40 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70 20  >pc = (int)(pOp 
31b50 2d 20 61 4f 70 29 3b 0a 20 20 20 20 70 46 72 61  - aOp);.    pFra
31b60 6d 65 2d 3e 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d  me->aMem = p->aM
31b70 65 6d 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  em;.    pFrame->
31b80 6e 4d 65 6d 20 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a  nMem = p->nMem;.
31b90 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 70 43 73      pFrame->apCs
31ba0 72 20 3d 20 70 2d 3e 61 70 43 73 72 3b 0a 20 20  r = p->apCsr;.  
31bb0 20 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f    pFrame->nCurso
31bc0 72 20 3d 20 70 2d 3e 6e 43 75 72 73 6f 72 3b 0a  r = p->nCursor;.
31bd0 20 20 20 20 70 46 72 61 6d 65 2d 3e 61 4f 70 20      pFrame->aOp 
31be0 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 70 46  = p->aOp;.    pF
31bf0 72 61 6d 65 2d 3e 6e 4f 70 20 3d 20 70 2d 3e 6e  rame->nOp = p->n
31c00 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e  Op;.    pFrame->
31c10 74 6f 6b 65 6e 20 3d 20 70 50 72 6f 67 72 61 6d  token = pProgram
31c20 2d 3e 74 6f 6b 65 6e 3b 0a 23 69 66 64 65 66 20  ->token;.#ifdef 
31c30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
31c40 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
31c50 20 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63    pFrame->anExec
31c60 20 3d 20 70 2d 3e 61 6e 45 78 65 63 3b 0a 23 65   = p->anExec;.#e
31c70 6e 64 69 66 0a 0a 20 20 20 20 70 45 6e 64 20 3d  ndif..    pEnd =
31c80 20 26 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70   &VdbeFrameMem(p
31c90 46 72 61 6d 65 29 5b 70 46 72 61 6d 65 2d 3e 6e  Frame)[pFrame->n
31ca0 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 20 20 66  ChildMem];.    f
31cb0 6f 72 28 70 4d 65 6d 3d 56 64 62 65 46 72 61 6d  or(pMem=VdbeFram
31cc0 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 20 70 4d  eMem(pFrame); pM
31cd0 65 6d 21 3d 70 45 6e 64 3b 20 70 4d 65 6d 2b 2b  em!=pEnd; pMem++
31ce0 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
31cf0 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
31d00 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ined;.      pMem
31d10 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ->db = db;.    }
31d20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
31d30 72 61 6d 65 20 3d 20 70 52 74 2d 3e 75 2e 70 46  rame = pRt->u.pF
31d40 72 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  rame;.    assert
31d50 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d  ( pProgram->nMem
31d60 2b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d  +pProgram->nCsr=
31d70 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d  =pFrame->nChildM
31d80 65 6d 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  em .        || (
31d90 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d  pProgram->nCsr==
31da0 30 20 26 26 20 70 50 72 6f 67 72 61 6d 2d 3e 6e  0 && pProgram->n
31db0 4d 65 6d 2b 31 3d 3d 70 46 72 61 6d 65 2d 3e 6e  Mem+1==pFrame->n
31dc0 43 68 69 6c 64 4d 65 6d 29 20 29 3b 0a 20 20 20  ChildMem) );.   
31dd0 20 61 73 73 65 72 74 28 20 70 50 72 6f 67 72 61   assert( pProgra
31de0 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61 6d 65 2d  m->nCsr==pFrame-
31df0 3e 6e 43 68 69 6c 64 43 73 72 20 29 3b 0a 20 20  >nChildCsr );.  
31e00 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 28    assert( (int)(
31e10 70 4f 70 20 2d 20 61 4f 70 29 3d 3d 70 46 72 61  pOp - aOp)==pFra
31e20 6d 65 2d 3e 70 63 20 29 3b 0a 20 20 7d 0a 0a 20  me->pc );.  }.. 
31e30 20 70 2d 3e 6e 46 72 61 6d 65 2b 2b 3b 0a 20 20   p->nFrame++;.  
31e40 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 20  pFrame->pParent 
31e50 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 70  = p->pFrame;.  p
31e60 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
31e70 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64   = db->lastRowid
31e80 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  ;.  pFrame->nCha
31e90 6e 67 65 20 3d 20 70 2d 3e 6e 43 68 61 6e 67 65  nge = p->nChange
31ea0 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  ;.  pFrame->nDbC
31eb0 68 61 6e 67 65 20 3d 20 70 2d 3e 64 62 2d 3e 6e  hange = p->db->n
31ec0 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
31ed0 28 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  ( pFrame->pAuxDa
31ee0 74 61 3d 3d 30 20 29 3b 0a 20 20 70 46 72 61 6d  ta==0 );.  pFram
31ef0 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 2d  e->pAuxData = p-
31f00 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 2d 3e  >pAuxData;.  p->
31f10 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
31f20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
31f30 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46    p->pFrame = pF
31f40 72 61 6d 65 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20  rame;.  p->aMem 
31f50 3d 20 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61  = aMem = VdbeFra
31f60 6d 65 4d 65 6d 28 70 46 72 61 6d 65 29 3b 0a 20  meMem(pFrame);. 
31f70 20 70 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   p->nMem = pFram
31f80 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 3b 0a 20 20  e->nChildMem;.  
31f90 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75 31  p->nCursor = (u1
31fa0 36 29 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  6)pFrame->nChild
31fb0 43 73 72 3b 0a 20 20 70 2d 3e 61 70 43 73 72 20  Csr;.  p->apCsr 
31fc0 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
31fd0 29 26 61 4d 65 6d 5b 70 2d 3e 6e 4d 65 6d 5d 3b  )&aMem[p->nMem];
31fe0 0a 20 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65  .  pFrame->aOnce
31ff0 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 70 43 73   = (u8*)&p->apCs
32000 72 5b 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72  r[pProgram->nCsr
32010 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 72 61  ];.  memset(pFra
32020 6d 65 2d 3e 61 4f 6e 63 65 2c 20 30 2c 20 28 70  me->aOnce, 0, (p
32030 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 20 2b 20 37  Program->nOp + 7
32040 29 2f 38 29 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  )/8);.  p->aOp =
32050 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61 6d 2d   aOp = pProgram-
32060 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 20 3d  >aOp;.  p->nOp =
32070 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70 3b 0a   pProgram->nOp;.
32080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
32090 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
320a0 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78 65 63  ATUS.  p->anExec
320b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
320c0 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b 0a 0a  Op = &aOp[-1];..
320d0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
320e0 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50 31 20  pcode: Param P1 
320f0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  P2 * * *.**.** T
32100 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6f 6e  his opcode is on
32110 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e 74 20  ly ever present 
32120 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  in sub-programs 
32130 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 0a  called via the .
32140 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20 69 6e  ** OP_Program in
32150 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70 79 20  struction. Copy 
32160 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c  a value currentl
32170 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6d 65  y stored in a me
32180 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 6f 66  mory .** cell of
32190 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28 70 61   the calling (pa
321a0 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f 20 63  rent) frame to c
321b0 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20 63 75  ell P2 in the cu
321c0 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a 2a 2a  rrent frames .**
321d0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
321e0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
321f0 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
32200 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 6e   to access the n
32210 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f 6c 64  ew.* .** and old
32220 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a  .* values..**.**
32230 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
32240 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
32250 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69 73 20  parent frame is 
32260 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 64  determined by ad
32270 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ding.** the valu
32280 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
32290 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61 6c 75  ment to the valu
322a0 65 20 6f 66 20 74 68 65 20 50 31 20 61 72 67 75  e of the P1 argu
322b0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ment to the.** c
322c0 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
322d0 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  m instruction..*
322e0 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61 6d 3a  /.case OP_Param:
322f0 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {           /* 
32300 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65 46 72  out2 */.  VdbeFr
32310 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 4d  ame *pFrame;.  M
32320 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75 74 20  em *pIn;.  pOut 
32330 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
32340 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46 72 61  (p, pOp);.  pFra
32350 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65 3b 0a  me = p->pFrame;.
32360 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d 65 2d    pIn = &pFrame-
32370 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20 2b 20  >aMem[pOp->p1 + 
32380 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46 72 61  pFrame->aOp[pFra
32390 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20 20 0a  me->pc].p1];   .
323a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
323b0 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f 75 74  ShallowCopy(pOut
323c0 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68 65 6d  , pIn, MEM_Ephem
323d0 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 23  );.  break;.}..#
323e0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
323f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
32400 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  GGER */..#ifndef
32410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
32420 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70 63 6f  EIGN_KEY./* Opco
32430 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20 50 31  de: FkCounter P1
32440 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
32450 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b 50 31 5d  opsis: fkctr[P1]
32460 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  +=P2.**.** Incre
32470 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72 61 69  ment a "constrai
32480 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79 20 50  nt counter" by P
32490 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e 65 67  2 (P2 may be neg
324a0 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74 69 76  ative or positiv
324b0 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69 73 20  e)..** If P1 is 
324c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 64 61  non-zero, the da
324d0 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61 69 6e  tabase constrain
324e0 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e 63  t counter is inc
324f0 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28 64 65  remented .** (de
32500 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
32510 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 29 2e  ey constraints).
32520 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 50   Otherwise, if P
32530 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 0a  1 is zero, the .
32540 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 75  ** statement cou
32550 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d 65 6e  nter is incremen
32560 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65 20 66  ted (immediate f
32570 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
32580 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61 73 65  raints)..*/.case
32590 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a 20 7b   OP_FkCounter: {
325a0 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
325b0 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65 72 46   & SQLITE_DeferF
325c0 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44  Ks ){.    db->nD
325d0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 2b  eferredImmCons +
325e0 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d 65 6c  = pOp->p2;.  }el
325f0 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 31 20 29  se if( pOp->p1 )
32600 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72  {.    db->nDefer
32610 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70 2d 3e  redCons += pOp->
32620 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p2;.  }else{.   
32630 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
32640 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  t += pOp->p2;.  
32650 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
32660 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a 65 72   Opcode: FkIfZer
32670 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  o P1 P2 * * *.**
32680 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 66 6b   Synopsis: if fk
32690 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74 6f 20  ctr[P1]==0 goto 
326a0 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  P2.**.** This op
326b0 63 6f 64 65 20 74 65 73 74 73 20 69 66 20 61 20  code tests if a 
326c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
326d0 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 20 69  traint-counter i
326e0 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65 72 6f  s currently zero
326f0 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75 6d 70  ..** If so, jump
32700 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   to instruction 
32710 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66  P2. Otherwise, f
32720 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
32730 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e 73 74  he next .** inst
32740 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  ruction..**.** I
32750 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
32760 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d 70 20  , then the jump 
32770 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
32780 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
32790 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a 20 69  int-counter.** i
327a0 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e 65 20  s zero (the one 
327b0 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65 66 65  that counts defe
327c0 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
327d0 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49 66 20  violations). If 
327e0 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c 20 74  P1 is.** zero, t
327f0 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e  he jump is taken
32800 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
32810 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63 6f 75  t constraint-cou
32820 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  nter is zero.** 
32830 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
32840 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
32850 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 0a 2a  t violations)..*
32860 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66 5a 65  /.case OP_FkIfZe
32870 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20 2f 2a  ro: {         /*
32880 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28 20 70   jump */.  if( p
32890 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 56 64  Op->p1 ){.    Vd
328a0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 64 62  beBranchTaken(db
328b0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d  ->nDeferredCons=
328c0 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  =0 && db->nDefer
328d0 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32  redImmCons==0, 2
328e0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  );.    if( db->n
328f0 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d 30 20  DeferredCons==0 
32900 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  && db->nDeferred
32910 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74  ImmCons==0 ) got
32920 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20  o jump_to_p2;.  
32930 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 42  }else{.    VdbeB
32940 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 6e 46  ranchTaken(p->nF
32950 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26  kConstraint==0 &
32960 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  & db->nDeferredI
32970 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b 0a 20  mmCons==0, 2);. 
32980 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43 6f 6e     if( p->nFkCon
32990 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20 64 62  straint==0 && db
329a0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
329b0 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d  ns==0 ) goto jum
329c0 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62  p_to_p2;.  }.  b
329d0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
329e0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
329f0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
32a00 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  Y */..#ifndef SQ
32a10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
32a20 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63 6f 64  CREMENT./* Opcod
32a30 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50 32 20  e: MemMax P1 P2 
32a40 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
32a50 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72 5b 50  s: r[P1]=max(r[P
32a60 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a 2a 20  1],r[P2]).**.** 
32a70 50 31 20 69 73 20 61 20 72 65 67 69 73 74 65 72  P1 is a register
32a80 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72 61   in the root fra
32a90 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20 28 74  me of this VM (t
32aa0 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20 69 73  he root frame is
32ab0 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72  .** different fr
32ac0 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  om the current f
32ad0 72 61 6d 65 20 69 66 20 74 68 69 73 20 69 6e 73  rame if this ins
32ae0 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  truction is bein
32af0 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 77 69  g executed.** wi
32b00 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f 67 72  thin a sub-progr
32b10 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76 61 6c  am). Set the val
32b20 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
32b30 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  1 to the maximum
32b40 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75 72 72   of .** its curr
32b50 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ent value and th
32b60 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
32b70 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
32b80 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  is instruction t
32b90 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72 20 69  hrows an error i
32ba0 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
32bb0 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  l is not initial
32bc0 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  ly.** an integer
32bd0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 65 6d  ..*/.case OP_Mem
32be0 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  Max: {        /*
32bf0 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65 46 72   in2 */.  VdbeFr
32c00 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 69  ame *pFrame;.  i
32c10 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
32c20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
32c30 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
32c40 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
32c50 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
32c60 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26  t);.    pIn1 = &
32c70 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70 4f 70  pFrame->aMem[pOp
32c80 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ->p1];.  }else{.
32c90 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d      pIn1 = &aMem
32ca0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 0a 20  [pOp->p1];.  }. 
32cb0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
32cc0 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 73  lid(pIn1) );.  s
32cd0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 74  qlite3VdbeMemInt
32ce0 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b 0a 20  egerify(pIn1);. 
32cf0 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn2 = &aMem[pO
32d00 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65  p->p2];.  sqlite
32d10 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69  3VdbeMemIntegeri
32d20 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66 28 20  fy(pIn2);.  if( 
32d30 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32 2d 3e  pIn1->u.i<pIn2->
32d40 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31 2d 3e  u.i){.    pIn1->
32d50 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b  u.i = pIn2->u.i;
32d60 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
32d70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
32d80 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
32d90 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f 64  ENT */../* Opcod
32da0 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32 20 50  e: IfPos P1 P2 P
32db0 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  3 * *.** Synopsi
32dc0 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68  s: if r[P1]>0 th
32dd0 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20 67 6f  en r[P1]-=P3, go
32de0 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69  to P2.**.** Regi
32df0 73 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e  ster P1 must con
32e00 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e  tain an integer.
32e10 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65  .** If the value
32e20 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20   of register P1 
32e30 69 73 20 31 20 6f 72 20 67 72 65 61 74 65 72 2c  is 1 or greater,
32e40 20 73 75 62 74 72 61 63 74 20 50 33 20 66 72 6f   subtract P3 fro
32e50 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69  m the.** value i
32e60 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70 20 74 6f  n P1 and jump to
32e70 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
32e80 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
32e90 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
32ea0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2c 20 74  s less than 1, t
32eb0 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  hen the.** value
32ec0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
32ed0 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73 65 73  d control passes
32ee0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
32ef0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
32f00 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 50  ..*/.case OP_IfP
32f10 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  os: {        /* 
32f20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70  jump, in1 */.  p
32f30 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
32f40 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
32f50 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn1->flags&MEM_
32f60 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61  Int );.  VdbeBra
32f70 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e 31 2d 3e  nchTaken( pIn1->
32f80 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69 66 28  u.i>0, 2);.  if(
32f90 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29 7b 0a   pIn1->u.i>0 ){.
32fa0 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20 2d 3d      pIn1->u.i -=
32fb0 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 67 6f   pOp->p3;.    go
32fc0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
32fd0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
32fe0 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73 65 74  * Opcode: Offset
32ff0 4c 69 6d 69 74 20 50 31 20 50 32 20 50 33 20 2a  Limit P1 P2 P3 *
33000 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
33010 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65 6e 20  if r[P1]>0 then 
33020 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61 78 28  r[P2]=r[P1]+max(
33030 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20 72 5b  0,r[P3]) else r[
33040 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a 20 54  P2]=(-1).**.** T
33050 68 69 73 20 6f 70 63 6f 64 65 20 70 65 72 66 6f  his opcode perfo
33060 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79 20 75  rms a commonly u
33070 73 65 64 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  sed computation 
33080 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
33090 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  ** LIMIT and OFF
330a0 53 45 54 20 70 72 6f 63 65 73 73 2e 20 20 72 5b  SET process.  r[
330b0 50 31 5d 20 68 6f 6c 64 73 20 74 68 65 20 6c 69  P1] holds the li
330c0 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20 20 72 5b  mit counter.  r[
330d0 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74 68 65  P3].** holds the
330e0 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 2e   offset counter.
330f0 20 20 54 68 65 20 6f 70 63 6f 64 65 20 63 6f 6d    The opcode com
33100 70 75 74 65 73 20 74 68 65 20 63 6f 6d 62 69 6e  putes the combin
33110 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  ed value.** of t
33120 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
33130 53 45 54 20 61 6e 64 20 73 74 6f 72 65 73 20 74  SET and stores t
33140 68 61 74 20 76 61 6c 75 65 20 69 6e 20 72 5b 50  hat value in r[P
33150 32 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d 0a 2a  2].  The r[P2].*
33160 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75 74 65 64  * value computed
33170 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
33180 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
33190 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  t will need to b
331a0 65 0a 2a 2a 20 76 69 73 69 74 65 64 20 69 6e 20  e.** visited in 
331b0 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
331c0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a  e the query..**.
331d0 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69 73 20 7a  ** If r[P3] is z
331e0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2c  ero or negative,
331f0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 72   that means ther
33200 65 20 69 73 20 6e 6f 20 4f 46 46 53 45 54 0a 2a  e is no OFFSET.*
33210 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69 73 20 73  * and r[P2] is s
33220 65 74 20 74 6f 20 62 65 20 74 68 65 20 76 61 6c  et to be the val
33230 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 2c  ue of the LIMIT,
33240 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20 69 66   r[P1]..**.** if
33250 20 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f 20 6f   r[P1] is zero o
33260 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 61 74  r negative, that
33270 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73 20   means there is 
33280 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e 64 20  no LIMIT.** and 
33290 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74 6f 20  r[P2] is set to 
332a0 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -1. .**.** Other
332b0 77 69 73 65 2c 20 72 5b 50 32 5d 20 69 73 20 73  wise, r[P2] is s
332c0 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
332d0 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50 33 5d   r[P1] and r[P3]
332e0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 66 66  ..*/.case OP_Off
332f0 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20 20 2f  setLimit: {    /
33300 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69 6e 33  * in1, out2, in3
33310 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20 20 70   */.  i64 x;.  p
33320 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
33330 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d 20 26  >p1];.  pIn3 = &
33340 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
33350 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72   pOut = out2Prer
33360 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a  elease(p, pOp);.
33370 20 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e    assert( pIn1->
33380 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
33390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
333a0 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  3->flags & MEM_I
333b0 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70 49 6e 31  nt );.  x = pIn1
333c0 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78 3c 3d  ->u.i;.  if( x<=
333d0 30 20 7c 7c 20 73 71 6c 69 74 65 33 41 64 64 49  0 || sqlite3AddI
333e0 6e 74 36 34 28 26 78 2c 20 70 49 6e 33 2d 3e 75  nt64(&x, pIn3->u
333f0 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69 3a 30  .i>0?pIn3->u.i:0
33400 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
33410 68 65 20 4c 49 4d 49 54 20 69 73 20 6c 65 73 73  he LIMIT is less
33420 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
33430 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66 6f 72  o zero, loop for
33440 65 76 65 72 2e 20 20 54 68 69 73 0a 20 20 20 20  ever.  This.    
33450 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74 65 64  ** is documented
33460 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20 69 66 20  .  But also, if 
33470 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  the LIMIT+OFFSET
33480 20 65 78 63 65 65 64 73 20 32 5e 36 33 20 74 68   exceeds 2^63 th
33490 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6c  en.    ** also l
334a0 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20 20 54 68  oop forever.  Th
334b0 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65 6e 74  is is undocument
334c0 65 64 2e 20 20 49 6e 20 66 61 63 74 2c 20 6f 6e  ed.  In fact, on
334d0 65 20 63 6f 75 6c 64 20 61 72 67 75 65 0a 20 20  e could argue.  
334e0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 6f    ** that the lo
334f0 6f 70 20 73 68 6f 75 6c 64 20 74 65 72 6d 69 6e  op should termin
33500 61 74 65 2e 20 20 42 75 74 20 61 73 73 75 6d 69  ate.  But assumi
33510 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69 74 65  ng 1 billion ite
33520 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 70  rations.    ** p
33530 65 72 20 73 65 63 6f 6e 64 20 28 66 61 72 20 65  er second (far e
33540 78 63 65 65 64 69 6e 67 20 74 68 65 20 63 61 70  xceeding the cap
33550 61 62 69 6c 69 74 69 65 73 20 6f 66 20 61 6e 79  abilities of any
33560 20 63 75 72 72 65 6e 74 20 68 61 72 64 77 61 72   current hardwar
33570 65 29 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75  e).    ** it wou
33580 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c 79 20 33  ld take nearly 3
33590 30 30 20 79 65 61 72 73 20 74 6f 20 61 63 74 75  00 years to actu
335a0 61 6c 6c 79 20 72 65 61 63 68 20 74 68 65 20 6c  ally reach the l
335b0 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  imit.  So.    **
335c0 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76 65 72   looping forever
335d0 20 69 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65   is a reasonable
335e0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 2e 20   approximation. 
335f0 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  */.    pOut->u.i
33600 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
33610 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20      pOut->u.i = 
33620 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  x;.  }.  break;.
33630 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66  }../* Opcode: If
33640 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20 2a 20  NotZero P1 P2 * 
33650 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
33660 20 69 66 20 72 5b 50 31 5d 21 3d 30 20 74 68 65   if r[P1]!=0 the
33670 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74 6f 20  n r[P1]--, goto 
33680 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  P2.**.** Registe
33690 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74 61 69  r P1 must contai
336a0 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49  n an integer.  I
336b0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
336c0 20 72 65 67 69 73 74 65 72 20 50 31 20 69 73 0a   register P1 is.
336d0 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67 72 65  ** initially gre
336e0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
336f0 74 68 65 6e 20 64 65 63 72 65 6d 65 6e 74 20 74  then decrement t
33700 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
33710 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66 20 69  ster P1..** If i
33720 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  t is non-zero (n
33730 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
33740 69 76 65 29 20 61 6e 64 20 74 68 65 6e 20 61 6c  ive) and then al
33750 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 20  so jump to P2.  
33760 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
33770 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  P1 is initially 
33780 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69 74 20 75  zero, leave it u
33790 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 66 61 6c  nchanged and fal
337a0 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61  l through..*/.ca
337b0 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 3a  se OP_IfNotZero:
337c0 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d   {        /* jum
337d0 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31  p, in1 */.  pIn1
337e0 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
337f0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ];.  assert( pIn
33800 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  1->flags&MEM_Int
33810 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68   );.  VdbeBranch
33820 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e 69 3c  Taken(pIn1->u.i<
33830 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 49 6e  0, 2);.  if( pIn
33840 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20 20 69  1->u.i ){.     i
33850 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29  f( pIn1->u.i>0 )
33860 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20   pIn1->u.i--;.  
33870 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
33880 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b  p2;.  }.  break;
33890 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44  .}../* Opcode: D
338a0 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31 20 50  ecrJumpZero P1 P
338b0 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
338c0 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50 31 5d  sis: if (--r[P1]
338d0 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a  )==0 goto P2.**.
338e0 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31 20 6d  ** Register P1 m
338f0 75 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e 74 65  ust hold an inte
33900 67 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74 20  ger.  Decrement 
33910 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50 31 0a  the value in P1.
33920 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 50  ** and jump to P
33930 32 20 69 66 20 74 68 65 20 6e 65 77 20 76 61 6c  2 if the new val
33940 75 65 20 69 73 20 65 78 61 63 74 6c 79 20 7a 65  ue is exactly ze
33950 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ro..*/.case OP_D
33960 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b 20 20  ecrJumpZero: {  
33970 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31      /* jump, in1
33980 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   */.  pIn1 = &aM
33990 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  em[pOp->p1];.  a
339a0 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61  ssert( pIn1->fla
339b0 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20  gs&MEM_Int );.  
339c0 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 53 4d  if( pIn1->u.i>SM
339d0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29 20 70  ALLEST_INT64 ) p
339e0 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20 56 64  In1->u.i--;.  Vd
339f0 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 49  beBranchTaken(pI
33a00 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29 3b 0a  n1->u.i==0, 2);.
33a10 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3d    if( pIn1->u.i=
33a20 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74  =0 ) goto jump_t
33a30 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  o_p2;.  break;.}
33a40 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 67  .../* Opcode: Ag
33a50 67 53 74 65 70 30 20 2a 20 50 32 20 50 33 20 50  gStep0 * P2 P3 P
33a60 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
33a70 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20 73 74  : accum=r[P3] st
33a80 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a 2a 0a  ep(r[P2@P5]).**.
33a90 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 73  ** Execute the s
33aa0 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  tep function for
33ab0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
33ac0 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  The.** function 
33ad0 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e 74 73  has P5 arguments
33ae0 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .   P4 is a poin
33af0 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
33b00 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ef.** structure 
33b10 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74  that specifies t
33b20 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  he function.  Re
33b30 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68 65  gister P3 is the
33b40 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  .** accumulator.
33b50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20 61 72  .**.** The P5 ar
33b60 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61 6b 65  guments are take
33b70 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20  n from register 
33b80 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20 73 75  P2 and its.** su
33b90 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f 2a 20  ccessors..*/./* 
33ba0 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65 70 20  Opcode: AggStep 
33bb0 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  * P2 P3 P4 P5.**
33bc0 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d   Synopsis: accum
33bd0 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b 50 32  =r[P3] step(r[P2
33be0 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78 65 63  @P5]).**.** Exec
33bf0 75 74 65 20 74 68 65 20 73 74 65 70 20 66 75 6e  ute the step fun
33c00 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61 67 67  ction for an agg
33c10 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a 2a 20  regate.  The.** 
33c20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50 35 20  function has P5 
33c30 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50 34 20  arguments.   P4 
33c40 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
33c50 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  an sqlite3_conte
33c60 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  xt.** object tha
33c70 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 75 6e  t is used to run
33c80 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
33c90 52 65 67 69 73 74 65 72 20 50 33 20 69 73 0a 2a  Register P3 is.*
33ca0 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d 75 6c  * as the accumul
33cb0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
33cc0 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  P5 arguments are
33cd0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69   taken from regi
33ce0 73 74 65 72 20 50 32 20 61 6e 64 20 69 74 73 0a  ster P2 and its.
33cf0 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a  ** successors..*
33d00 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
33d10 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f   is initially co
33d20 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53 74 65  ded as OP_AggSte
33d30 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20 65 76  p0.  On first ev
33d40 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  aluation,.** the
33d50 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65 64 20   FuncDef stored 
33d60 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65 72 74  in P4 is convert
33d70 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  ed into an sqlit
33d80 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64 0a 2a  e3_context and.*
33d90 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  * the opcode is 
33da0 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74 68 69  changed.  In thi
33db0 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69 74 69  s way, the initi
33dc0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
33dd0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  .** sqlite3_cont
33de0 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  ext only happens
33df0 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64 20 6f   once, instead o
33e00 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c 20 74  f on each call t
33e10 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20 66 75  o the.** step fu
33e20 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20  nction..*/.case 
33e30 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b 0a 20  OP_AggStep0: {. 
33e40 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
33e50 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  3_context *pCtx;
33e60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ..  assert( pOp-
33e70 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43  >p4type==P4_FUNC
33e80 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70  DEF );.  n = pOp
33e90 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p5;.  assert( 
33ea0 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
33eb0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
33ec0 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
33ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30  ;.  assert( n==0
33ee0 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26   || (pOp->p2>0 &
33ef0 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d  & pOp->p2+n<=(p-
33f00 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
33f10 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73  rsor)+1) );.  as
33f20 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f  sert( pOp->p3<pO
33f30 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33  p->p2 || pOp->p3
33f40 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20  >=pOp->p2+n );. 
33f50 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44   pCtx = sqlite3D
33f60 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
33f70 20 6e 2a 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   n*sizeof(sqlite
33f80 33 5f 76 61 6c 75 65 2a 29 20 2b 0a 20 20 20 20  3_value*) +.    
33f90 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
33fa0 6f 66 28 70 43 74 78 5b 30 5d 29 20 2b 20 73 69  of(pCtx[0]) + si
33fb0 7a 65 6f 66 28 4d 65 6d 29 20 2d 20 73 69 7a 65  zeof(Mem) - size
33fc0 6f 66 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  of(sqlite3_value
33fd0 2a 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74 78  *)));.  if( pCtx
33fe0 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
33ff0 6d 3b 0a 20 20 70 43 74 78 2d 3e 70 4d 65 6d 20  m;.  pCtx->pMem 
34000 3d 20 30 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75  = 0;.  pCtx->pOu
34010 74 20 3d 20 28 4d 65 6d 2a 29 26 28 70 43 74 78  t = (Mem*)&(pCtx
34020 2d 3e 61 72 67 76 5b 6e 5d 29 3b 0a 20 20 73 71  ->argv[n]);.  sq
34030 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
34040 28 70 43 74 78 2d 3e 70 4f 75 74 2c 20 64 62 2c  (pCtx->pOut, db,
34050 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 70 43   MEM_Null);.  pC
34060 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f 70 2d  tx->pFunc = pOp-
34070 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70 43 74  >p4.pFunc;.  pCt
34080 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29 28 70  x->iOp = (int)(p
34090 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70 43 74  Op - aOp);.  pCt
340a0 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  x->pVdbe = p;.  
340b0 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61 67 20 3d  pCtx->skipFlag =
340c0 20 30 3b 0a 20 20 70 43 74 78 2d 3e 69 73 45 72   0;.  pCtx->isEr
340d0 72 6f 72 20 3d 20 30 3b 0a 20 20 70 43 74 78 2d  ror = 0;.  pCtx-
340e0 3e 61 72 67 63 20 3d 20 6e 3b 0a 20 20 70 4f 70  >argc = n;.  pOp
340f0 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 46 55  ->p4type = P4_FU
34100 4e 43 43 54 58 3b 0a 20 20 70 4f 70 2d 3e 70 34  NCCTX;.  pOp->p4
34110 2e 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20  .pCtx = pCtx;.  
34120 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
34130 5f 41 67 67 53 74 65 70 3b 0a 20 20 2f 2a 20 46  _AggStep;.  /* F
34140 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
34150 20 4f 50 5f 41 67 67 53 74 65 70 20 2a 2f 0a 7d   OP_AggStep */.}
34160 0a 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65 70  .case OP_AggStep
34170 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  : {.  int i;.  s
34180 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
34190 70 43 74 78 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  pCtx;.  Mem *pMe
341a0 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  m;..  assert( pO
341b0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
341c0 4e 43 43 54 58 20 29 3b 0a 20 20 70 43 74 78 20  NCCTX );.  pCtx 
341d0 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a  = pOp->p4.pCtx;.
341e0 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70    pMem = &aMem[p
341f0 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f 2a 20 49  Op->p3];..  /* I
34200 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
34210 69 73 20 69 6e 73 69 64 65 20 6f 66 20 61 20 74  is inside of a t
34220 72 69 67 67 65 72 2c 20 74 68 65 20 72 65 67 69  rigger, the regi
34230 73 74 65 72 20 61 72 72 61 79 20 69 6e 20 61 4d  ster array in aM
34240 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67 68 74 20  em[].  ** might 
34250 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f 6e 65 20  change from one 
34260 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f 20 74 68  evaluation to th
34270 65 20 6e 65 78 74 2e 20 20 54 68 65 20 6e 65 78  e next.  The nex
34280 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 0a  t block of code.
34290 20 20 2a 2a 20 63 68 65 63 6b 73 20 74 6f 20 73    ** checks to s
342a0 65 65 20 69 66 20 74 68 65 20 72 65 67 69 73 74  ee if the regist
342b0 65 72 20 61 72 72 61 79 20 68 61 73 20 63 68 61  er array has cha
342c0 6e 67 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nged, and if so 
342d0 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69 74 69 61  it.  ** reinitia
342e0 6c 69 7a 65 73 20 74 68 65 20 72 65 6c 61 76 61  lizes the relava
342f0 6e 74 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  nt parts of the 
34300 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
34310 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 66 28 20  object */.  if( 
34320 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d 20 70 4d  pCtx->pMem != pM
34330 65 6d 20 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e  em ){.    pCtx->
34340 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a 20 20 20  pMem = pMem;.   
34350 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e 61 72 67   for(i=pCtx->arg
34360 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  c-1; i>=0; i--) 
34370 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20  pCtx->argv[i] = 
34380 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d  &aMem[pOp->p2+i]
34390 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
343a0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
343b0 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72  (i=0; i<pCtx->ar
343c0 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  gc; i++){.    as
343d0 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
343e0 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20  (pCtx->argv[i]) 
343f0 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
34400 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
34410 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b   pCtx->argv[i]);
34420 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
34430 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 61 73 73 65  Mem->n++;.  asse
34440 72 74 28 20 70 43 74 78 2d 3e 70 4f 75 74 2d 3e  rt( pCtx->pOut->
34450 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20  flags==MEM_Null 
34460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 74  );.  assert( pCt
34470 78 2d 3e 69 73 45 72 72 6f 72 3d 3d 30 20 29 3b  x->isError==0 );
34480 0a 20 20 61 73 73 65 72 74 28 20 70 43 74 78 2d  .  assert( pCtx-
34490 3e 73 6b 69 70 46 6c 61 67 3d 3d 30 20 29 3b 0a  >skipFlag==0 );.
344a0 20 20 28 70 43 74 78 2d 3e 70 46 75 6e 63 2d 3e    (pCtx->pFunc->
344b0 78 53 46 75 6e 63 29 28 70 43 74 78 2c 70 43 74  xSFunc)(pCtx,pCt
344c0 78 2d 3e 61 72 67 63 2c 70 43 74 78 2d 3e 61 72  x->argc,pCtx->ar
344d0 67 76 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  gv); /* IMP: R-2
344e0 34 35 30 35 2d 32 33 32 33 30 20 2a 2f 0a 20 20  4505-23230 */.  
344f0 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72 72 6f  if( pCtx->isErro
34500 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  r ){.    if( pCt
34510 78 2d 3e 69 73 45 72 72 6f 72 3e 30 20 29 7b 0a  x->isError>0 ){.
34520 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34530 65 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20  eError(p, "%s", 
34540 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
34550 78 74 28 70 43 74 78 2d 3e 70 4f 75 74 29 29 3b  xt(pCtx->pOut));
34560 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74 78  .      rc = pCtx
34570 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20 7d  ->isError;.    }
34580 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 73  .    if( pCtx->s
34590 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  kipFlag ){.     
345a0 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
345b0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c  .opcode==OP_Coll
345c0 53 65 71 20 29 3b 0a 20 20 20 20 20 20 69 20 3d  Seq );.      i =
345d0 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
345e0 20 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74     if( i ) sqlit
345f0 65 33 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36  e3VdbeMemSetInt6
34600 34 28 26 61 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a  4(&aMem[i], 1);.
34610 20 20 20 20 20 20 70 43 74 78 2d 3e 73 6b 69 70        pCtx->skip
34620 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Flag = 0;.    }.
34630 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
34640 65 6d 52 65 6c 65 61 73 65 28 70 43 74 78 2d 3e  emRelease(pCtx->
34650 70 4f 75 74 29 3b 0a 20 20 20 20 70 43 74 78 2d  pOut);.    pCtx-
34660 3e 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d  >pOut->flags = M
34670 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 74  EM_Null;.    pCt
34680 78 2d 3e 69 73 45 72 72 6f 72 20 3d 20 30 3b 0a  x->isError = 0;.
34690 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
346a0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
346b0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
346c0 72 74 28 20 70 43 74 78 2d 3e 70 4f 75 74 2d 3e  rt( pCtx->pOut->
346d0 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20  flags==MEM_Null 
346e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 74  );.  assert( pCt
346f0 78 2d 3e 73 6b 69 70 46 6c 61 67 3d 3d 30 20 29  x->skipFlag==0 )
34700 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
34710 20 4f 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61   Opcode: AggFina
34720 6c 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  l P1 P2 * P4 *.*
34730 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75  * Synopsis: accu
34740 6d 3d 72 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a  m=r[P1] N=P2.**.
34750 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
34760 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f  inalizer functio
34770 6e 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  n for an aggrega
34780 74 65 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68  te.  P1 is.** th
34790 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
347a0 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63  n that is the ac
347b0 63 75 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68  cumulator for th
347c0 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a  e aggregate..**.
347d0 2a 2a 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d  ** P2 is the num
347e0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
347f0 20 74 68 61 74 20 74 68 65 20 73 74 65 70 20 66   that the step f
34800 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e  unction takes an
34810 64 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69  d.** P4 is a poi
34820 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63  nter to the Func
34830 44 65 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e  Def for this fun
34840 63 74 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a  ction.  The P2.*
34850 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  * argument is no
34860 74 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6f  t used by this o
34870 70 63 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e  pcode.  It is on
34880 6c 79 20 74 68 65 72 65 20 74 6f 20 64 69 73 61  ly there to disa
34890 6d 62 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63  mbiguate.** func
348a0 74 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74  tions that can t
348b0 61 6b 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62  ake varying numb
348c0 65 72 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ers of arguments
348d0 2e 20 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67  .  The.** P4 arg
348e0 75 6d 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65  ument is only ne
348f0 65 64 65 64 20 66 6f 72 20 74 68 65 20 64 65 67  eded for the deg
34900 65 6e 65 72 61 74 65 20 63 61 73 65 20 77 68 65  enerate case whe
34910 72 65 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66  re.** the step f
34920 75 6e 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  unction was not 
34930 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
34940 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67  d..*/.case OP_Ag
34950 67 46 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20  gFinal: {.  Mem 
34960 2a 70 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  *pMem;.  assert(
34970 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f   pOp->p1>0 && pO
34980 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b  p->p1<=(p->nMem+
34990 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20  1 - p->nCursor) 
349a0 29 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65  );.  pMem = &aMe
349b0 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
349c0 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
349d0 67 73 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c  gs & ~(MEM_Null|
349e0 4d 45 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a  MEM_Agg))==0 );.
349f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
34a00 62 65 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d  beMemFinalize(pM
34a10 65 6d 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  em, pOp->p4.pFun
34a20 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  c);.  if( rc ){.
34a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
34a40 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71  rror(p, "%s", sq
34a50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
34a60 28 70 4d 65 6d 29 29 3b 0a 20 20 20 20 67 6f 74  (pMem));.    got
34a70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
34a80 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rror;.  }.  sqli
34a90 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
34aa0 6f 64 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f  oding(pMem, enco
34ab0 64 69 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f  ding);.  UPDATE_
34ac0 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65  MAX_BLOBSIZE(pMe
34ad0 6d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  m);.  if( sqlite
34ae0 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
34af0 4d 65 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Mem) ){.    goto
34b00 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20   too_big;.  }.  
34b10 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
34b20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
34b30 4c 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65  L./* Opcode: Che
34b40 63 6b 70 6f 69 6e 74 20 50 31 20 50 32 20 50 33  ckpoint P1 P2 P3
34b50 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   * *.**.** Check
34b60 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 50  point database P
34b70 31 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  1. This is a no-
34b80 6f 70 20 69 66 20 50 31 20 69 73 20 6e 6f 74 20  op if P1 is not 
34b90 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
34ba0 57 41 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d 65  WAL mode. Parame
34bb0 74 65 72 20 50 32 20 69 73 20 6f 6e 65 20 6f 66  ter P2 is one of
34bc0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
34bd0 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
34be0 2c 0a 2a 2a 20 52 45 53 54 41 52 54 2c 20 6f 72  ,.** RESTART, or
34bf0 20 54 52 55 4e 43 41 54 45 2e 20 20 57 72 69 74   TRUNCATE.  Writ
34c00 65 20 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65  e 1 or 0 into me
34c10 6d 5b 50 33 5d 20 69 66 20 74 68 65 20 63 68 65  m[P3] if the che
34c20 63 6b 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a  ckpoint returns.
34c30 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  ** SQLITE_BUSY o
34c40 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
34c50 65 6c 79 2e 20 20 57 72 69 74 65 20 74 68 65 20  ely.  Write the 
34c60 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
34c70 69 6e 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66  in the.** WAL af
34c80 74 65 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ter the checkpoi
34c90 6e 74 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31  nt into mem[P3+1
34ca0 5d 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  ] and the number
34cb0 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20   of pages.** in 
34cc0 74 68 65 20 57 41 4c 20 74 68 61 74 20 68 61 76  the WAL that hav
34cd0 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
34ce0 74 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  ted after the ch
34cf0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70  eckpoint.** comp
34d00 6c 65 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50  letes into mem[P
34d10 33 2b 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f  3+2].  However o
34d20 6e 20 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b  n an error, mem[
34d30 50 33 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d  P3+1] and.** mem
34d40 5b 50 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69  [P3+2] are initi
34d50 61 6c 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f  alized to -1..*/
34d60 0a 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f  .case OP_Checkpo
34d70 69 6e 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20  int: {.  int i; 
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34da0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
34db0 74 20 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20  t aRes[3];      
34dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34dd0 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65   Results */.  Me
34de0 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34e00 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
34e10 65 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ere */..  assert
34e20 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
34e30 20 29 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20   );.  aRes[0] = 
34e40 30 3b 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61  0;.  aRes[1] = a
34e50 52 65 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61  Res[2] = -1;.  a
34e60 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d  ssert( pOp->p2==
34e70 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
34e80 54 5f 50 41 53 53 49 56 45 0a 20 20 20 20 20 20  T_PASSIVE.      
34e90 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c   || pOp->p2==SQL
34ea0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
34eb0 55 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  ULL.       || pO
34ec0 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48  p->p2==SQLITE_CH
34ed0 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
34ee0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e  .       || pOp->
34ef0 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b  p2==SQLITE_CHECK
34f00 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 0a 20  POINT_TRUNCATE. 
34f10 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
34f20 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
34f30 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
34f40 32 2c 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52  2, &aRes[1], &aR
34f50 65 73 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63  es[2]);.  if( rc
34f60 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
34f70 53 51 4c 49 54 45 5f 42 55 53 59 20 29 20 67 6f  SQLITE_BUSY ) go
34f80 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
34f90 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20  error;.    rc = 
34fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61  SQLITE_OK;.    a
34fb0 52 65 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Res[0] = 1;.  }.
34fc0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20    for(i=0, pMem 
34fd0 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
34fe0 3b 20 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d  ; i<3; i++, pMem
34ff0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
35000 56 64 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28  VdbeMemSetInt64(
35010 70 4d 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b  pMem, (i64)aRes[
35020 69 5d 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62  i]);.  }    .  b
35030 72 65 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69  reak;.};  .#endi
35040 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
35050 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a  E_OMIT_PRAGMA./*
35060 20 4f 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c   Opcode: Journal
35070 4d 6f 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  Mode P1 P2 P3 * 
35080 2a 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  *.**.** Change t
35090 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
350a0 6f 66 20 64 61 74 61 62 61 73 65 20 50 31 20 74  of database P1 t
350b0 6f 20 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65  o P3. P3 must be
350c0 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50   one of the.** P
350d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
350e0 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20  _XXX values. If 
350f0 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
35100 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c   the various rol
35110 6c 62 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28  lback.** modes (
35120 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
35130 2c 20 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61  , persist, off a
35140 6e 64 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73  nd memory), this
35150 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
35160 6f 70 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f  operation. No IO
35170 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
35180 0a 2a 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20  .** If changing 
35190 69 6e 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57  into or out of W
351a0 41 4c 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63  AL mode the proc
351b0 65 64 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f  edure is more co
351c0 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  mplicated..**.**
351d0 20 57 72 69 74 65 20 61 20 73 74 72 69 6e 67 20   Write a string 
351e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66  containing the f
351f0 69 6e 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  inal journal-mod
35200 65 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  e to register P2
35210 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75  ..*/.case OP_Jou
35220 72 6e 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f  rnalMode: {    /
35230 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 42 74 72 65  * out2 */.  Btre
35240 65 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  e *pBt;         
35250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
35260 74 72 65 65 20 74 6f 20 63 68 61 6e 67 65 20 6a  tree to change j
35270 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 2a  ournal mode of *
35280 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  /.  Pager *pPage
35290 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
352a0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73      /* Pager ass
352b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42 74  ociated with pBt
352c0 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77 3b 20   */.  int eNew; 
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352e0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6a 6f 75        /* New jou
352f0 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  rnal mode */.  i
35300 6e 74 20 65 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt eOld;        
35310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35320 2a 20 54 68 65 20 6f 6c 64 20 6a 6f 75 72 6e 61  * The old journa
35330 6c 20 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65  l mode */.#ifnde
35340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
35350 4c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  L.  const char *
35360 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
35370 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
35380 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
35390 20 70 50 61 67 65 72 20 2a 2f 0a 23 65 6e 64 69   pPager */.#endi
353a0 66 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  f..  pOut = out2
353b0 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
353c0 70 29 3b 0a 20 20 65 4e 65 77 20 3d 20 70 4f 70  p);.  eNew = pOp
353d0 2d 3e 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20  ->p3;.  assert( 
353e0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
353f0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
35400 20 20 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d         || eNew==
35410 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35420 45 5f 54 52 55 4e 43 41 54 45 20 0a 20 20 20 20  E_TRUNCATE .    
35430 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
35440 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
35450 52 53 49 53 54 20 0a 20 20 20 20 20 20 20 7c 7c  RSIST .       ||
35460 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55   eNew==PAGER_JOU
35470 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20  RNALMODE_OFF.   
35480 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47      || eNew==PAG
35490 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
354a0 45 4d 4f 52 59 0a 20 20 20 20 20 20 20 7c 7c 20  EMORY.       || 
354b0 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
354c0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20  NALMODE_WAL.    
354d0 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45     || eNew==PAGE
354e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
354f0 45 52 59 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ERY.  );.  asser
35500 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
35510 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
35520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
35530 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
35540 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
35550 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
35560 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
35570 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
35580 3b 0a 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74  ;.  eOld = sqlit
35590 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
355a0 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  lMode(pPager);. 
355b0 20 69 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52   if( eNew==PAGER
355c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
355d0 52 59 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  RY ) eNew = eOld
355e0 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
355f0 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a  PagerOkToChangeJ
35600 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
35610 72 29 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64  r) ) eNew = eOld
35620 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
35630 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69  E_OMIT_WAL.  zFi
35640 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
35650 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 50  PagerFilename(pP
35660 61 67 65 72 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  ager, 1);..  /* 
35670 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 74  Do not allow a t
35680 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 6a 6f 75  ransition to jou
35690 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f  rnal_mode=WAL fo
356a0 72 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a  r a database.  *
356b0 2a 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 73  * in temporary s
356c0 74 6f 72 61 67 65 20 6f 72 20 69 66 20 74 68 65  torage or if the
356d0 20 56 46 53 20 64 6f 65 73 20 6e 6f 74 20 73 75   VFS does not su
356e0 70 70 6f 72 74 20 73 68 61 72 65 64 20 6d 65 6d  pport shared mem
356f0 6f 72 79 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ory .  */.  if( 
35700 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eNew==PAGER_JOUR
35710 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 26  NALMODE_WAL.   &
35720 26 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  & (sqlite3Strlen
35730 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  30(zFilename)==0
35740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
35750 6d 70 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  mp file */.     
35760 20 20 7c 7c 20 21 73 71 6c 69 74 65 33 50 61 67    || !sqlite3Pag
35770 65 72 57 61 6c 53 75 70 70 6f 72 74 65 64 28 70  erWalSupported(p
35780 50 61 67 65 72 29 29 20 20 20 2f 2a 20 4e 6f 20  Pager))   /* No 
35790 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 75  shared-memory su
357a0 70 70 6f 72 74 20 2a 2f 0a 20 20 29 7b 0a 20 20  pport */.  ){.  
357b0 20 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20    eNew = eOld;. 
357c0 20 7d 0a 0a 20 20 69 66 28 20 28 65 4e 65 77 21   }..  if( (eNew!
357d0 3d 65 4f 6c 64 29 0a 20 20 20 26 26 20 28 65 4f  =eOld).   && (eO
357e0 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ld==PAGER_JOURNA
357f0 4c 4d 4f 44 45 5f 57 41 4c 20 7c 7c 20 65 4e 65  LMODE_WAL || eNe
35800 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  w==PAGER_JOURNAL
35810 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 29 7b 0a 20  MODE_WAL).  ){. 
35820 20 20 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f     if( !db->auto
35830 43 6f 6d 6d 69 74 20 7c 7c 20 64 62 2d 3e 6e 56  Commit || db->nV
35840 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
35850 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
35860 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
35870 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a  te3VdbeError(p,.
35880 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
35890 74 20 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20  t change %s wal 
358a0 6d 6f 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  mode from within
358b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c   a transaction",
358c0 0a 20 20 20 20 20 20 20 20 20 20 28 65 4e 65 77  .          (eNew
358d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
358e0 4f 44 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22  ODE_WAL ? "into"
358f0 20 3a 20 22 6f 75 74 20 6f 66 22 29 0a 20 20 20   : "out of").   
35900 20 20 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f     );.      goto
35910 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
35920 72 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ror;.    }else{.
35930 20 0a 20 20 20 20 20 20 69 66 28 20 65 4f 6c 64   .      if( eOld
35940 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35950 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
35960 20 20 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67     /* If leaving
35970 20 57 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65   WAL mode, close
35980 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
35990 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
359a0 65 20 63 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e call.        *
359b0 2a 20 74 6f 20 50 61 67 65 72 43 6c 6f 73 65 57  * to PagerCloseW
359c0 61 6c 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73  al() checkpoints
359d0 20 61 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65   and deletes the
359e0 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
359f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c   .        ** fil
35a00 65 2e 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  e. An EXCLUSIVE 
35a10 6c 6f 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62  lock may still b
35a20 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
35a30 74 61 62 61 73 65 20 66 69 6c 65 20 0a 20 20 20  tabase file .   
35a40 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 61 20       ** after a 
35a50 73 75 63 63 65 73 73 66 75 6c 20 72 65 74 75 72  successful retur
35a60 6e 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  n. .        */. 
35a70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35a80 74 65 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c  te3PagerCloseWal
35a90 28 70 50 61 67 65 72 2c 20 64 62 29 3b 0a 20 20  (pPager, db);.  
35aa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
35ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35ac0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
35ad0 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rSetJournalMode(
35ae0 70 50 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20  pPager, eNew);. 
35af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35b00 65 6c 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50  else if( eOld==P
35b10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35b20 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
35b30 20 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61     /* Cannot tra
35b40 6e 73 69 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  nsition directly
35b50 20 66 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20   from MEMORY to 
35b60 57 41 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f  WAL.  Use mode O
35b70 46 46 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  FF.        ** as
35b80 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
35b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
35ba0 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e  te3PagerSetJourn
35bb0 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 50  alMode(pPager, P
35bc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35bd0 5f 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  _OFF);.      }. 
35be0 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   .      /* Open 
35bf0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
35c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35c10 6c 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  le. Regardless o
35c20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
35c30 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69      ** mode, thi
35c40 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c  s transaction al
35c50 77 61 79 73 20 75 73 65 73 20 61 20 72 6f 6c 6c  ways uses a roll
35c60 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
35c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
35c80 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
35c90 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d  eIsInTrans(pBt)=
35ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
35cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35cc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
35cd0 6c 69 74 65 33 42 74 72 65 65 53 65 74 56 65 72  lite3BtreeSetVer
35ce0 73 69 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d  sion(pBt, (eNew=
35cf0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
35d00 44 45 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29  DE_WAL ? 2 : 1))
35d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35d20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
35d30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35d40 5f 57 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72  _WAL */..  if( r
35d50 63 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b  c ) eNew = eOld;
35d60 0a 20 20 65 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  eNew = sqlite
35d70 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
35d80 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65  Mode(pPager, eNe
35d90 77 29 3b 0a 0a 20 20 70 4f 75 74 2d 3e 66 6c 61  w);..  pOut->fla
35da0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
35db0 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d  _Static|MEM_Term
35dc0 3b 0a 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 28 63  ;.  pOut->z = (c
35dd0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4a 6f 75  har *)sqlite3Jou
35de0 72 6e 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e 65  rnalModename(eNe
35df0 77 29 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20  w);.  pOut->n = 
35e00 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
35e10 70 4f 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74  pOut->z);.  pOut
35e20 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
35e30 54 46 38 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  TF8;.  sqlite3Vd
35e40 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
35e50 28 70 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29  (pOut, encoding)
35e60 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
35e70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
35e80 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
35e90 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
35ea0 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a  TE_OMIT_PRAGMA *
35eb0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
35ec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
35ed0 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UM) && !defined(
35ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
35ef0 43 48 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56  CH)./* Opcode: V
35f00 61 63 75 75 6d 20 50 31 20 2a 20 2a 20 2a 20 2a  acuum P1 * * * *
35f10 0a 2a 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68  .**.** Vacuum th
35f20 65 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73  e entire databas
35f30 65 20 50 31 2e 20 20 50 31 20 69 73 20 30 20 66  e P1.  P1 is 0 f
35f40 6f 72 20 22 6d 61 69 6e 22 2c 20 61 6e 64 20 32  or "main", and 2
35f50 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20   or more.** for 
35f60 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
35f70 62 61 73 65 2e 20 20 54 68 65 20 22 74 65 6d 70  base.  The "temp
35f80 22 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  " database may n
35f90 6f 74 20 62 65 20 76 61 63 75 75 6d 65 64 2e 0a  ot be vacuumed..
35fa0 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75  */.case OP_Vacuu
35fb0 6d 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  m: {.  assert( p
35fc0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
35fd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
35fe0 75 6e 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72  unVacuum(&p->zEr
35ff0 72 4d 73 67 2c 20 64 62 2c 20 70 4f 70 2d 3e 70  rMsg, db, pOp->p
36000 31 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  1);.  if( rc ) g
36010 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36020 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
36030 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
36040 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
36050 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
36060 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56  /* Opcode: IncrV
36070 61 63 75 75 6d 20 50 31 20 50 32 20 2a 20 2a 20  acuum P1 P2 * * 
36080 2a 0a 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  *.**.** Perform 
36090 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
360a0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
360b0 20 76 61 63 75 75 6d 20 70 72 6f 63 65 64 75 72   vacuum procedur
360c0 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64  e on.** the P1 d
360d0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
360e0 76 61 63 75 75 6d 20 68 61 73 20 66 69 6e 69 73  vacuum has finis
360f0 68 65 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73  hed, jump to ins
36100 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20  truction.** P2. 
36110 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20  Otherwise, fall 
36120 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
36130 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ext instruction.
36140 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72  .*/.case OP_Incr
36150 56 61 63 75 75 6d 3a 20 7b 20 20 20 20 20 20 20  Vacuum: {       
36160 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74   /* jump */.  Bt
36170 72 65 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73  ree *pBt;..  ass
36180 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
36190 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e  && pOp->p1<db->n
361a0 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
361b0 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74  DbMaskTest(p->bt
361c0 72 65 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31  reeMask, pOp->p1
361d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
361e0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
361f0 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
36200 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20  [pOp->p1].pBt;. 
36210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
36220 65 65 49 6e 63 72 56 61 63 75 75 6d 28 70 42 74  eeIncrVacuum(pBt
36230 29 3b 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54  );.  VdbeBranchT
36240 61 6b 65 6e 28 72 63 3d 3d 53 51 4c 49 54 45 5f  aken(rc==SQLITE_
36250 44 4f 4e 45 2c 32 29 3b 0a 20 20 69 66 28 20 72  DONE,2);.  if( r
36260 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21  c ){.    if( rc!
36270 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 67  =SQLITE_DONE ) g
36280 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
36290 5f 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d  _error;.    rc =
362a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
362b0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
362c0 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
362d0 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64  #endif../* Opcod
362e0 65 3a 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a  e: Expire P1 * *
362f0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65   * *.**.** Cause
36300 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
36310 74 65 6d 65 6e 74 73 20 74 6f 20 65 78 70 69 72  tements to expir
36320 65 2e 20 20 57 68 65 6e 20 61 6e 20 65 78 70 69  e.  When an expi
36330 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  red statement.**
36340 20 69 73 20 65 78 65 63 75 74 65 64 20 75 73 69   is executed usi
36350 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ng sqlite3_step(
36360 29 20 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72  ) it will either
36370 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a   automatically.*
36380 2a 20 72 65 70 72 65 70 61 72 65 20 69 74 73 65  * reprepare itse
36390 6c 66 20 28 69 66 20 69 74 20 77 61 73 20 6f 72  lf (if it was or
363a0 69 67 69 6e 61 6c 6c 79 20 63 72 65 61 74 65 64  iginally created
363b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 70   using sqlite3_p
363c0 72 65 70 61 72 65 5f 76 32 28 29 29 0a 2a 2a 20  repare_v2()).** 
363d0 6f 72 20 69 74 20 77 69 6c 6c 20 66 61 69 6c 20  or it will fail 
363e0 77 69 74 68 20 53 51 4c 49 54 45 5f 53 43 48 45  with SQLITE_SCHE
363f0 4d 41 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31  MA..** .** If P1
36400 20 69 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20   is 0, then all 
36410 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
36420 65 63 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 49  ecome expired. I
36430 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P1 is non-zero
36440 2c 0a 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74  ,.** then only t
36450 68 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65  he currently exe
36460 63 75 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  cuting statement
36470 20 69 73 20 65 78 70 69 72 65 64 2e 0a 2a 2f 0a   is expired..*/.
36480 63 61 73 65 20 4f 50 5f 45 78 70 69 72 65 3a 20  case OP_Expire: 
36490 7b 0a 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 31  {.  if( !pOp->p1
364a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
364b0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
364c0 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d  tements(db);.  }
364d0 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70  else{.    p->exp
364e0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ired = 1;.  }.  
364f0 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  break;.}..#ifnde
36500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
36510 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70  ARED_CACHE./* Op
36520 63 6f 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20  code: TableLock 
36530 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a  P1 P2 P3 P4 *.**
36540 20 53 79 6e 6f 70 73 69 73 3a 20 69 44 62 3d 50   Synopsis: iDb=P
36550 31 20 72 6f 6f 74 3d 50 32 20 77 72 69 74 65 3d  1 root=P2 write=
36560 50 33 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  P3.**.** Obtain 
36570 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74  a lock on a part
36580 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68  icular table. Th
36590 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  is instruction i
365a0 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
365b0 0a 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63  .** the shared-c
365c0 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
365d0 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  enabled. .**.** 
365e0 50 31 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  P1 is the index 
365f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
36600 69 6e 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  in sqlite3.aDb[]
36610 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
36620 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
36630 20 6c 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65   lock is acquire
36640 64 2e 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69  d.  A readlock i
36650 73 20 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33  s obtained if P3
36660 3d 3d 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74  ==0 or.** a writ
36670 65 20 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e  e lock if P3==1.
36680 0a 2a 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69  .**.** P2 contai
36690 6e 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ns the root-page
366a0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
366b0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20   lock..**.** P4 
366c0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
366d0 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f  er to the name o
366e0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
366f0 67 20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69  g locked. This i
36700 73 20 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74  s only.** used t
36710 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  o generate an er
36720 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 74  ror message if t
36730 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
36740 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63  e obtained..*/.c
36750 61 73 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b  ase OP_TableLock
36760 3a 20 7b 0a 20 20 75 38 20 69 73 57 72 69 74 65  : {.  u8 isWrite
36770 4c 6f 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e  Lock = (u8)pOp->
36780 70 33 3b 0a 20 20 69 66 28 20 69 73 57 72 69 74  p3;.  if( isWrit
36790 65 4c 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d  eLock || 0==(db-
367a0 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
367b0 61 64 55 6e 63 6f 6d 6d 69 74 29 20 29 7b 0a 20  adUncommit) ){. 
367c0 20 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70 2d     int p1 = pOp-
367d0 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72 74  >p1; .    assert
367e0 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64 62  ( p1>=0 && p1<db
367f0 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
36800 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
36810 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70 31  p->btreeMask, p1
36820 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
36830 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20   isWriteLock==0 
36840 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  || isWriteLock==
36850 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
36860 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
36870 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d 2e  ble(db->aDb[p1].
36880 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69 73  pBt, pOp->p2, is
36890 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
368a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
368b0 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  if( (rc&0xFF)==S
368c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
368d0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
368e0 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ar *z = pOp->p4.
368f0 7a 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  z;.        sqlit
36900 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
36910 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
36920 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20 7a  s locked: %s", z
36930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36940 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
36950 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  to_error;.    }.
36960 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23    }.  break;.}.#
36970 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36980 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
36990 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
369a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
369b0 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
369c0 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20 50  : VBegin * * * P
369d0 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61 79  4 *.**.** P4 may
369e0 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
369f0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
36a00 20 73 74 72 75 63 74 75 72 65 2e 20 49 66 20 73   structure. If s
36a10 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a 20  o, call the .** 
36a20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66 6f  xBegin method fo
36a30 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2a  r that table..**
36a40 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68 65  .** Also, whethe
36a50 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20 73  r or not P4 is s
36a60 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  et, check that t
36a70 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  his is not being
36a80 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20   called from.** 
36a90 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61 63  within a callbac
36aa0 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  k to a virtual t
36ab0 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65 74  able xSync() met
36ac0 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20 74  hod. If it is, t
36ad0 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
36ae0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
36af0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
36b00 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69 6e  /.case OP_VBegin
36b10 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70 56  : {.  VTable *pV
36b20 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20 70  Tab;.  pVTab = p
36b30 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20  Op->p4.pVtab;.  
36b40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
36b50 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62 29  Begin(db, pVTab)
36b60 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20 29 20  ;.  if( pVTab ) 
36b70 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
36b80 74 45 72 72 6d 73 67 28 70 2c 20 70 56 54 61 62  tErrmsg(p, pVTab
36b90 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  ->pVtab);.  if( 
36ba0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
36bb0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
36bc0 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
36bd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
36be0 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
36bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36c00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
36c10 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72 65  ./* Opcode: VCre
36c20 61 74 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ate P1 P2 * * *.
36c30 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 61 20 72 65  **.** P2 is a re
36c40 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64  gister that hold
36c50 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
36c60 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e  virtual table in
36c70 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 50 31   database .** P1
36c80 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65 61  . Call the xCrea
36c90 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  te method for th
36ca0 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73  at table..*/.cas
36cb0 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b 0a  e OP_VCreate: {.
36cc0 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20    Mem sMem;     
36cd0 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72       /* For stor
36ce0 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 62  ing the record b
36cf0 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
36d00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
36d10 61 62 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ab;  /* Name of 
36d20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
36d30 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26  e */..  memset(&
36d40 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sMem, 0, sizeof(
36d50 73 4d 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e 64  sMem));.  sMem.d
36d60 62 20 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65 63  b = db;.  /* Bec
36d70 61 75 73 65 20 50 32 20 69 73 20 61 6c 77 61 79  ause P2 is alway
36d80 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  s a static strin
36d90 67 2c 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  g, it is impossi
36da0 62 6c 65 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ble for the.  **
36db0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
36dc0 6f 70 79 28 29 20 74 6f 20 66 61 69 6c 20 2a 2f  opy() to fail */
36dd0 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d  .  assert( (aMem
36de0 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20  [pOp->p2].flags 
36df0 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29 3b  & MEM_Str)!=0 );
36e00 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65 6d  .  assert( (aMem
36e10 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73 20  [pOp->p2].flags 
36e20 26 20 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d 30  & MEM_Static)!=0
36e30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
36e40 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 26 73  e3VdbeMemCopy(&s
36e50 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  Mem, &aMem[pOp->
36e60 70 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p2]);.  assert( 
36e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
36e80 0a 20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74  .  zTab = (const
36e90 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
36ea0 61 6c 75 65 5f 74 65 78 74 28 26 73 4d 65 6d 29  alue_text(&sMem)
36eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
36ec0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
36ed0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a 54  iled );.  if( zT
36ee0 61 62 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ab ){.    rc = s
36ef0 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 72  qlite3VtabCallCr
36f00 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31  eate(db, pOp->p1
36f10 2c 20 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72 72  , zTab, &p->zErr
36f20 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
36f30 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
36f40 65 28 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28 20  e(&sMem);.  if( 
36f50 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
36f60 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
36f70 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
36f80 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
36f90 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
36fa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36fb0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
36fc0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65 73  ./* Opcode: VDes
36fd0 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20 2a  troy P1 * * P4 *
36fe0 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68 65  .**.** P4 is the
36ff0 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74 75   name of a virtu
37000 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74 61  al table in data
37010 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20 74  base P1.  Call t
37020 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74 68  he xDestroy meth
37030 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74 61  od.** of that ta
37040 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ble..*/.case OP_
37050 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64 62  VDestroy: {.  db
37060 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a 20  ->nVDestroy++;. 
37070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
37080 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62 2c  bCallDestroy(db,
37090 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
370a0 34 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44 65  4.z);.  db->nVDe
370b0 73 74 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20 72  stroy--;.  if( r
370c0 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
370d0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62  ue_to_error;.  b
370e0 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
370f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
37100 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
37110 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37120 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
37130 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65 6e  /* Opcode: VOpen
37140 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a   P1 * * P4 *.**.
37150 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
37160 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  er to a virtual 
37170 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e  table object, an
37180 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
37190 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20 69  ructure..** P1 i
371a0 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
371b0 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  r.  This opcode 
371c0 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20 74  opens a cursor t
371d0 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a  o the virtual.**
371e0 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72 65   table and store
371f0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 6e  s that cursor in
37200 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P1..*/.case OP_
37210 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65 43  VOpen: {.  VdbeC
37220 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 73  ursor *pCur;.  s
37230 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
37240 6f 72 20 2a 70 56 43 75 72 3b 0a 20 20 73 71 6c  or *pVCur;.  sql
37250 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
37260 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  ;.  const sqlite
37270 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
37280 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e;..  assert( p-
37290 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20  >bIsReader );.  
372a0 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 43 75  pCur = 0;.  pVCu
372b0 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20 3d  r = 0;.  pVtab =
372c0 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e   pOp->p4.pVtab->
372d0 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56 74  pVtab;.  if( pVt
372e0 61 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70  ab==0 || NEVER(p
372f0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30  Vtab->pModule==0
37300 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
37310 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
37320 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
37330 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to_error;.  }.  
37340 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d  pModule = pVtab-
37350 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20 3d  >pModule;.  rc =
37360 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e 28   pModule->xOpen(
37370 70 56 74 61 62 2c 20 26 70 56 43 75 72 29 3b 0a  pVtab, &pVCur);.
37380 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
37390 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
373a0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
373b0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
373c0 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49  o_error;..  /* I
373d0 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74 65  nitialize sqlite
373e0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
373f0 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70 56  se class */.  pV
37400 43 75 72 2d 3e 70 56 74 61 62 20 3d 20 70 56 74  Cur->pVtab = pVt
37410 61 62 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  ab;..  /* Initia
37420 6c 69 7a 65 20 76 64 62 65 20 63 75 72 73 6f 72  lize vdbe cursor
37430 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43 75   object */.  pCu
37440 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  r = allocateCurs
37450 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20 30  or(p, pOp->p1, 0
37460 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 56 54  , -1, CURTYPE_VT
37470 41 42 29 3b 0a 20 20 69 66 28 20 70 43 75 72 20  AB);.  if( pCur 
37480 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 75 63 2e  ){.    pCur->uc.
37490 70 56 43 75 72 20 3d 20 70 56 43 75 72 3b 0a 20  pVCur = pVCur;. 
374a0 20 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b 2b     pVtab->nRef++
374b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
374c0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
374d0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
374e0 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
374f0 56 43 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20  VCur);.    goto 
37500 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62 72  no_mem;.  }.  br
37510 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  eak;.}.#endif /*
37520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
37530 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
37540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37550 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
37560 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74 65  * Opcode: VFilte
37570 72 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a  r P1 P2 P3 P4 *.
37580 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 70 6c  ** Synopsis: ipl
37590 61 6e 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d 27  an=r[P3] zplan='
375a0 50 34 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20  P4'.**.** P1 is 
375b0 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
375c0 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50 32  using VOpen.  P2
375d0 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20 74   is an address t
375e0 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a 20  o jump to if.** 
375f0 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65 73  the filtered res
37600 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74 79  ult set is empty
37610 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65 69  ..**.** P4 is ei
37620 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 73  ther NULL or a s
37630 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20 67  tring that was g
37640 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
37650 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d 65  xBestIndex.** me
37660 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64 75  thod of the modu
37670 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70 72  le.  The interpr
37680 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  etation of the P
37690 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66 74  4 string is left
376a0 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75 6c  .** to the modul
376b0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
376c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
376d0 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ode invokes the 
376e0 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 6f  xFilter method o
376f0 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  n the virtual ta
37700 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ble specified.**
37710 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e 74   by P1.  The int
37720 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e 20  eger query plan 
37730 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46 69  parameter to xFi
37740 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 69  lter is stored i
37750 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50 33  n register.** P3
37760 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31 20  . Register P3+1 
37770 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63 20  stores the argc 
37780 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65 20  parameter to be 
37790 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a  passed to the.**
377a0 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
377b0 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32 2e   Registers P3+2.
377c0 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20 74  .P3+1+argc are t
377d0 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69 74  he argc.** addit
377e0 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 73  ional parameters
377f0 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73 65   which are passe
37800 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72 20  d to.** xFilter 
37810 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74 65  as argv. Registe
37820 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20 61  r P3+2 becomes a
37830 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73 73  rgv[0] when pass
37840 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a 2a  ed to xFilter..*
37850 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20 6d  *.** A jump is m
37860 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68 65  ade to P2 if the
37870 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74 65   result set afte
37880 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75 6c  r filtering woul
37890 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a 63  d be empty..*/.c
378a0 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20  ase OP_VFilter: 
378b0 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20  {   /* jump */. 
378c0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74   int nArg;.  int
378d0 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73 74   iQuery;.  const
378e0 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
378f0 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20  *pModule;.  Mem 
37900 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20 2a  *pQuery;.  Mem *
37910 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65 33  pArgc;.  sqlite3
37920 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
37930 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Cur;.  sqlite3_v
37940 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56 64  tab *pVtab;.  Vd
37950 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  beCursor *pCur;.
37960 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74    int res;.  int
37970 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72   i;.  Mem **apAr
37980 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20 26  g;..  pQuery = &
37990 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
379a0 20 70 41 72 67 63 20 3d 20 26 70 51 75 65 72 79   pArgc = &pQuery
379b0 5b 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70 2d  [1];.  pCur = p-
379c0 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
379d0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
379e0 56 61 6c 69 64 28 70 51 75 65 72 79 29 20 29 3b  Valid(pQuery) );
379f0 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  .  REGISTER_TRAC
37a00 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65 72  E(pOp->p3, pQuer
37a10 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  y);.  assert( pC
37a20 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  ur->eCurType==CU
37a30 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20  RTYPE_VTAB );.  
37a40 70 56 43 75 72 20 3d 20 70 43 75 72 2d 3e 75 63  pVCur = pCur->uc
37a50 2e 70 56 43 75 72 3b 0a 20 20 70 56 74 61 62 20  .pVCur;.  pVtab 
37a60 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 3b 0a  = pVCur->pVtab;.
37a70 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61    pModule = pVta
37a80 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20 2f  b->pModule;..  /
37a90 2a 20 47 72 61 62 20 74 68 65 20 69 6e 64 65 78  * Grab the index
37aa0 20 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67 63   number and argc
37ab0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
37ac0 20 61 73 73 65 72 74 28 20 28 70 51 75 65 72 79   assert( (pQuery
37ad0 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29  ->flags&MEM_Int)
37ae0 21 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66 6c  !=0 && pArgc->fl
37af0 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a  ags==MEM_Int );.
37b00 20 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70 41    nArg = (int)pA
37b10 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75 65  rgc->u.i;.  iQue
37b20 72 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72 79  ry = (int)pQuery
37b30 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e 76  ->u.i;..  /* Inv
37b40 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72 20  oke the xFilter 
37b50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73 20  method */.  res 
37b60 3d 20 30 3b 0a 20 20 61 70 41 72 67 20 3d 20 70  = 0;.  apArg = p
37b70 2d 3e 61 70 41 72 67 3b 0a 20 20 66 6f 72 28 69  ->apArg;.  for(i
37b80 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b   = 0; i<nArg; i+
37b90 2b 29 7b 0a 20 20 20 20 61 70 41 72 67 5b 69 5d  +){.    apArg[i]
37ba0 20 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b 0a   = &pArgc[i+1];.
37bb0 20 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75    }.  rc = pModu
37bc0 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 43 75  le->xFilter(pVCu
37bd0 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d 3e  r, iQuery, pOp->
37be0 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41 72  p4.z, nArg, apAr
37bf0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  g);.  sqlite3Vta
37c00 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70 2c  bImportErrmsg(p,
37c10 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20 72   pVtab);.  if( r
37c20 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  c ) goto abort_d
37c30 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 72  ue_to_error;.  r
37c40 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 45  es = pModule->xE
37c50 6f 66 28 70 56 43 75 72 29 3b 0a 20 20 70 43 75  of(pVCur);.  pCu
37c60 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a  r->nullRow = 0;.
37c70 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
37c80 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69  n(res!=0,2);.  i
37c90 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a 75  f( res ) goto ju
37ca0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61  mp_to_p2;.  brea
37cb0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
37cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
37cd0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 6e  ALTABLE */..#ifn
37ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37cf0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 20  VIRTUALTABLE./* 
37d00 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e 20  Opcode: VColumn 
37d10 50 31 20 50 32 20 50 33 20 2a 20 50 35 0a 2a 2a  P1 P2 P3 * P5.**
37d20 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
37d30 3d 76 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a  =vcolumn(P2).**.
37d40 2a 2a 20 53 74 6f 72 65 20 69 6e 20 72 65 67 69  ** Store in regi
37d50 73 74 65 72 20 50 33 20 74 68 65 20 76 61 6c 75  ster P3 the valu
37d60 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20 63  e of the P2-th c
37d70 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
37d80 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
37d90 68 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65  he virtual-table
37da0 20 6f 66 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a   of cursor P1..*
37db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 43 6f 6c  *.** If the VCol
37dc0 75 6d 6e 20 6f 70 63 6f 64 65 20 69 73 20 62 65  umn opcode is be
37dd0 69 6e 67 20 75 73 65 64 20 74 6f 20 66 65 74 63  ing used to fetc
37de0 68 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  h the value of.*
37df0 2a 20 61 6e 20 75 6e 63 68 61 6e 67 69 6e 67 20  * an unchanging 
37e00 63 6f 6c 75 6d 6e 20 64 75 72 69 6e 67 20 61 6e  column during an
37e10 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f   UPDATE operatio
37e20 6e 2c 20 74 68 65 6e 20 74 68 65 20 50 35 0a 2a  n, then the P5.*
37e30 2a 20 76 61 6c 75 65 20 69 73 20 31 2e 20 20 4f  * value is 1.  O
37e40 74 68 65 72 77 69 73 65 2c 20 50 35 20 69 73 20  therwise, P5 is 
37e50 30 2e 20 20 54 68 65 20 50 35 20 76 61 6c 75 65  0.  The P5 value
37e60 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
37e70 62 79 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  by sqlite3_vtab_
37e80 6e 6f 63 68 61 6e 67 65 28 29 20 72 6f 75 74 69  nochange() routi
37e90 6e 65 20 61 6e 64 20 63 61 6e 20 62 65 20 75 73  ne and can be us
37ea0 65 64 0a 2a 2a 20 62 79 20 76 69 72 74 75 61 6c  ed.** by virtual
37eb0 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74   table implement
37ec0 61 74 69 6f 6e 73 20 74 6f 20 72 65 74 75 72 6e  ations to return
37ed0 20 73 70 65 63 69 61 6c 20 22 6e 6f 2d 63 68 61   special "no-cha
37ee0 6e 67 65 22 0a 2a 2a 20 6d 61 72 6b 73 20 77 68  nge".** marks wh
37ef0 69 63 68 20 63 61 6e 20 62 65 20 6d 6f 72 65 20  ich can be more 
37f00 65 66 66 69 63 69 65 6e 74 2c 20 64 65 70 65 6e  efficient, depen
37f10 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 69 72 74  ding on the virt
37f20 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  ual table..*/.ca
37f30 73 65 20 4f 50 5f 56 43 6f 6c 75 6d 6e 3a 20 7b  se OP_VColumn: {
37f40 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
37f50 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20  *pVtab;.  const 
37f60 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
37f70 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d 20 2a  pModule;.  Mem *
37f80 70 44 65 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  pDest;.  sqlite3
37f90 5f 63 6f 6e 74 65 78 74 20 73 43 6f 6e 74 65 78  _context sContex
37fa0 74 3b 0a 0a 20 20 56 64 62 65 43 75 72 73 6f 72  t;..  VdbeCursor
37fb0 20 2a 70 43 75 72 20 3d 20 70 2d 3e 61 70 43 73   *pCur = p->apCs
37fc0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
37fd0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 43 75 72  sert( pCur->eCur
37fe0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 56 54  Type==CURTYPE_VT
37ff0 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AB );.  assert( 
38000 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
38010 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
38020 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
38030 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
38040 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
38050 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
38060 2c 20 70 44 65 73 74 29 3b 0a 20 20 69 66 28 20  , pDest);.  if( 
38070 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  pCur->nullRow ){
38080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
38090 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
380a0 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
380b0 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
380c0 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
380d0 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
380e0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
380f0 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
38100 2d 3e 78 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 6d  ->xColumn );.  m
38110 65 6d 73 65 74 28 26 73 43 6f 6e 74 65 78 74 2c  emset(&sContext,
38120 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 6f 6e 74   0, sizeof(sCont
38130 65 78 74 29 29 3b 0a 20 20 73 43 6f 6e 74 65 78  ext));.  sContex
38140 74 2e 70 4f 75 74 20 3d 20 70 44 65 73 74 3b 0a  t.pOut = pDest;.
38150 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b    if( pOp->p5 ){
38160 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
38170 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74  MemSetNull(pDest
38180 29 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  );.    pDest->fl
38190 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 7c 4d  ags = MEM_Null|M
381a0 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 70 44 65  EM_Zero;.    pDe
381b0 73 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 30 3b  st->u.nZero = 0;
381c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4d 65  .  }else{.    Me
381d0 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 44 65  mSetTypeFlag(pDe
381e0 73 74 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  st, MEM_Null);. 
381f0 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64 75 6c   }.  rc = pModul
38200 65 2d 3e 78 43 6f 6c 75 6d 6e 28 70 43 75 72 2d  e->xColumn(pCur-
38210 3e 75 63 2e 70 56 43 75 72 2c 20 26 73 43 6f 6e  >uc.pVCur, &sCon
38220 74 65 78 74 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a  text, pOp->p2);.
38230 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
38240 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
38250 61 62 29 3b 0a 20 20 69 66 28 20 73 43 6f 6e 74  ab);.  if( sCont
38260 65 78 74 2e 69 73 45 72 72 6f 72 3e 30 20 29 7b  ext.isError>0 ){
38270 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
38280 45 72 72 6f 72 28 70 2c 20 22 25 73 22 2c 20 73  Error(p, "%s", s
38290 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
382a0 74 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 72  t(pDest));.    r
382b0 63 20 3d 20 73 43 6f 6e 74 65 78 74 2e 69 73 45  c = sContext.isE
382c0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rror;.  }.  sqli
382d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
382e0 6f 64 69 6e 67 28 70 44 65 73 74 2c 20 65 6e 63  oding(pDest, enc
382f0 6f 64 69 6e 67 29 3b 0a 20 20 52 45 47 49 53 54  oding);.  REGIST
38300 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 33  ER_TRACE(pOp->p3
38310 2c 20 70 44 65 7