/ Hex Artifact Content
Login

Artifact a35ad51713d9be42f97e80f24cd4be5d20886a0c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ******.** The co
0180: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
0190: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 66  implements the f
01a0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 75 6e  unction that run
01b0: 73 20 74 68 65 0a 2a 2a 20 62 79 74 65 63 6f 64  s the.** bytecod
01c0: 65 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20  e of a prepared 
01d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
01e0: 20 56 61 72 69 6f 75 73 20 73 63 72 69 70 74 73   Various scripts
01f0: 20 73 63 61 6e 20 74 68 69 73 20 73 6f 75 72 63   scan this sourc
0200: 65 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  e file in order 
0210: 74 6f 20 67 65 6e 65 72 61 74 65 20 48 54 4d 4c  to generate HTML
0220: 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  .** documentatio
0230: 6e 2c 20 68 65 61 64 65 72 73 20 66 69 6c 65 73  n, headers files
0240: 2c 20 6f 72 20 6f 74 68 65 72 20 64 65 72 69 76  , or other deriv
0250: 65 64 20 66 69 6c 65 73 2e 20 20 54 68 65 20 66  ed files.  The f
0260: 6f 72 6d 61 74 74 69 6e 67 0a 2a 2a 20 6f 66 20  ormatting.** of 
0270: 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73  the code in this
0280: 20 66 69 6c 65 20 69 73 2c 20 74 68 65 72 65 66   file is, theref
0290: 6f 72 65 2c 20 69 6d 70 6f 72 74 61 6e 74 2e 20  ore, important. 
02a0: 20 53 65 65 20 6f 74 68 65 72 20 63 6f 6d 6d 65   See other comme
02b0: 6e 74 73 0a 2a 2a 20 69 6e 20 74 68 69 73 20 66  nts.** in this f
02c0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
02d0: 20 20 49 66 20 69 6e 20 64 6f 75 62 74 2c 20 64    If in doubt, d
02e0: 6f 20 6e 6f 74 20 64 65 76 69 61 74 65 20 66 72  o not deviate fr
02f0: 6f 6d 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 63  om existing.** c
0300: 6f 6d 6d 65 6e 74 69 6e 67 20 61 6e 64 20 69 6e  ommenting and in
0310: 64 65 6e 74 61 74 69 6f 6e 20 70 72 61 63 74 69  dentation practi
0320: 63 65 73 20 77 68 65 6e 20 63 68 61 6e 67 69 6e  ces when changin
0330: 67 20 6f 72 20 61 64 64 69 6e 67 20 63 6f 64 65  g or adding code
0340: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
0350: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
0360: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0370: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
0380: 68 69 73 20 6d 61 63 72 6f 20 6f 6e 20 6d 65 6d  his macro on mem
0390: 6f 72 79 20 63 65 6c 6c 73 20 6a 75 73 74 20 70  ory cells just p
03a0: 72 69 6f 72 20 74 6f 20 63 68 61 6e 67 69 6e 67  rior to changing
03b0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
03c0: 20 74 68 65 20 63 65 6c 6c 2e 20 20 54 68 69 73   the cell.  This
03d0: 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73 20   macro verifies 
03e0: 74 68 61 74 20 73 68 61 6c 6c 6f 77 20 63 6f 70  that shallow cop
03f0: 69 65 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 6d  ies are.** not m
0400: 69 73 75 73 65 64 2e 20 20 41 20 73 68 61 6c 6c  isused.  A shall
0410: 6f 77 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72  ow copy of a str
0420: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6a 75 73 74  ing or blob just
0430: 20 63 6f 70 69 65 73 20 61 0a 2a 2a 20 70 6f 69   copies a.** poi
0440: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 72 69  nter to the stri
0450: 6e 67 20 6f 72 20 62 6c 6f 62 2c 20 6e 6f 74 20  ng or blob, not 
0460: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  the content.  If
0470: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
0480: 20 69 73 20 63 68 61 6e 67 65 64 20 77 68 69 6c   is changed whil
0490: 65 20 74 68 65 20 63 6f 70 79 20 69 73 20 73 74  e the copy is st
04a0: 69 6c 6c 20 69 6e 20 75 73 65 2c 20 74 68 65 20  ill in use, the 
04b0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
04c0: 69 67 68 74 0a 2a 2a 20 62 65 20 63 68 61 6e 67  ight.** be chang
04d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
04e0: 72 20 74 68 65 20 63 6f 70 79 2e 20 20 54 68 69  r the copy.  Thi
04f0: 73 20 6d 61 63 72 6f 20 76 65 72 69 66 69 65 73  s macro verifies
0500: 20 74 68 61 74 20 6e 6f 74 68 69 6e 67 0a 2a 2a   that nothing.**
0510: 20 6c 69 6b 65 20 74 68 61 74 20 65 76 65 72 20   like that ever 
0520: 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 23 69 66 64  happens..*/.#ifd
0530: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0540: 23 20 64 65 66 69 6e 65 20 6d 65 6d 41 62 6f 75  # define memAbou
0550: 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 20 73  tToChange(P,M) s
0560: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 41 62 6f  qlite3VdbeMemAbo
0570: 75 74 54 6f 43 68 61 6e 67 65 28 50 2c 4d 29 0a  utToChange(P,M).
0580: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d  #else.# define m
0590: 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28  emAboutToChange(
05a0: 50 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  P,M).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
05d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
05e0: 65 76 65 72 79 20 74 69 6d 65 20 61 20 63 75 72  every time a cur
05f0: 73 6f 72 0a 2a 2a 20 6d 6f 76 65 73 2c 20 65 69  sor.** moves, ei
0600: 74 68 65 72 20 62 79 20 74 68 65 20 4f 50 5f 53  ther by the OP_S
0610: 65 65 6b 58 58 2c 20 4f 50 5f 4e 65 78 74 2c 20  eekXX, OP_Next, 
0620: 6f 72 20 4f 50 5f 50 72 65 76 20 6f 70 63 6f 64  or OP_Prev opcod
0630: 65 73 2e 20 20 54 68 65 20 74 65 73 74 0a 2a 2a  es.  The test.**
0640: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 20   procedures use 
0650: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
0660: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0670: 61 74 20 69 6e 64 69 63 65 73 20 61 72 65 0a 2a  at indices are.*
0680: 2a 20 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63  * working correc
0690: 74 6c 79 2e 20 20 54 68 69 73 20 76 61 72 69 61  tly.  This varia
06a0: 62 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74  ble has no funct
06b0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
06c0: 6f 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79  o.** help verify
06d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
06e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ration of the li
06f0: 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66  brary..*/.#ifdef
0700: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
0710: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
0720: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0730: 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  f../*.** When th
0740: 69 73 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  is global variab
0750: 6c 65 20 69 73 20 70 6f 73 69 74 69 76 65 2c 20  le is positive, 
0760: 69 74 20 67 65 74 73 20 64 65 63 72 65 6d 65 6e  it gets decremen
0770: 74 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 0a  ted once before.
0780: 2a 2a 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  ** each instruct
0790: 69 6f 6e 20 69 6e 20 74 68 65 20 56 44 42 45 2e  ion in the VDBE.
07a0: 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
07b0: 73 20 7a 65 72 6f 2c 20 74 68 65 20 75 31 2e 69  s zero, the u1.i
07c0: 73 49 6e 74 65 72 72 75 70 74 65 64 0a 2a 2a 20  sInterrupted.** 
07d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
07e0: 69 74 65 33 20 73 74 72 75 63 74 75 72 65 20 69  ite3 structure i
07f0: 73 20 73 65 74 20 69 6e 20 6f 72 64 65 72 20 74  s set in order t
0800: 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6e  o simulate an in
0810: 74 65 72 72 75 70 74 2e 0a 2a 2a 0a 2a 2a 20 54  terrupt..**.** T
0820: 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20  his facility is 
0830: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
0840: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
0850: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e   It does not fun
0860: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 6e 20 6f  ction.** in an o
0870: 72 64 69 6e 61 72 79 20 62 75 69 6c 64 2e 0a 2a  rdinary build..*
0880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0890: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
08a0: 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
08b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
08c0: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f  .** The next glo
08d0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
08e0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68  incremented each
08f0: 20 74 79 70 65 20 74 68 65 20 4f 50 5f 53 6f 72   type the OP_Sor
0900: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  t opcode.** is e
0910: 78 65 63 75 74 65 64 2e 20 20 54 68 65 20 74 65  xecuted.  The te
0920: 73 74 20 70 72 6f 63 65 64 75 72 65 73 20 75 73  st procedures us
0930: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
0940: 6f 6e 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  on to make sure 
0950: 74 68 61 74 0a 2a 2a 20 73 6f 72 74 69 6e 67 20  that.** sorting 
0960: 69 73 20 6f 63 63 75 72 72 69 6e 67 20 6f 72 20  is occurring or 
0970: 6e 6f 74 20 6f 63 63 75 72 72 69 6e 67 20 61 74  not occurring at
0980: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 69 6d   appropriate tim
0990: 65 73 2e 20 20 20 54 68 69 73 20 76 61 72 69 61  es.   This varia
09a0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75  ble.** has no fu
09b0: 6e 63 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nction other tha
09c0: 6e 20 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79  n to help verify
09d0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
09e0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  ration of the.**
09f0: 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66   library..*/.#if
0a00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0a10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74  int sqlite3_sort
0a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
0a30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 65  if../*.** The ne
0a40: 78 74 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  xt global variab
0a50: 6c 65 20 72 65 63 6f 72 64 73 20 74 68 65 20 73  le records the s
0a60: 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
0a70: 73 74 20 4d 45 4d 5f 42 6c 6f 62 0a 2a 2a 20 6f  st MEM_Blob.** o
0a80: 72 20 4d 45 4d 5f 53 74 72 20 74 68 61 74 20 68  r MEM_Str that h
0a90: 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 79 20  as been used by 
0aa0: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 2e 20 20  a VDBE opcode.  
0ab0: 54 68 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  The test procedu
0ac0: 72 65 73 0a 2a 2a 20 75 73 65 20 74 68 69 73 20  res.** use this 
0ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6d  information to m
0ae0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
0af0: 65 20 7a 65 72 6f 2d 62 6c 6f 62 20 66 75 6e 63  e zero-blob func
0b00: 74 69 6f 6e 61 6c 69 74 79 0a 2a 2a 20 69 73 20  tionality.** is 
0b10: 77 6f 72 6b 69 6e 67 20 63 6f 72 72 65 63 74 6c  working correctl
0b20: 79 2e 20 20 20 54 68 69 73 20 76 61 72 69 61 62  y.   This variab
0b30: 6c 65 20 68 61 73 20 6e 6f 20 66 75 6e 63 74 69  le has no functi
0b40: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 6f  on other than to
0b50: 0a 2a 2a 20 68 65 6c 70 20 76 65 72 69 66 79 20  .** help verify 
0b60: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  the correct oper
0b70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  ation of the lib
0b80: 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rary..*/.#ifdef 
0b90: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
0ba0: 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
0bb0: 73 69 7a 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  size = 0;.static
0bc0: 20 76 6f 69 64 20 75 70 64 61 74 65 4d 61 78 42   void updateMaxB
0bd0: 6c 6f 62 73 69 7a 65 28 4d 65 6d 20 2a 70 29 7b  lobsize(Mem *p){
0be0: 0a 20 20 69 66 28 20 28 70 2d 3e 66 6c 61 67 73  .  if( (p->flags
0bf0: 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f   & (MEM_Str|MEM_
0c00: 42 6c 6f 62 29 29 21 3d 30 20 26 26 20 70 2d 3e  Blob))!=0 && p->
0c10: 6e 3e 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  n>sqlite3_max_bl
0c20: 6f 62 73 69 7a 65 20 29 7b 0a 20 20 20 20 73 71  obsize ){.    sq
0c30: 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
0c40: 7a 65 20 3d 20 70 2d 3e 6e 3b 0a 20 20 7d 0a 7d  ze = p->n;.  }.}
0c50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0c60: 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61  his macro evalua
0c70: 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 65  tes to true if e
0c80: 69 74 68 65 72 20 74 68 65 20 75 70 64 61 74 65  ither the update
0c90: 20 68 6f 6f 6b 20 6f 72 20 74 68 65 20 70 72 65   hook or the pre
0ca0: 75 70 64 61 74 65 0a 2a 2a 20 68 6f 6f 6b 20 61  update.** hook a
0cb0: 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 64  re enabled for d
0cc0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 20  atabase connect 
0cd0: 44 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  DB..*/.#ifdef SQ
0ce0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
0cf0: 50 44 41 54 45 5f 48 4f 4f 4b 0a 23 20 64 65 66  PDATE_HOOK.# def
0d00: 69 6e 65 20 48 41 53 5f 55 50 44 41 54 45 5f 48  ine HAS_UPDATE_H
0d10: 4f 4f 4b 28 44 42 29 20 28 28 44 42 29 2d 3e 78  OOK(DB) ((DB)->x
0d20: 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
0d30: 6b 7c 7c 28 44 42 29 2d 3e 78 55 70 64 61 74 65  k||(DB)->xUpdate
0d40: 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6c 73 65 0a  Callback).#else.
0d50: 23 20 64 65 66 69 6e 65 20 48 41 53 5f 55 50 44  # define HAS_UPD
0d60: 41 54 45 5f 48 4f 4f 4b 28 44 42 29 20 28 28 44  ATE_HOOK(DB) ((D
0d70: 42 29 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  B)->xUpdateCallb
0d80: 61 63 6b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ack).#endif../*.
0d90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 6c 6f 62  ** The next glob
0da0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
0db0: 6e 63 72 65 6d 65 6e 74 65 64 20 65 61 63 68 20  ncremented each 
0dc0: 74 69 6d 65 20 74 68 65 20 4f 50 5f 46 6f 75 6e  time the OP_Foun
0dd0: 64 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 65  d opcode.** is e
0de0: 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 69 73  xecuted. This is
0df0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 77 68   used to test wh
0e00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
0e10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 0a 2a 2a 20   foreign key.** 
0e20: 6f 70 65 72 61 74 69 6f 6e 20 69 6d 70 6c 65 6d  operation implem
0e30: 65 6e 74 65 64 20 75 73 69 6e 67 20 4f 50 5f 46  ented using OP_F
0e40: 6b 49 73 5a 65 72 6f 20 69 73 20 77 6f 72 6b 69  kIsZero is worki
0e50: 6e 67 2e 20 54 68 69 73 20 76 61 72 69 61 62 6c  ng. This variabl
0e60: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 66 75 6e 63  e.** has no func
0e70: 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
0e80: 74 6f 20 68 65 6c 70 20 76 65 72 69 66 79 20 74  to help verify t
0e90: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0ea0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  tion of the.** l
0eb0: 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 66 64 65  ibrary..*/.#ifde
0ec0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
0ed0: 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
0ee0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
0ef0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 61 20  f../*.** Test a 
0f00: 72 65 67 69 73 74 65 72 20 74 6f 20 73 65 65 20  register to see 
0f10: 69 66 20 69 74 20 65 78 63 65 65 64 73 20 74 68  if it exceeds th
0f20: 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
0f30: 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2a 20  m blob size..** 
0f40: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 63 6f  If it does, reco
0f50: 72 64 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d  rd the new maxim
0f60: 75 6d 20 62 6c 6f 62 20 73 69 7a 65 2e 0a 2a 2f  um blob size..*/
0f70: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0f80: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0f90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54  fined(SQLITE_UNT
0fa0: 45 53 54 41 42 4c 45 29 0a 23 20 64 65 66 69 6e  ESTABLE).# defin
0fb0: 65 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f  e UPDATE_MAX_BLO
0fc0: 42 53 49 5a 45 28 50 29 20 20 75 70 64 61 74 65  BSIZE(P)  update
0fd0: 4d 61 78 42 6c 6f 62 73 69 7a 65 28 50 29 0a 23  MaxBlobsize(P).#
0fe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55 50  else.# define UP
0ff0: 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49 5a  DATE_MAX_BLOBSIZ
1000: 45 28 50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(P).#endif../*.
1010: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 56 44  ** Invoke the VD
1020: 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1030: 62 61 63 6b 2c 20 69 66 20 74 68 61 74 20 63 61  back, if that ca
1040: 6c 6c 62 61 63 6b 20 69 73 20 64 65 66 69 6e 65  llback is define
1050: 64 2e 20 20 54 68 69 73 0a 2a 2a 20 66 65 61 74  d.  This.** feat
1060: 75 72 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ure is used for 
1070: 74 65 73 74 20 73 75 69 74 65 20 76 61 6c 69 64  test suite valid
1080: 61 74 69 6f 6e 20 6f 6e 6c 79 20 61 6e 64 20 64  ation only and d
1090: 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 61  oes not appear a
10a0: 6e 0a 2a 2a 20 70 72 6f 64 75 63 74 69 6f 6e 20  n.** production 
10b0: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 4d 20  builds..**.** M 
10c0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 32  is an integer, 2
10d0: 20 6f 72 20 33 2c 20 74 68 61 74 20 69 6e 64 69   or 3, that indi
10e0: 63 65 73 20 68 6f 77 20 6d 61 6e 79 20 64 69 66  ces how many dif
10f0: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 65 0a  ferent ways the.
1100: 2a 2a 20 62 72 61 6e 63 68 20 63 61 6e 20 67 6f  ** branch can go
1110: 2e 20 20 49 74 20 69 73 20 75 73 75 61 6c 6c 79  .  It is usually
1120: 20 32 2e 20 20 22 49 22 20 69 73 20 74 68 65 20   2.  "I" is the 
1130: 64 69 72 65 63 74 69 6f 6e 20 74 68 65 20 62 72  direction the br
1140: 61 6e 63 68 0a 2a 2a 20 67 6f 65 73 2e 20 20 30  anch.** goes.  0
1150: 20 6d 65 61 6e 73 20 66 61 6c 6c 73 20 74 68 72   means falls thr
1160: 6f 75 67 68 2e 20 20 31 20 6d 65 61 6e 73 20 62  ough.  1 means b
1170: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2e 20  ranch is taken. 
1180: 20 32 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20   2 means the.** 
1190: 73 65 63 6f 6e 64 20 61 6c 74 65 72 6e 61 74 69  second alternati
11a0: 76 65 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  ve branch is tak
11b0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 69 53 72 63 4c 69  en..**.** iSrcLi
11c0: 6e 65 20 69 73 20 74 68 65 20 73 6f 75 72 63 65  ne is the source
11d0: 20 63 6f 64 65 20 6c 69 6e 65 20 28 66 72 6f 6d   code line (from
11e0: 20 74 68 65 20 5f 5f 4c 49 4e 45 5f 5f 20 6d 61   the __LINE__ ma
11f0: 63 72 6f 29 20 74 68 61 74 0a 2a 2a 20 67 65 6e  cro) that.** gen
1200: 65 72 61 74 65 64 20 74 68 65 20 56 44 42 45 20  erated the VDBE 
1210: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
1220: 69 73 20 69 6e 73 74 72 75 6d 65 6e 74 61 74 69  is instrumentati
1230: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1240: 61 6c 6c 0a 2a 2a 20 73 6f 75 72 63 65 20 63 6f  all.** source co
1250: 64 65 20 69 73 20 69 6e 20 61 20 73 69 6e 67 6c  de is in a singl
1260: 65 20 66 69 6c 65 20 28 74 68 65 20 61 6d 61 6c  e file (the amal
1270: 67 61 6d 61 74 69 6f 6e 29 2e 20 20 53 70 65 63  gamation).  Spec
1280: 69 61 6c 20 76 61 6c 75 65 73 20 31 0a 2a 2a 20  ial values 1.** 
1290: 61 6e 64 20 32 20 66 6f 72 20 74 68 65 20 69 53  and 2 for the iS
12a0: 72 63 4c 69 6e 65 20 70 61 72 61 6d 65 74 65 72  rcLine parameter
12b0: 20 6d 65 61 6e 20 74 68 61 74 20 74 68 69 73 20   mean that this 
12c0: 70 61 72 74 69 63 75 6c 61 72 20 62 72 61 6e 63  particular branc
12d0: 68 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 74  h is.** always t
12e0: 61 6b 65 6e 20 6f 72 20 6e 65 76 65 72 20 74 61  aken or never ta
12f0: 6b 65 6e 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ken, respectivel
1300: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
1310: 65 64 28 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ed(SQLITE_VDBE_C
1320: 4f 56 45 52 41 47 45 29 0a 23 20 64 65 66 69 6e  OVERAGE).# defin
1330: 65 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65  e VdbeBranchTake
1340: 6e 28 49 2c 4d 29 0a 23 65 6c 73 65 0a 23 20 64  n(I,M).#else.# d
1350: 65 66 69 6e 65 20 56 64 62 65 42 72 61 6e 63 68  efine VdbeBranch
1360: 54 61 6b 65 6e 28 49 2c 4d 29 20 76 64 62 65 54  Taken(I,M) vdbeT
1370: 61 6b 65 42 72 61 6e 63 68 28 70 4f 70 2d 3e 69  akeBranch(pOp->i
1380: 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 0a 20 20 73  SrcLine,I,M).  s
1390: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 54  tatic void vdbeT
13a0: 61 6b 65 42 72 61 6e 63 68 28 69 6e 74 20 69 53  akeBranch(int iS
13b0: 72 63 4c 69 6e 65 2c 20 75 38 20 49 2c 20 75 38  rcLine, u8 I, u8
13c0: 20 4d 29 7b 0a 20 20 20 20 69 66 28 20 69 53 72   M){.    if( iSr
13d0: 63 4c 69 6e 65 3c 3d 32 20 26 26 20 41 4c 57 41  cLine<=2 && ALWA
13e0: 59 53 28 69 53 72 63 4c 69 6e 65 3e 30 29 20 29  YS(iSrcLine>0) )
13f0: 7b 0a 20 20 20 20 20 20 4d 20 3d 20 69 53 72 63  {.      M = iSrc
1400: 4c 69 6e 65 3b 0a 20 20 20 20 20 20 2f 2a 20 41  Line;.      /* A
1410: 73 73 65 72 74 20 74 68 65 20 74 72 75 74 68 20  ssert the truth 
1420: 6f 66 20 56 64 62 65 43 6f 76 65 72 61 67 65 41  of VdbeCoverageA
1430: 6c 77 61 79 73 54 61 6b 65 6e 28 29 20 61 6e 64  lwaysTaken() and
1440: 20 0a 20 20 20 20 20 20 2a 2a 20 56 64 62 65 43   .      ** VdbeC
1450: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
1460: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  n() */.      ass
1470: 65 72 74 28 20 28 4d 20 26 20 49 29 3d 3d 49 20  ert( (M & I)==I 
1480: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1490: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
14a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14b0: 65 42 72 61 6e 63 68 3d 3d 30 20 29 20 72 65 74  eBranch==0 ) ret
14c0: 75 72 6e 3b 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a  urn;  /*NO_TEST*
14d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
14e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
14f0: 65 42 72 61 6e 63 68 28 73 71 6c 69 74 65 33 47  eBranch(sqlite3G
1500: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1510: 65 42 72 61 6e 63 68 41 72 67 2c 0a 20 20 20 20  eBranchArg,.    
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 69 53 72 63 4c 69 6e 65 2c 49 2c 4d 29 3b    iSrcLine,I,M);
1550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1560: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
1570: 20 74 68 65 20 67 69 76 65 6e 20 72 65 67 69 73   the given regis
1580: 74 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ter into a strin
1590: 67 20 69 66 20 69 74 20 69 73 6e 27 74 20 6f 6e  g if it isn't on
15a0: 65 0a 2a 2a 20 61 6c 72 65 61 64 79 2e 20 52 65  e.** already. Re
15b0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
15c0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
15d0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74  s..*/.#define St
15e0: 72 69 6e 67 69 66 79 28 50 2c 20 65 6e 63 29 20  ringify(P, enc) 
15f0: 5c 0a 20 20 20 69 66 28 28 28 50 29 2d 3e 66 6c  \.   if(((P)->fl
1600: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
1610: 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 73 71  _Blob))==0 && sq
1620: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69  lite3VdbeMemStri
1630: 6e 67 69 66 79 28 50 2c 65 6e 63 2c 30 29 29 20  ngify(P,enc,0)) 
1640: 5c 0a 20 20 20 20 20 7b 20 67 6f 74 6f 20 6e 6f  \.     { goto no
1650: 5f 6d 65 6d 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 41  _mem; }../*.** A
1660: 6e 20 65 70 68 65 6d 65 72 61 6c 20 73 74 72 69  n ephemeral stri
1670: 6e 67 20 76 61 6c 75 65 20 28 73 69 67 6e 69 66  ng value (signif
1680: 69 65 64 20 62 79 20 74 68 65 20 4d 45 4d 5f 45  ied by the MEM_E
1690: 70 68 65 6d 20 66 6c 61 67 29 20 63 6f 6e 74 61  phem flag) conta
16a0: 69 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ins.** a pointer
16b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
16c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
16d0: 6e 67 20 77 68 65 72 65 20 73 6f 6d 65 20 6f 74  ng where some ot
16e0: 68 65 72 20 65 6e 74 69 74 79 0a 2a 2a 20 69 73  her entity.** is
16f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1700: 20 64 65 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68   deallocating th
1710: 61 74 20 73 74 72 69 6e 67 2e 20 20 42 65 63 61  at string.  Beca
1720: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
1730: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  .** does not con
1740: 74 72 6f 6c 20 74 68 65 20 73 74 72 69 6e 67 2c  trol the string,
1750: 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 65 6c   it might be del
1760: 65 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  eted without the
1770: 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 6b 6e 6f   register.** kno
1780: 77 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  wing it..**.** T
1790: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
17a0: 65 72 74 73 20 61 6e 20 65 70 68 65 6d 65 72 61  erts an ephemera
17b0: 6c 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  l string into a 
17c0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
17d0: 63 61 74 65 64 0a 2a 2a 20 73 74 72 69 6e 67 20  cated.** string 
17e0: 74 68 61 74 20 74 68 65 20 72 65 67 69 73 74 65  that the registe
17f0: 72 20 69 74 73 65 6c 66 20 63 6f 6e 74 72 6f 6c  r itself control
1800: 73 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  s.  In other wor
1810: 64 73 2c 20 69 74 0a 2a 2a 20 63 6f 6e 76 65 72  ds, it.** conver
1820: 74 73 20 61 6e 20 4d 45 4d 5f 45 70 68 65 6d 20  ts an MEM_Ephem 
1830: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 73 74  string into a st
1840: 72 69 6e 67 20 77 69 74 68 20 50 2e 7a 3d 3d 50  ring with P.z==P
1850: 2e 7a 4d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 23 64 65  .zMalloc..*/.#de
1860: 66 69 6e 65 20 44 65 65 70 68 65 6d 65 72 61 6c  fine Deephemeral
1870: 69 7a 65 28 50 29 20 5c 0a 20 20 20 69 66 28 20  ize(P) \.   if( 
1880: 28 28 50 29 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  ((P)->flags&MEM_
1890: 45 70 68 65 6d 29 21 3d 30 20 5c 0a 20 20 20 20  Ephem)!=0 \.    
18a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 56 64 62     && sqlite3Vdb
18b0: 65 4d 65 6d 4d 61 6b 65 57 72 69 74 65 61 62 6c  eMemMakeWriteabl
18c0: 65 28 50 29 20 29 7b 20 67 6f 74 6f 20 6e 6f 5f  e(P) ){ goto no_
18d0: 6d 65 6d 3b 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  mem;}../* Return
18e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
18f0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 75  sor was opened u
1900: 73 69 6e 67 20 74 68 65 20 4f 50 5f 4f 70 65 6e  sing the OP_Open
1910: 53 6f 72 74 65 72 20 6f 70 63 6f 64 65 2e 20 2a  Sorter opcode. *
1920: 2f 0a 23 64 65 66 69 6e 65 20 69 73 53 6f 72 74  /.#define isSort
1930: 65 72 28 78 29 20 28 28 78 29 2d 3e 65 43 75 72  er(x) ((x)->eCur
1940: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 53 4f  Type==CURTYPE_SO
1950: 52 54 45 52 29 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  RTER)../*.** All
1960: 6f 63 61 74 65 20 56 64 62 65 43 75 72 73 6f 72  ocate VdbeCursor
1970: 20 6e 75 6d 62 65 72 20 69 43 75 72 2e 20 20 52   number iCur.  R
1980: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1990: 74 6f 20 69 74 2e 20 20 52 65 74 75 72 6e 20 4e  to it.  Return N
19a0: 55 4c 4c 0a 2a 2a 20 69 66 20 77 65 20 72 75 6e  ULL.** if we run
19b0: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a   out of memory..
19c0: 2a 2f 0a 73 74 61 74 69 63 20 56 64 62 65 43 75  */.static VdbeCu
19d0: 72 73 6f 72 20 2a 61 6c 6c 6f 63 61 74 65 43 75  rsor *allocateCu
19e0: 72 73 6f 72 28 0a 20 20 56 64 62 65 20 2a 70 2c  rsor(.  Vdbe *p,
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a00: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1a10: 68 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  hine */.  int iC
1a20: 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
1a30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
1a40: 6e 65 77 20 56 64 62 65 43 75 72 73 6f 72 20 2a  new VdbeCursor *
1a50: 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20  /.  int nField, 
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a70: 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e  ber of fields in
1a80: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1a90: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  dex */.  int iDb
1aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1ab0: 2a 20 44 61 74 61 62 61 73 65 20 74 68 65 20 63  * Database the c
1ac0: 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ad0: 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 75 38 20  , or -1 */.  u8 
1ae0: 65 43 75 72 54 79 70 65 20 20 20 20 20 20 20 20  eCurType        
1af0: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
1b00: 65 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  e new cursor */.
1b10: 29 7b 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ){.  /* Find the
1b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1b30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
1b40: 6f 20 73 74 6f 72 65 20 74 68 65 20 62 6c 6f 62  o store the blob
1b50: 20 6f 66 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20   of memory.  ** 
1b60: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69  required for thi
1b70: 73 20 56 64 62 65 43 75 72 73 6f 72 20 73 74 72  s VdbeCursor str
1b80: 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 63 6f  ucture. It is co
1b90: 6e 76 65 6e 69 65 6e 74 20 74 6f 20 75 73 65 20  nvenient to use 
1ba0: 61 20 0a 20 20 2a 2a 20 76 64 62 65 20 6d 65 6d  a .  ** vdbe mem
1bb0: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 6d 61 6e 61  ory cell to mana
1bc0: 67 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  ge the memory al
1bd0: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 69 72 65  location require
1be0: 64 20 66 6f 72 20 61 0a 20 20 2a 2a 20 56 64 62  d for a.  ** Vdb
1bf0: 65 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  eCursor structur
1c00: 65 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  e for the follow
1c10: 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 20 20 2a  ing reasons:.  *
1c20: 2a 0a 20 20 2a 2a 20 20 20 2a 20 53 6f 6d 65 74  *.  **   * Somet
1c30: 69 6d 65 73 20 63 75 72 73 6f 72 20 6e 75 6d 62  imes cursor numb
1c40: 65 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ers are used for
1c50: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
1c60: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 20  ferent.  **     
1c70: 70 75 72 70 6f 73 65 73 20 69 6e 20 61 20 76 64  purposes in a vd
1c80: 62 65 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  be program. The 
1c90: 64 69 66 66 65 72 65 6e 74 20 75 73 65 73 20 6d  different uses m
1ca0: 69 67 68 74 20 72 65 71 75 69 72 65 0a 20 20 2a  ight require.  *
1cb0: 2a 20 20 20 20 20 64 69 66 66 65 72 65 6e 74 20  *     different 
1cc0: 73 69 7a 65 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  sized allocation
1cd0: 73 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  s. Memory cells 
1ce0: 70 72 6f 76 69 64 65 20 67 72 6f 77 61 62 6c 65  provide growable
1cf0: 0a 20 20 2a 2a 20 20 20 20 20 61 6c 6c 6f 63 61  .  **     alloca
1d00: 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tions..  **.  **
1d10: 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67 20     * When using 
1d20: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
1d30: 4e 41 47 45 4d 45 4e 54 2c 20 6d 65 6d 6f 72 79  NAGEMENT, memory
1d40: 20 63 65 6c 6c 20 62 75 66 66 65 72 73 20 63 61   cell buffers ca
1d50: 6e 0a 20 20 2a 2a 20 20 20 20 20 62 65 20 66 72  n.  **     be fr
1d60: 65 65 64 20 6c 61 7a 69 6c 79 20 76 69 61 20 74  eed lazily via t
1d70: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  he sqlite3_relea
1d80: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 41 50 49 2e  se_memory() API.
1d90: 20 54 68 69 73 0a 20 20 2a 2a 20 20 20 20 20 6d   This.  **     m
1da0: 69 6e 69 6d 69 7a 65 73 20 74 68 65 20 6e 75 6d  inimizes the num
1db0: 62 65 72 20 6f 66 20 6d 61 6c 6c 6f 63 20 63 61  ber of malloc ca
1dc0: 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  lls made by the 
1dd0: 73 79 73 74 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  system..  **.  *
1de0: 2a 20 54 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  * The memory cel
1df0: 6c 20 66 6f 72 20 63 75 72 73 6f 72 20 30 20 69  l for cursor 0 i
1e00: 73 20 61 4d 65 6d 5b 30 5d 2e 20 54 68 65 20 72  s aMem[0]. The r
1e10: 65 73 74 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  est are allocate
1e20: 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1e30: 74 6f 70 20 6f 66 20 74 68 65 20 72 65 67 69 73  top of the regis
1e40: 74 65 72 20 73 70 61 63 65 2e 20 20 43 75 72 73  ter space.  Curs
1e50: 6f 72 20 31 20 69 73 20 61 74 20 4d 65 6d 5b 70  or 1 is at Mem[p
1e60: 2d 3e 6e 4d 65 6d 2d 31 5d 2e 0a 20 20 2a 2a 20  ->nMem-1]..  ** 
1e70: 43 75 72 73 6f 72 20 32 20 69 73 20 61 74 20 4d  Cursor 2 is at M
1e80: 65 6d 5b 70 2d 3e 6e 4d 65 6d 2d 32 5d 2e 20 41  em[p->nMem-2]. A
1e90: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 20 20 2a  nd so forth..  *
1ea0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
1eb0: 69 43 75 72 3e 30 20 3f 20 26 70 2d 3e 61 4d 65  iCur>0 ? &p->aMe
1ec0: 6d 5b 70 2d 3e 6e 4d 65 6d 2d 69 43 75 72 5d 20  m[p->nMem-iCur] 
1ed0: 3a 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 69 6e  : p->aMem;..  in
1ee0: 74 20 6e 42 79 74 65 3b 0a 20 20 56 64 62 65 43  t nByte;.  VdbeC
1ef0: 75 72 73 6f 72 20 2a 70 43 78 20 3d 20 30 3b 0a  ursor *pCx = 0;.
1f00: 20 20 6e 42 79 74 65 20 3d 20 0a 20 20 20 20 20    nByte = .     
1f10: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
1f20: 64 62 65 43 75 72 73 6f 72 29 29 20 2b 20 32 2a  dbeCursor)) + 2*
1f30: 73 69 7a 65 6f 66 28 75 33 32 29 2a 6e 46 69 65  sizeof(u32)*nFie
1f40: 6c 64 20 2b 20 0a 20 20 20 20 20 20 28 65 43 75  ld + .      (eCu
1f50: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
1f60: 54 52 45 45 3f 73 71 6c 69 74 65 33 42 74 72 65  TREE?sqlite3Btre
1f70: 65 43 75 72 73 6f 72 53 69 7a 65 28 29 3a 30 29  eCursorSize():0)
1f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 75  ;..  assert( iCu
1f90: 72 3e 3d 30 20 26 26 20 69 43 75 72 3c 70 2d 3e  r>=0 && iCur<p->
1fa0: 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 69 66 28  nCursor );.  if(
1fb0: 20 70 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20   p->apCsr[iCur] 
1fc0: 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f  ){ /*OPTIMIZATIO
1fd0: 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20  N-IF-FALSE*/.   
1fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
1ff0: 43 75 72 73 6f 72 28 70 2c 20 70 2d 3e 61 70 43  Cursor(p, p->apC
2000: 73 72 5b 69 43 75 72 5d 29 3b 0a 20 20 20 20 70  sr[iCur]);.    p
2010: 2d 3e 61 70 43 73 72 5b 69 43 75 72 5d 20 3d 20  ->apCsr[iCur] = 
2020: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  0;.  }.  if( SQL
2030: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
2040: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
2050: 73 69 7a 65 28 70 4d 65 6d 2c 20 6e 42 79 74 65  size(pMem, nByte
2060: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 61 70 43 73  ) ){.    p->apCs
2070: 72 5b 69 43 75 72 5d 20 3d 20 70 43 78 20 3d 20  r[iCur] = pCx = 
2080: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 70 4d 65  (VdbeCursor*)pMe
2090: 6d 2d 3e 7a 3b 0a 20 20 20 20 6d 65 6d 73 65 74  m->z;.    memset
20a0: 28 70 43 78 2c 20 30 2c 20 6f 66 66 73 65 74 6f  (pCx, 0, offseto
20b0: 66 28 56 64 62 65 43 75 72 73 6f 72 2c 70 41 6c  f(VdbeCursor,pAl
20c0: 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 20 20 70  tCursor));.    p
20d0: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 3d 20 65  Cx->eCurType = e
20e0: 43 75 72 54 79 70 65 3b 0a 20 20 20 20 70 43 78  CurType;.    pCx
20f0: 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->iDb = iDb;.   
2100: 20 70 43 78 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e   pCx->nField = n
2110: 46 69 65 6c 64 3b 0a 20 20 20 20 70 43 78 2d 3e  Field;.    pCx->
2120: 61 4f 66 66 73 65 74 20 3d 20 26 70 43 78 2d 3e  aOffset = &pCx->
2130: 61 54 79 70 65 5b 6e 46 69 65 6c 64 5d 3b 0a 20  aType[nField];. 
2140: 20 20 20 69 66 28 20 65 43 75 72 54 79 70 65 3d     if( eCurType=
2150: 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2160: 7b 0a 20 20 20 20 20 20 70 43 78 2d 3e 75 63 2e  {.      pCx->uc.
2170: 70 43 75 72 73 6f 72 20 3d 20 28 42 74 43 75 72  pCursor = (BtCur
2180: 73 6f 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  sor*).          
2190: 26 70 4d 65 6d 2d 3e 7a 5b 52 4f 55 4e 44 38 28  &pMem->z[ROUND8(
21a0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
21b0: 72 29 29 2b 32 2a 73 69 7a 65 6f 66 28 75 33 32  r))+2*sizeof(u32
21c0: 29 2a 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20  )*nField];.     
21d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e0: 73 6f 72 5a 65 72 6f 28 70 43 78 2d 3e 75 63 2e  sorZero(pCx->uc.
21f0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
2200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 78    }.  return pCx
2210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
2220: 6f 20 63 6f 6e 76 65 72 74 20 61 20 76 61 6c 75  o convert a valu
2230: 65 20 69 6e 74 6f 20 61 20 6e 75 6d 65 72 69 63  e into a numeric
2240: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2250: 69 66 20 77 65 20 63 61 6e 0a 2a 2a 20 64 6f 20  if we can.** do 
2260: 73 6f 20 77 69 74 68 6f 75 74 20 6c 6f 73 73 20  so without loss 
2270: 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  of information. 
2280: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2290: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a 2a   if the string.*
22a0: 2a 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 6e  * looks like a n
22b0: 75 6d 62 65 72 2c 20 63 6f 6e 76 65 72 74 20 69  umber, convert i
22c0: 74 20 69 6e 74 6f 20 61 20 6e 75 6d 62 65 72 2e  t into a number.
22d0: 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
22e0: 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20  .** look like a 
22f0: 6e 75 6d 62 65 72 2c 20 6c 65 61 76 65 20 69 74  number, leave it
2300: 20 61 6c 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   alone..**.** If
2310: 20 74 68 65 20 62 54 72 79 46 6f 72 49 6e 74 20   the bTryForInt 
2320: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2330: 65 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74 20  en extra effort 
2340: 69 73 20 6d 61 64 65 20 74 6f 20 67 69 76 65 0a  is made to give.
2350: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  ** an integer re
2360: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 20 53  presentation.  S
2370: 74 72 69 6e 67 73 20 74 68 61 74 20 6c 6f 6f 6b  trings that look
2380: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
2390: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 73 20 62  oint.** values b
23a0: 75 74 20 77 68 69 63 68 20 68 61 76 65 20 6e 6f  ut which have no
23b0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 63 6f 6d 70   fractional comp
23c0: 6f 6e 65 6e 74 20 28 65 78 61 6d 70 6c 65 3a 20  onent (example: 
23d0: 27 34 38 2e 30 30 27 29 0a 2a 2a 20 77 69 6c 6c  '48.00').** will
23e0: 20 68 61 76 65 20 61 20 4d 45 4d 5f 49 6e 74 20   have a MEM_Int 
23f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 77  representation w
2400: 68 65 6e 20 62 54 72 79 46 6f 72 49 6e 74 20 69  hen bTryForInt i
2410: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
2420: 20 62 54 72 79 46 6f 72 49 6e 74 20 69 73 20 66   bTryForInt is f
2430: 61 6c 73 65 2c 20 74 68 65 6e 20 69 66 20 74 68  alse, then if th
2440: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
2450: 6f 6e 74 61 69 6e 73 20 61 20 64 65 63 69 6d 61  ontains a decima
2460: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 6f 72 20 65 78  l.** point or ex
2470: 70 6f 6e 65 6e 74 69 61 6c 20 6e 6f 74 61 74 69  ponential notati
2480: 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 69  on, the result i
2490: 73 20 6f 6e 6c 79 20 4d 45 4d 5f 52 65 61 6c 2c  s only MEM_Real,
24a0: 20 65 76 65 6e 0a 2a 2a 20 69 66 20 74 68 65 72   even.** if ther
24b0: 65 20 69 73 20 61 6e 20 65 78 61 63 74 20 69 6e  e is an exact in
24c0: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
24d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 71 75 61 6e  tion of the quan
24e0: 74 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tity..*/.static 
24f0: 76 6f 69 64 20 61 70 70 6c 79 4e 75 6d 65 72 69  void applyNumeri
2500: 63 41 66 66 69 6e 69 74 79 28 4d 65 6d 20 2a 70  cAffinity(Mem *p
2510: 52 65 63 2c 20 69 6e 74 20 62 54 72 79 46 6f 72  Rec, int bTryFor
2520: 49 6e 74 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72  Int){.  double r
2530: 56 61 6c 75 65 3b 0a 20 20 69 36 34 20 69 56 61  Value;.  i64 iVa
2540: 6c 75 65 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  lue;.  u8 enc = 
2550: 70 52 65 63 2d 3e 65 6e 63 3b 0a 20 20 61 73 73  pRec->enc;.  ass
2560: 65 72 74 28 20 28 70 52 65 63 2d 3e 66 6c 61 67  ert( (pRec->flag
2570: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2580: 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 29 3d  _Int|MEM_Real))=
2590: 3d 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 69 66  =MEM_Str );.  if
25a0: 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 52  ( sqlite3AtoF(pR
25b0: 65 63 2d 3e 7a 2c 20 26 72 56 61 6c 75 65 2c 20  ec->z, &rValue, 
25c0: 70 52 65 63 2d 3e 6e 2c 20 65 6e 63 29 3d 3d 30  pRec->n, enc)==0
25d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
25e0: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
25f0: 34 28 70 52 65 63 2d 3e 7a 2c 20 26 69 56 61 6c  4(pRec->z, &iVal
2600: 75 65 2c 20 70 52 65 63 2d 3e 6e 2c 20 65 6e 63  ue, pRec->n, enc
2610: 29 20 29 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) ){.    pRec->u
2620: 2e 69 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  .i = iValue;.   
2630: 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20   pRec->flags |= 
2640: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d 65 6c 73 65  MEM_Int;.  }else
2650: 7b 0a 20 20 20 20 70 52 65 63 2d 3e 75 2e 72 20  {.    pRec->u.r 
2660: 3d 20 72 56 61 6c 75 65 3b 0a 20 20 20 20 70 52  = rValue;.    pR
2670: 65 63 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ec->flags |= MEM
2680: 5f 52 65 61 6c 3b 0a 20 20 20 20 69 66 28 20 62  _Real;.    if( b
2690: 54 72 79 46 6f 72 49 6e 74 20 29 20 73 71 6c 69  TryForInt ) sqli
26a0: 74 65 33 56 64 62 65 49 6e 74 65 67 65 72 41 66  te3VdbeIntegerAf
26b0: 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a 20 20  finity(pRec);.  
26c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  }.}../*.** Proce
26d0: 73 73 69 6e 67 20 69 73 20 64 65 74 65 72 6d 69  ssing is determi
26e0: 6e 65 20 62 79 20 74 68 65 20 61 66 66 69 6e 69  ne by the affini
26f0: 74 79 20 70 61 72 61 6d 65 74 65 72 3a 0a 2a 2a  ty parameter:.**
2700: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
2710: 4e 54 45 47 45 52 3a 0a 2a 2a 20 53 51 4c 49 54  NTEGER:.** SQLIT
2720: 45 5f 41 46 46 5f 52 45 41 4c 3a 0a 2a 2a 20 53  E_AFF_REAL:.** S
2730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
2740: 43 3a 0a 2a 2a 20 20 20 20 54 72 79 20 74 6f 20  C:.**    Try to 
2750: 63 6f 6e 76 65 72 74 20 70 52 65 63 20 74 6f 20  convert pRec to 
2760: 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
2770: 73 65 6e 74 61 74 69 6f 6e 20 6f 72 20 61 20 0a  sentation or a .
2780: 2a 2a 20 20 20 20 66 6c 6f 61 74 69 6e 67 2d 70  **    floating-p
2790: 6f 69 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  oint representat
27a0: 69 6f 6e 20 69 66 20 61 6e 20 69 6e 74 65 67 65  ion if an intege
27b0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
27c0: 0a 2a 2a 20 20 20 20 69 73 20 6e 6f 74 20 70 6f  .**    is not po
27d0: 73 73 69 62 6c 65 2e 20 20 4e 6f 74 65 20 74 68  ssible.  Note th
27e0: 61 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  at the integer r
27f0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
2800: 0a 2a 2a 20 20 20 20 61 6c 77 61 79 73 20 70 72  .**    always pr
2810: 65 66 65 72 72 65 64 2c 20 65 76 65 6e 20 69 66  eferred, even if
2820: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 69 73   the affinity is
2830: 20 52 45 41 4c 2c 20 62 65 63 61 75 73 65 0a 2a   REAL, because.*
2840: 2a 20 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20  *    an integer 
2850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
2860: 73 20 6d 6f 72 65 20 73 70 61 63 65 20 65 66 66  s more space eff
2870: 69 63 69 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 0a  icient on disk..
2880: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  **.** SQLITE_AFF
2890: 5f 54 45 58 54 3a 0a 2a 2a 20 20 20 20 43 6f 6e  _TEXT:.**    Con
28a0: 76 65 72 74 20 70 52 65 63 20 74 6f 20 61 20 74  vert pRec to a t
28b0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
28c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  on..**.** SQLITE
28d0: 5f 41 46 46 5f 42 4c 4f 42 3a 0a 2a 2a 20 20 20  _AFF_BLOB:.**   
28e0: 20 4e 6f 2d 6f 70 2e 20 20 70 52 65 63 20 69 73   No-op.  pRec is
28f0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73   unchanged..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 6c 79  tatic void apply
2910: 41 66 66 69 6e 69 74 79 28 0a 20 20 4d 65 6d 20  Affinity(.  Mem 
2920: 2a 70 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  *pRec,          
2930: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 74 6f 20  /* The value to 
2940: 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 74  apply affinity t
2950: 6f 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  o */.  char affi
2960: 6e 69 74 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  nity,      /* Th
2970: 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65  e affinity to be
2980: 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20 20 75 38   applied */.  u8
2990: 20 65 6e 63 20 20 20 20 20 20 20 20 20 20 20 20   enc            
29a0: 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 74 65    /* Use this te
29b0: 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 29  xt encoding */.)
29c0: 7b 0a 20 20 69 66 28 20 61 66 66 69 6e 69 74 79  {.  if( affinity
29d0: 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  >=SQLITE_AFF_NUM
29e0: 45 52 49 43 20 29 7b 0a 20 20 20 20 61 73 73 65  ERIC ){.    asse
29f0: 72 74 28 20 61 66 66 69 6e 69 74 79 3d 3d 53 51  rt( affinity==SQ
2a00: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
2a10: 20 7c 7c 20 61 66 66 69 6e 69 74 79 3d 3d 53 51   || affinity==SQ
2a20: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20  LITE_AFF_REAL.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 61 66             || af
2a40: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
2a50: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
2a60: 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66 6c 61    if( (pRec->fla
2a70: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 3d 3d 30  gs & MEM_Int)==0
2a80: 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54 49   ){ /*OPTIMIZATI
2a90: 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20 20  ON-IF-FALSE*/.  
2aa0: 20 20 20 20 69 66 28 20 28 70 52 65 63 2d 3e 66      if( (pRec->f
2ab0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29  lags & MEM_Real)
2ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2ad0: 66 28 20 70 52 65 63 2d 3e 66 6c 61 67 73 20 26  f( pRec->flags &
2ae0: 20 4d 45 4d 5f 53 74 72 20 29 20 61 70 70 6c 79   MEM_Str ) apply
2af0: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
2b00: 70 52 65 63 2c 31 29 3b 0a 20 20 20 20 20 20 7d  pRec,1);.      }
2b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2b20: 6c 69 74 65 33 56 64 62 65 49 6e 74 65 67 65 72  lite3VdbeInteger
2b30: 41 66 66 69 6e 69 74 79 28 70 52 65 63 29 3b 0a  Affinity(pRec);.
2b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b50: 7d 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69  }else if( affini
2b60: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
2b70: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  EXT ){.    /* On
2b80: 6c 79 20 61 74 74 65 6d 70 74 20 74 68 65 20 63  ly attempt the c
2b90: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 54 45 58  onversion to TEX
2ba0: 54 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  T if there is an
2bb0: 20 69 6e 74 65 67 65 72 20 6f 72 20 72 65 61 6c   integer or real
2bc0: 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
2bd0: 74 61 74 69 6f 6e 20 28 62 6c 6f 62 20 61 6e 64  tation (blob and
2be0: 20 4e 55 4c 4c 20 64 6f 20 6e 6f 74 20 67 65 74   NULL do not get
2bf0: 20 63 6f 6e 76 65 72 74 65 64 29 20 62 75 74 20   converted) but 
2c00: 6e 6f 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2a  no string.    **
2c10: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
2c20: 20 20 49 74 20 77 6f 75 6c 64 20 62 65 20 68 61    It would be ha
2c30: 72 6d 6c 65 73 73 20 74 6f 20 72 65 70 65 61 74  rmless to repeat
2c40: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
2c50: 69 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  if .    ** there
2c60: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 73 74   is already a st
2c70: 72 69 6e 67 20 72 65 70 2c 20 62 75 74 20 69 74  ring rep, but it
2c80: 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 74 6f   is pointless to
2c90: 20 77 61 73 74 65 20 74 68 6f 73 65 0a 20 20 20   waste those.   
2ca0: 20 2a 2a 20 43 50 55 20 63 79 63 6c 65 73 2e 20   ** CPU cycles. 
2cb0: 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  */.    if( 0==(p
2cc0: 52 65 63 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 53  Rec->flags&MEM_S
2cd0: 74 72 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  tr) ){ /*OPTIMIZ
2ce0: 41 54 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f  ATION-IF-FALSE*/
2cf0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 65 63  .      if( (pRec
2d00: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 52 65 61  ->flags&(MEM_Rea
2d10: 6c 7c 4d 45 4d 5f 49 6e 74 29 29 20 29 7b 0a 20  l|MEM_Int)) ){. 
2d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d30: 62 65 4d 65 6d 53 74 72 69 6e 67 69 66 79 28 70  beMemStringify(p
2d40: 52 65 63 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20  Rec, enc, 1);.  
2d50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d60: 70 52 65 63 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRec->flags &= ~
2d70: 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 49 6e  (MEM_Real|MEM_In
2d80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2d90: 20 54 72 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   Try to convert 
2da0: 74 68 65 20 74 79 70 65 20 6f 66 20 61 20 66 75  the type of a fu
2db0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  nction argument 
2dc0: 6f 72 20 61 20 72 65 73 75 6c 74 20 63 6f 6c 75  or a result colu
2dd0: 6d 6e 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 75 6d  mn.** into a num
2de0: 65 72 69 63 20 72 65 70 72 65 73 65 6e 74 61 74  eric representat
2df0: 69 6f 6e 2e 20 20 55 73 65 20 65 69 74 68 65 72  ion.  Use either
2e00: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
2e10: 20 77 68 69 63 68 65 76 65 72 0a 2a 2a 20 69 73   whichever.** is
2e20: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 20 42   appropriate.  B
2e30: 75 74 20 6f 6e 6c 79 20 64 6f 20 74 68 65 20 63  ut only do the c
2e40: 6f 6e 76 65 72 73 69 6f 6e 20 69 66 20 69 74 20  onversion if it 
2e50: 69 73 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  is possible with
2e60: 6f 75 74 0a 2a 2a 20 6c 6f 73 73 20 6f 66 20 69  out.** loss of i
2e70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 72  nformation and r
2e80: 65 74 75 72 6e 20 74 68 65 20 72 65 76 69 73 65  eturn the revise
2e90: 64 20 74 79 70 65 20 6f 66 20 74 68 65 20 61 72  d type of the ar
2ea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
2eb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d  qlite3_value_num
2ec0: 65 72 69 63 5f 74 79 70 65 28 73 71 6c 69 74 65  eric_type(sqlite
2ed0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a  3_value *pVal){.
2ee0: 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
2ef0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
2f00: 28 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 65 54  (pVal);.  if( eT
2f10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  ype==SQLITE_TEXT
2f20: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
2f30: 6d 20 3d 20 28 4d 65 6d 2a 29 70 56 61 6c 3b 0a  m = (Mem*)pVal;.
2f40: 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
2f50: 41 66 66 69 6e 69 74 79 28 70 4d 65 6d 2c 20 30  Affinity(pMem, 0
2f60: 29 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73  );.    eType = s
2f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2f80: 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72  e(pVal);.  }.  r
2f90: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 0a  eturn eType;.}..
2fa0: 2f 2a 0a 2a 2a 20 45 78 70 6f 72 74 65 64 20 76  /*.** Exported v
2fb0: 65 72 73 69 6f 6e 20 6f 66 20 61 70 70 6c 79 41  ersion of applyA
2fc0: 66 66 69 6e 69 74 79 28 29 2e 20 54 68 69 73 20  ffinity(). This 
2fd0: 6f 6e 65 20 77 6f 72 6b 73 20 6f 6e 20 73 71 6c  one works on sql
2fe0: 69 74 65 33 5f 76 61 6c 75 65 2a 2c 20 0a 2a 2a  ite3_value*, .**
2ff0: 20 6e 6f 74 20 74 68 65 20 69 6e 74 65 72 6e 61   not the interna
3000: 6c 20 4d 65 6d 2a 20 74 79 70 65 2e 0a 2a 2f 0a  l Mem* type..*/.
3010: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 6c 75  void sqlite3Valu
3020: 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 0a  eApplyAffinity(.
3030: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3040: 2a 70 56 61 6c 2c 20 0a 20 20 75 38 20 61 66 66  *pVal, .  u8 aff
3050: 69 6e 69 74 79 2c 20 0a 20 20 75 38 20 65 6e 63  inity, .  u8 enc
3060: 0a 29 7b 0a 20 20 61 70 70 6c 79 41 66 66 69 6e  .){.  applyAffin
3070: 69 74 79 28 28 4d 65 6d 20 2a 29 70 56 61 6c 2c  ity((Mem *)pVal,
3080: 20 61 66 66 69 6e 69 74 79 2c 20 65 6e 63 29 3b   affinity, enc);
3090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4d 65 6d 20 63  .}../*.** pMem c
30a0: 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 68 6f  urrently only ho
30b0: 6c 64 73 20 61 20 73 74 72 69 6e 67 20 74 79 70  lds a string typ
30c0: 65 20 28 6f 72 20 6d 61 79 62 65 20 61 20 42 4c  e (or maybe a BL
30d0: 4f 42 20 74 68 61 74 20 77 65 20 63 61 6e 0a 2a  OB that we can.*
30e0: 2a 20 69 6e 74 65 72 70 72 65 74 20 61 73 20 61  * interpret as a
30f0: 20 73 74 72 69 6e 67 20 69 66 20 77 65 20 77 61   string if we wa
3100: 6e 74 20 74 6f 29 2e 20 20 43 6f 6d 70 75 74 65  nt to).  Compute
3110: 20 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69   its correspondi
3120: 6e 67 0a 2a 2a 20 6e 75 6d 65 72 69 63 20 74 79  ng.** numeric ty
3130: 70 65 2c 20 69 66 20 68 61 73 20 6f 6e 65 2e 20  pe, if has one. 
3140: 20 53 65 74 20 74 68 65 20 70 4d 65 6d 2d 3e 75   Set the pMem->u
3150: 2e 72 20 61 6e 64 20 70 4d 65 6d 2d 3e 75 2e 69  .r and pMem->u.i
3160: 20 66 69 65 6c 64 73 0a 2a 2a 20 61 63 63 6f 72   fields.** accor
3170: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
3180: 63 20 75 31 36 20 53 51 4c 49 54 45 5f 4e 4f 49  c u16 SQLITE_NOI
3190: 4e 4c 49 4e 45 20 63 6f 6d 70 75 74 65 4e 75 6d  NLINE computeNum
31a0: 65 72 69 63 54 79 70 65 28 4d 65 6d 20 2a 70 4d  ericType(Mem *pM
31b0: 65 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28  em){.  assert( (
31c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
31d0: 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
31e0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31f0: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
3200: 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c   (MEM_Str|MEM_Bl
3210: 6f 62 29 29 21 3d 30 20 29 3b 0a 20 20 69 66 28  ob))!=0 );.  if(
3220: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 4d 65   sqlite3AtoF(pMe
3230: 6d 2d 3e 7a 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  m->z, &pMem->u.r
3240: 2c 20 70 4d 65 6d 2d 3e 6e 2c 20 70 4d 65 6d 2d  , pMem->n, pMem-
3250: 3e 65 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >enc)==0 ){.    
3260: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3270: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
3280: 34 28 70 4d 65 6d 2d 3e 7a 2c 20 26 70 4d 65 6d  4(pMem->z, &pMem
3290: 2d 3e 75 2e 69 2c 20 70 4d 65 6d 2d 3e 6e 2c 20  ->u.i, pMem->n, 
32a0: 70 4d 65 6d 2d 3e 65 6e 63 29 3d 3d 53 51 4c 49  pMem->enc)==SQLI
32b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
32c0: 75 72 6e 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 7d  urn MEM_Int;.  }
32d0: 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 5f 52 65  .  return MEM_Re
32e0: 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
32f0: 75 72 6e 20 74 68 65 20 6e 75 6d 65 72 69 63 20  urn the numeric 
3300: 74 79 70 65 20 66 6f 72 20 70 4d 65 6d 2c 20 65  type for pMem, e
3310: 69 74 68 65 72 20 4d 45 4d 5f 49 6e 74 20 6f 72  ither MEM_Int or
3320: 20 4d 45 4d 5f 52 65 61 6c 20 6f 72 20 62 6f 74   MEM_Real or bot
3330: 68 20 6f 72 0a 2a 2a 20 6e 6f 6e 65 2e 20 20 0a  h or.** none.  .
3340: 2a 2a 0a 2a 2a 20 55 6e 6c 69 6b 65 20 61 70 70  **.** Unlike app
3350: 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  lyNumericAffinit
3360: 79 28 29 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  y(), this routin
3370: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 6f 64 69 66  e does not modif
3380: 79 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 2e 0a 2a  y pMem->flags..*
3390: 2a 20 42 75 74 20 69 74 20 64 6f 65 73 20 73 65  * But it does se
33a0: 74 20 70 4d 65 6d 2d 3e 75 2e 72 20 61 6e 64 20  t pMem->u.r and 
33b0: 70 4d 65 6d 2d 3e 75 2e 69 20 61 70 70 72 6f 70  pMem->u.i approp
33c0: 72 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  riately..*/.stat
33d0: 69 63 20 75 31 36 20 6e 75 6d 65 72 69 63 54 79  ic u16 numericTy
33e0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20  pe(Mem *pMem){. 
33f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
3400: 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
3410: 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Real) ){.    ret
3420: 75 72 6e 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  urn pMem->flags 
3430: 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
3440: 65 61 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eal);.  }.  if( 
3450: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 28 4d  pMem->flags & (M
3460: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
3470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63   ){.    return c
3480: 6f 6d 70 75 74 65 4e 75 6d 65 72 69 63 54 79 70  omputeNumericTyp
3490: 65 28 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 72  e(pMem);.  }.  r
34a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
34b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
34c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 6e 69  /*.** Write a ni
34d0: 63 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ce string repres
34e0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
34f0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 63 65 6c 6c  contents of cell
3500: 20 70 4d 65 6d 0a 2a 2a 20 69 6e 74 6f 20 62 75   pMem.** into bu
3510: 66 66 65 72 20 7a 42 75 66 2c 20 6c 65 6e 67 74  ffer zBuf, lengt
3520: 68 20 6e 42 75 66 2e 0a 2a 2f 0a 76 6f 69 64 20  h nBuf..*/.void 
3530: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 50 72  sqlite3VdbeMemPr
3540: 65 74 74 79 50 72 69 6e 74 28 4d 65 6d 20 2a 70  ettyPrint(Mem *p
3550: 4d 65 6d 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Mem, char *zBuf)
3560: 7b 0a 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d  {.  char *zCsr =
3570: 20 7a 42 75 66 3b 0a 20 20 69 6e 74 20 66 20 3d   zBuf;.  int f =
3580: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20   pMem->flags;.. 
3590: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
35a0: 61 72 20 2a 63 6f 6e 73 74 20 65 6e 63 6e 61 6d  ar *const encnam
35b0: 65 73 5b 5d 20 3d 20 7b 22 28 58 29 22 2c 20 22  es[] = {"(X)", "
35c0: 28 38 29 22 2c 20 22 28 31 36 4c 45 29 22 2c 20  (8)", "(16LE)", 
35d0: 22 28 31 36 42 45 29 22 7d 3b 0a 0a 20 20 69 66  "(16BE)"};..  if
35e0: 28 20 66 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ( f&MEM_Blob ){.
35f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
3600: 68 61 72 20 63 3b 0a 20 20 20 20 69 66 28 20 66  har c;.    if( f
3610: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20   & MEM_Dyn ){.  
3620: 20 20 20 20 63 20 3d 20 27 7a 27 3b 0a 20 20 20      c = 'z';.   
3630: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
3640: 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f  (MEM_Static|MEM_
3650: 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20  Ephem))==0 );.  
3660: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26 20    }else if( f & 
3670: 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20 20  MEM_Static ){.  
3680: 20 20 20 20 63 20 3d 20 27 74 27 3b 0a 20 20 20      c = 't';.   
3690: 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26 20     assert( (f & 
36a0: 28 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 45 70 68  (MEM_Dyn|MEM_Eph
36b0: 65 6d 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  em))==0 );.    }
36c0: 65 6c 73 65 20 69 66 28 20 66 20 26 20 4d 45 4d  else if( f & MEM
36d0: 5f 45 70 68 65 6d 20 29 7b 0a 20 20 20 20 20 20  _Ephem ){.      
36e0: 63 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 61  c = 'e';.      a
36f0: 73 73 65 72 74 28 20 28 66 20 26 20 28 4d 45 4d  ssert( (f & (MEM
3700: 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29  _Static|MEM_Dyn)
3710: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  )==0 );.    }els
3720: 65 7b 0a 20 20 20 20 20 20 63 20 3d 20 27 73 27  e{.      c = 's'
3730: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3740: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3750: 30 2c 20 7a 43 73 72 2c 20 22 25 63 22 2c 20 63  0, zCsr, "%c", c
3760: 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 73  );.    zCsr += s
3770: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3780: 43 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Csr);.    sqlite
3790: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
37a0: 7a 43 73 72 2c 20 22 25 64 5b 22 2c 20 70 4d 65  zCsr, "%d[", pMe
37b0: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7a 43 73 72 20  m->n);.    zCsr 
37c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
37d0: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 66 6f  30(zCsr);.    fo
37e0: 72 28 69 3d 30 3b 20 69 3c 31 36 20 26 26 20 69  r(i=0; i<16 && i
37f0: 3c 70 4d 65 6d 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pMem->n; i++){.
3800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
3810: 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73 72  printf(100, zCsr
3820: 2c 20 22 25 30 32 58 22 2c 20 28 28 69 6e 74 29  , "%02X", ((int)
3830: 70 4d 65 6d 2d 3e 7a 5b 69 5d 20 26 20 30 78 46  pMem->z[i] & 0xF
3840: 46 29 29 3b 0a 20 20 20 20 20 20 7a 43 73 72 20  F));.      zCsr 
3850: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3860: 33 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 7d 0a  30(zCsr);.    }.
3870: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
3880: 36 20 26 26 20 69 3c 70 4d 65 6d 2d 3e 6e 3b 20  6 && i<pMem->n; 
3890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
38a0: 20 7a 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 69 5d 3b   z = pMem->z[i];
38b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 3c 33 32 20  .      if( z<32 
38c0: 7c 7c 20 7a 3e 31 32 36 20 29 20 2a 7a 43 73 72  || z>126 ) *zCsr
38d0: 2b 2b 20 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20  ++ = '.';.      
38e0: 65 6c 73 65 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a  else *zCsr++ = z
38f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
3900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
3910: 30 2c 20 7a 43 73 72 2c 20 22 5d 25 73 22 2c 20  0, zCsr, "]%s", 
3920: 65 6e 63 6e 61 6d 65 73 5b 70 4d 65 6d 2d 3e 65  encnames[pMem->e
3930: 6e 63 5d 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b  nc]);.    zCsr +
3940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
3950: 30 28 7a 43 73 72 29 3b 0a 20 20 20 20 69 66 28  0(zCsr);.    if(
3960: 20 66 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b   f & MEM_Zero ){
3970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3980: 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a 43 73  nprintf(100, zCs
3990: 72 2c 22 2b 25 64 7a 22 2c 70 4d 65 6d 2d 3e 75  r,"+%dz",pMem->u
39a0: 2e 6e 5a 65 72 6f 29 3b 0a 20 20 20 20 20 20 7a  .nZero);.      z
39b0: 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  Csr += sqlite3St
39c0: 72 6c 65 6e 33 30 28 7a 43 73 72 29 3b 0a 20 20  rlen30(zCsr);.  
39d0: 20 20 7d 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20    }.    *zCsr = 
39e0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 20 69 66  '\0';.  }else if
39f0: 28 20 66 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ( f & MEM_Str ){
3a00: 0a 20 20 20 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20  .    int j, k;. 
3a10: 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 20 27     zBuf[0] = ' '
3a20: 3b 0a 20 20 20 20 69 66 28 20 66 20 26 20 4d 45  ;.    if( f & ME
3a30: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 7a  M_Dyn ){.      z
3a40: 42 75 66 5b 31 5d 20 3d 20 27 7a 27 3b 0a 20 20  Buf[1] = 'z';.  
3a50: 20 20 20 20 61 73 73 65 72 74 28 20 28 66 20 26      assert( (f &
3a60: 20 28 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d   (MEM_Static|MEM
3a70: 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29 3b 0a 20  _Ephem))==0 );. 
3a80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 20 26     }else if( f &
3a90: 20 4d 45 4d 5f 53 74 61 74 69 63 20 29 7b 0a 20   MEM_Static ){. 
3aa0: 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20 27       zBuf[1] = '
3ab0: 74 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t';.      assert
3ac0: 28 20 28 66 20 26 20 28 4d 45 4d 5f 44 79 6e 7c  ( (f & (MEM_Dyn|
3ad0: 4d 45 4d 5f 45 70 68 65 6d 29 29 3d 3d 30 20 29  MEM_Ephem))==0 )
3ae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
3af0: 66 20 26 20 4d 45 4d 5f 45 70 68 65 6d 20 29 7b  f & MEM_Ephem ){
3b00: 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d  .      zBuf[1] =
3b10: 20 27 65 27 3b 0a 20 20 20 20 20 20 61 73 73 65   'e';.      asse
3b20: 72 74 28 20 28 66 20 26 20 28 4d 45 4d 5f 53 74  rt( (f & (MEM_St
3b30: 61 74 69 63 7c 4d 45 4d 5f 44 79 6e 29 29 3d 3d  atic|MEM_Dyn))==
3b40: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
3b50: 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20 3d 20        zBuf[1] = 
3b60: 27 73 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6b  's';.    }.    k
3b70: 20 3d 20 32 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 2;.    sqlite
3b80: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20  3_snprintf(100, 
3b90: 26 7a 42 75 66 5b 6b 5d 2c 20 22 25 64 22 2c 20  &zBuf[k], "%d", 
3ba0: 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 6b 20  pMem->n);.    k 
3bb0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3bc0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3bd0: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5b    zBuf[k++] = '[
3be0: 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ';.    for(j=0; 
3bf0: 6a 3c 31 35 20 26 26 20 6a 3c 70 4d 65 6d 2d 3e  j<15 && j<pMem->
3c00: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 75  n; j++){.      u
3c10: 38 20 63 20 3d 20 70 4d 65 6d 2d 3e 7a 5b 6a 5d  8 c = pMem->z[j]
3c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30  ;.      if( c>=0
3c30: 78 32 30 20 26 26 20 63 3c 30 78 37 66 20 29 7b  x20 && c<0x7f ){
3c40: 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6b 2b  .        zBuf[k+
3c50: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 65  +] = c;.      }e
3c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  lse{.        zBu
3c70: 66 5b 6b 2b 2b 5d 20 3d 20 27 2e 27 3b 0a 20 20  f[k++] = '.';.  
3c80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3c90: 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 27 5d 27 3b  zBuf[k++] = ']';
3ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3cb0: 72 69 6e 74 66 28 31 30 30 2c 26 7a 42 75 66 5b  rintf(100,&zBuf[
3cc0: 6b 5d 2c 20 65 6e 63 6e 61 6d 65 73 5b 70 4d 65  k], encnames[pMe
3cd0: 6d 2d 3e 65 6e 63 5d 29 3b 0a 20 20 20 20 6b 20  m->enc]);.    k 
3ce0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
3cf0: 33 30 28 26 7a 42 75 66 5b 6b 5d 29 3b 0a 20 20  30(&zBuf[k]);.  
3d00: 20 20 7a 42 75 66 5b 6b 2b 2b 5d 20 3d 20 30 3b    zBuf[k++] = 0;
3d10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
3d20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3d30: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
3d40: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 72 65  he value of a re
3d50: 67 69 73 74 65 72 20 66 6f 72 20 74 72 61 63 69  gister for traci
3d60: 6e 67 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2f 0a  ng purposes:.*/.
3d70: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 54  static void memT
3d80: 72 61 63 65 50 72 69 6e 74 28 4d 65 6d 20 2a 70  racePrint(Mem *p
3d90: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  ){.  if( p->flag
3da0: 73 20 26 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s & MEM_Undefine
3db0: 64 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  d ){.    printf(
3dc0: 22 20 75 6e 64 65 66 69 6e 65 64 22 29 3b 0a 20  " undefined");. 
3dd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c   }else if( p->fl
3de0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
3df0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 4e  {.    printf(" N
3e00: 55 4c 4c 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ULL");.  }else i
3e10: 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 28  f( (p->flags & (
3e20: 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 53 74 72 29  MEM_Int|MEM_Str)
3e30: 29 3d 3d 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  )==(MEM_Int|MEM_
3e40: 53 74 72 29 20 29 7b 0a 20 20 20 20 70 72 69 6e  Str) ){.    prin
3e50: 74 66 28 22 20 73 69 3a 25 6c 6c 64 22 2c 20 70  tf(" si:%lld", p
3e60: 2d 3e 75 2e 69 29 3b 0a 20 20 7d 65 6c 73 65 20  ->u.i);.  }else 
3e70: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  if( p->flags & M
3e80: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 70 72  EM_Int ){.    pr
3e90: 69 6e 74 66 28 22 20 69 3a 25 6c 6c 64 22 2c 20  intf(" i:%lld", 
3ea0: 70 2d 3e 75 2e 69 29 3b 0a 23 69 66 6e 64 65 66  p->u.i);.#ifndef
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
3ec0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 7d 65  ATING_POINT.  }e
3ed0: 6c 73 65 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  lse if( p->flags
3ee0: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
3ef0: 20 20 20 70 72 69 6e 74 66 28 22 20 72 3a 25 67     printf(" r:%g
3f00: 22 2c 20 70 2d 3e 75 2e 72 29 3b 0a 23 65 6e 64  ", p->u.r);.#end
3f10: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  if.  }else if( p
3f20: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
3f30: 77 53 65 74 20 29 7b 0a 20 20 20 20 70 72 69 6e  wSet ){.    prin
3f40: 74 66 28 22 20 28 72 6f 77 73 65 74 29 22 29 3b  tf(" (rowset)");
3f50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
3f60: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
3f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
3f80: 50 72 65 74 74 79 50 72 69 6e 74 28 70 2c 20 7a  PrettyPrint(p, z
3f90: 42 75 66 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  Buf);.    printf
3fa0: 28 22 20 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  (" %s", zBuf);. 
3fb0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67   }.  if( p->flag
3fc0: 73 20 26 20 4d 45 4d 5f 53 75 62 74 79 70 65 20  s & MEM_Subtype 
3fd0: 29 20 70 72 69 6e 74 66 28 22 20 73 75 62 74 79  ) printf(" subty
3fe0: 70 65 3d 30 78 25 30 32 78 22 2c 20 70 2d 3e 65  pe=0x%02x", p->e
3ff0: 53 75 62 74 79 70 65 29 3b 0a 7d 0a 73 74 61 74  Subtype);.}.stat
4000: 69 63 20 76 6f 69 64 20 72 65 67 69 73 74 65 72  ic void register
4010: 54 72 61 63 65 28 69 6e 74 20 69 52 65 67 2c 20  Trace(int iReg, 
4020: 4d 65 6d 20 2a 70 29 7b 0a 20 20 70 72 69 6e 74  Mem *p){.  print
4030: 66 28 22 52 45 47 5b 25 64 5d 20 3d 20 22 2c 20  f("REG[%d] = ", 
4040: 69 52 65 67 29 3b 0a 20 20 6d 65 6d 54 72 61 63  iReg);.  memTrac
4050: 65 50 72 69 6e 74 28 70 29 3b 0a 20 20 70 72 69  ePrint(p);.  pri
4060: 6e 74 66 28 22 5c 6e 22 29 3b 0a 7d 0a 23 65 6e  ntf("\n");.}.#en
4070: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
4080: 54 45 5f 44 45 42 55 47 0a 23 20 20 64 65 66 69  TE_DEBUG.#  defi
4090: 6e 65 20 52 45 47 49 53 54 45 52 5f 54 52 41 43  ne REGISTER_TRAC
40a0: 45 28 52 2c 4d 29 20 69 66 28 64 62 2d 3e 66 6c  E(R,M) if(db->fl
40b0: 61 67 73 26 53 51 4c 49 54 45 5f 56 64 62 65 54  ags&SQLITE_VdbeT
40c0: 72 61 63 65 29 72 65 67 69 73 74 65 72 54 72 61  race)registerTra
40d0: 63 65 28 52 2c 4d 29 0a 23 65 6c 73 65 0a 23 20  ce(R,M).#else.# 
40e0: 20 64 65 66 69 6e 65 20 52 45 47 49 53 54 45 52   define REGISTER
40f0: 5f 54 52 41 43 45 28 52 2c 4d 29 0a 23 65 6e 64  _TRACE(R,M).#end
4100: 69 66 0a 0a 0a 23 69 66 64 65 66 20 56 44 42 45  if...#ifdef VDBE
4110: 5f 50 52 4f 46 49 4c 45 0a 0a 2f 2a 20 0a 2a 2a  _PROFILE../* .**
4120: 20 68 77 74 69 6d 65 2e 68 20 63 6f 6e 74 61 69   hwtime.h contai
4130: 6e 73 20 69 6e 6c 69 6e 65 20 61 73 73 65 6d 62  ns inline assemb
4140: 6c 65 72 20 63 6f 64 65 20 66 6f 72 20 69 6d 70  ler code for imp
4150: 6c 65 6d 65 6e 74 69 6e 67 20 0a 2a 2a 20 68 69  lementing .** hi
4160: 67 68 2d 70 65 72 66 6f 72 6d 61 6e 63 65 20 74  gh-performance t
4170: 69 6d 69 6e 67 20 72 6f 75 74 69 6e 65 73 2e 0a  iming routines..
4180: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 68 77 74  */.#include "hwt
4190: 69 6d 65 2e 68 22 0a 0a 23 65 6e 64 69 66 0a 0a  ime.h"..#endif..
41a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
41b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
41c0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
41d0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 6e  d from within an
41e0: 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
41f0: 73 69 6f 6e 2e 20 49 74 0a 2a 2a 20 63 68 65 63  sion. It.** chec
4200: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
4210: 74 65 33 2e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  te3.nTransaction
4220: 20 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 72   variable is cor
4230: 72 65 63 74 6c 79 20 73 65 74 20 74 6f 0a 2a 2a  rectly set to.**
4240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
4250: 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
4260: 61 76 65 70 6f 69 6e 74 73 20 63 75 72 72 65 6e  avepoints curren
4270: 74 6c 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  tly in the .** l
4280: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
4290: 69 6e 67 20 61 74 20 73 71 6c 69 74 65 33 2e 70  ing at sqlite3.p
42a0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 0a 2a  Savepoint..** .*
42b0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
42c0: 20 20 20 61 73 73 65 72 74 28 20 63 68 65 63 6b     assert( check
42d0: 53 61 76 65 70 6f 69 6e 74 43 6f 75 6e 74 28 64  SavepointCount(d
42e0: 62 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  b) );.*/.static 
42f0: 69 6e 74 20 63 68 65 63 6b 53 61 76 65 70 6f 69  int checkSavepoi
4300: 6e 74 43 6f 75 6e 74 28 73 71 6c 69 74 65 33 20  ntCount(sqlite3 
4310: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  *db){.  int n = 
4320: 30 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  0;.  Savepoint *
4330: 70 3b 0a 20 20 66 6f 72 28 70 3d 64 62 2d 3e 70  p;.  for(p=db->p
4340: 53 61 76 65 70 6f 69 6e 74 3b 20 70 3b 20 70 3d  Savepoint; p; p=
4350: 70 2d 3e 70 4e 65 78 74 29 20 6e 2b 2b 3b 0a 20  p->pNext) n++;. 
4360: 20 61 73 73 65 72 74 28 20 6e 3d 3d 28 64 62 2d   assert( n==(db-
4370: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b 20 64 62  >nSavepoint + db
4380: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
4390: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 20 20 72  avepoint) );.  r
43a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
43b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
43c0: 74 68 65 20 72 65 67 69 73 74 65 72 20 6f 66 20  the register of 
43d0: 70 4f 70 2d 3e 70 32 20 61 66 74 65 72 20 66 69  pOp->p2 after fi
43e0: 72 73 74 20 70 72 65 70 61 72 69 6e 67 20 69 74  rst preparing it
43f0: 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
4400: 69 74 74 65 6e 20 77 69 74 68 20 61 6e 20 69 6e  itten with an in
4410: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
4420: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
4430: 49 4e 4c 49 4e 45 20 4d 65 6d 20 2a 6f 75 74 32  INLINE Mem *out2
4440: 50 72 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c  PrereleaseWithCl
4450: 65 61 72 28 4d 65 6d 20 2a 70 4f 75 74 29 7b 0a  ear(Mem *pOut){.
4460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
4470: 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a 20  SetNull(pOut);. 
4480: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
4490: 45 4d 5f 49 6e 74 3b 0a 20 20 72 65 74 75 72 6e  EM_Int;.  return
44a0: 20 70 4f 75 74 3b 0a 7d 0a 73 74 61 74 69 63 20   pOut;.}.static 
44b0: 4d 65 6d 20 2a 6f 75 74 32 50 72 65 72 65 6c 65  Mem *out2Prerele
44c0: 61 73 65 28 56 64 62 65 20 2a 70 2c 20 56 64 62  ase(Vdbe *p, Vdb
44d0: 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 4d 65 6d  eOp *pOp){.  Mem
44e0: 20 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *pOut;.  assert
44f0: 28 20 70 4f 70 2d 3e 70 32 3e 30 20 29 3b 0a 20  ( pOp->p2>0 );. 
4500: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32   assert( pOp->p2
4510: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
4520: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
4530: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pOut = &p->aMem[
4540: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 6d 65 6d 41  pOp->p2];.  memA
4550: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
4560: 70 4f 75 74 29 3b 0a 20 20 69 66 28 20 56 64 62  pOut);.  if( Vdb
4570: 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f 75 74  eMemDynamic(pOut
4580: 29 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a 41 54  ) ){ /*OPTIMIZAT
4590: 49 4f 4e 2d 49 46 2d 46 41 4c 53 45 2a 2f 0a 20  ION-IF-FALSE*/. 
45a0: 20 20 20 72 65 74 75 72 6e 20 6f 75 74 32 50 72     return out2Pr
45b0: 65 72 65 6c 65 61 73 65 57 69 74 68 43 6c 65 61  ereleaseWithClea
45c0: 72 28 70 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  r(pOut);.  }else
45d0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67  {.    pOut->flag
45e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
45f0: 20 72 65 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20   return pOut;.  
4600: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  }.}.../*.** Exec
4610: 75 74 65 20 61 73 20 6d 75 63 68 20 6f 66 20 61  ute as much of a
4620: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 73   VDBE program as
4630: 20 77 65 20 63 61 6e 2e 0a 2a 2a 20 54 68 69 73   we can..** This
4640: 20 69 73 20 74 68 65 20 63 6f 72 65 20 6f 66 20   is the core of 
4650: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
4660: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
4670: 56 64 62 65 45 78 65 63 28 0a 20 20 56 64 62 65  VdbeExec(.  Vdbe
4680: 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
4690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
46a0: 42 45 20 2a 2f 0a 29 7b 0a 20 20 4f 70 20 2a 61  BE */.){.  Op *a
46b0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 20 20 20 20  Op = p->aOp;    
46c0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
46d0: 20 70 2d 3e 61 4f 70 20 2a 2f 0a 20 20 4f 70 20   p->aOp */.  Op 
46e0: 2a 70 4f 70 20 3d 20 61 4f 70 3b 20 20 20 20 20  *pOp = aOp;     
46f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4700: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  nt operation */.
4710: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4720: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
4730: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4740: 45 29 0a 20 20 4f 70 20 2a 70 4f 72 69 67 4f 70  E).  Op *pOrigOp
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 4f 70 20  /* Value of pOp 
4770: 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
4780: 65 20 6c 6f 6f 70 20 2a 2f 0a 23 65 6e 64 69 66  e loop */.#endif
4790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
47a0: 45 42 55 47 0a 20 20 69 6e 74 20 6e 45 78 74 72  EBUG.  int nExtr
47b0: 61 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  aDelete = 0;    
47c0: 20 20 2f 2a 20 56 65 72 69 66 69 65 73 20 46 4f    /* Verifies FO
47d0: 52 44 45 4c 45 54 45 20 61 6e 64 20 41 55 58 44  RDELETE and AUXD
47e0: 45 4c 45 54 45 20 66 6c 61 67 73 20 2a 2f 0a 23  ELETE flags */.#
47f0: 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 63 20 3d  endif.  int rc =
4800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
4810: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
4820: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
4830: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
4840: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4850: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 72 65  abase */.  u8 re
4860: 73 65 74 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74  setSchemaOnFault
4870: 20 3d 20 30 3b 20 2f 2a 20 52 65 73 65 74 20 73   = 0; /* Reset s
4880: 63 68 65 6d 61 20 61 66 74 65 72 20 61 6e 20 65  chema after an e
4890: 72 72 6f 72 20 69 66 20 70 6f 73 69 74 69 76 65  rror if positive
48a0: 20 2a 2f 0a 20 20 75 38 20 65 6e 63 6f 64 69 6e   */.  u8 encodin
48b0: 67 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  g = ENC(db);    
48c0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
48d0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
48e0: 6e 74 20 69 43 6f 6d 70 61 72 65 20 3d 20 30 3b  nt iCompare = 0;
48f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
4900: 75 6c 74 20 6f 66 20 6c 61 73 74 20 63 6f 6d 70  ult of last comp
4910: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  arison */.  unsi
4920: 67 6e 65 64 20 6e 56 6d 53 74 65 70 20 3d 20 30  gned nVmStep = 0
4930: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4940: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 61 63 68   of virtual mach
4950: 69 6e 65 20 73 74 65 70 73 20 2a 2f 0a 23 69 66  ine steps */.#if
4960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4970: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
4980: 43 4b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 50  CK.  unsigned nP
4990: 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 3d 20 30  rogressLimit = 0
49a0: 3b 2f 2a 20 49 6e 76 6f 6b 65 20 78 50 72 6f 67  ;/* Invoke xProg
49b0: 72 65 73 73 28 29 20 77 68 65 6e 20 6e 56 6d 53  ress() when nVmS
49c0: 74 65 70 20 72 65 61 63 68 65 73 20 74 68 69 73  tep reaches this
49d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 4d 65 6d   */.#endif.  Mem
49e0: 20 2a 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *aMem = p->aMem
49f0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
4a00: 6f 66 20 70 2d 3e 61 4d 65 6d 20 2a 2f 0a 20 20  of p->aMem */.  
4a10: 4d 65 6d 20 2a 70 49 6e 31 20 3d 20 30 3b 20 20  Mem *pIn1 = 0;  
4a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 73             /* 1s
4a30: 74 20 69 6e 70 75 74 20 6f 70 65 72 61 6e 64 20  t input operand 
4a40: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 49 6e 32 20 3d  */.  Mem *pIn2 =
4a50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
4a60: 2f 2a 20 32 6e 64 20 69 6e 70 75 74 20 6f 70 65  /* 2nd input ope
4a70: 72 61 6e 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  rand */.  Mem *p
4a80: 49 6e 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  In3 = 0;        
4a90: 20 20 20 20 20 2f 2a 20 33 72 64 20 69 6e 70 75       /* 3rd inpu
4aa0: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 4d  t operand */.  M
4ab0: 65 6d 20 2a 70 4f 75 74 20 3d 20 30 3b 20 20 20  em *pOut = 0;   
4ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
4ad0: 70 75 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  put operand */. 
4ae0: 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 20 3d   int *aPermute =
4af0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   0;         /* P
4b00: 65 72 6d 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f  ermutation of co
4b10: 6c 75 6d 6e 73 20 66 6f 72 20 4f 50 5f 43 6f 6d  lumns for OP_Com
4b20: 70 61 72 65 20 2a 2f 0a 20 20 69 36 34 20 6c 61  pare */.  i64 la
4b30: 73 74 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61  stRowid = db->la
4b40: 73 74 52 6f 77 69 64 3b 20 20 2f 2a 20 53 61 76  stRowid;  /* Sav
4b50: 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ed value of the 
4b60: 6c 61 73 74 20 69 6e 73 65 72 74 20 52 4f 57 49  last insert ROWI
4b70: 44 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45  D */.#ifdef VDBE
4b80: 5f 50 52 4f 46 49 4c 45 0a 20 20 75 36 34 20 73  _PROFILE.  u64 s
4b90: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
4ba0: 20 20 20 20 20 20 2f 2a 20 43 50 55 20 63 6c 6f        /* CPU clo
4bb0: 63 6b 20 63 6f 75 6e 74 20 61 74 20 73 74 61 72  ck count at star
4bc0: 74 20 6f 66 20 6f 70 63 6f 64 65 20 2a 2f 0a 23  t of opcode */.#
4bd0: 65 6e 64 69 66 0a 20 20 2f 2a 2a 2a 20 49 4e 53  endif.  /*** INS
4be0: 45 52 54 20 53 54 41 43 4b 20 55 4e 49 4f 4e 20  ERT STACK UNION 
4bf0: 48 45 52 45 20 2a 2a 2a 2f 0a 0a 20 20 61 73 73  HERE ***/..  ass
4c00: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4c10: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
4c20: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 73 74 65    /* sqlite3_ste
4c30: 70 28 29 20 76 65 72 69 66 69 65 73 20 74 68 69  p() verifies thi
4c40: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  s */.  sqlite3Vd
4c50: 62 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  beEnter(p);.  if
4c60: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
4c70: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
4c80: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
4c90: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
4ca0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
4cb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
4cc0: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
4cd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
4ce0: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
4cf0: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
4d00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
4d10: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
4d20: 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
4d30: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
4d40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
4d50: 52 65 61 64 65 72 20 7c 7c 20 70 2d 3e 72 65 61  Reader || p->rea
4d60: 64 4f 6e 6c 79 21 3d 30 20 29 3b 0a 20 20 70 2d  dOnly!=0 );.  p-
4d70: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
4d80: 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
4d90: 6d 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  me = 0;.  assert
4da0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 20  ( p->explain==0 
4db0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
4dc0: 65 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75  et = 0;.  db->bu
4dd0: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
4de0: 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e 75  = 0;.  if( db->u
4df0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
4e00: 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
4e10: 5f 74 6f 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20  _to_interrupt;. 
4e20: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
4e30: 61 63 65 53 71 6c 28 70 29 3b 0a 23 69 66 6e 64  aceSql(p);.#ifnd
4e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
4e50: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
4e60: 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f 67  .  if( db->xProg
4e70: 72 65 73 73 20 29 7b 0a 20 20 20 20 75 33 32 20  ress ){.    u32 
4e80: 69 50 72 69 6f 72 20 3d 20 70 2d 3e 61 43 6f 75  iPrior = p->aCou
4e90: 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 4d 54  nter[SQLITE_STMT
4ea0: 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 5d 3b  STATUS_VM_STEP];
4eb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20 3c  .    assert( 0 <
4ec0: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
4ed0: 73 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65  s );.    nProgre
4ee0: 73 73 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 6e 50  ssLimit = db->nP
4ef0: 72 6f 67 72 65 73 73 4f 70 73 20 2d 20 28 69 50  rogressOps - (iP
4f00: 72 69 6f 72 20 25 20 64 62 2d 3e 6e 50 72 6f 67  rior % db->nProg
4f10: 72 65 73 73 4f 70 73 29 3b 0a 20 20 7d 0a 23 65  ressOps);.  }.#e
4f20: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
4f30: 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
4f40: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
4f50: 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 70 2d 3e  loc();.  if( p->
4f60: 70 63 3d 3d 30 0a 20 20 20 26 26 20 28 70 2d 3e  pc==0.   && (p->
4f70: 64 62 2d 3e 66 6c 61 67 73 20 26 20 28 53 51 4c  db->flags & (SQL
4f80: 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 7c  ITE_VdbeListing|
4f90: 53 51 4c 49 54 45 5f 56 64 62 65 45 51 50 7c 53  SQLITE_VdbeEQP|S
4fa0: 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29  QLITE_VdbeTrace)
4fb0: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e  )!=0.  ){.    in
4fc0: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  t i;.    int onc
4fd0: 65 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  e = 1;.    sqlit
4fe0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 70  e3VdbePrintSql(p
4ff0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  );.    if( p->db
5000: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5010: 5f 56 64 62 65 4c 69 73 74 69 6e 67 20 29 7b 0a  _VdbeListing ){.
5020: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 56 44        printf("VD
5030: 42 45 20 50 72 6f 67 72 61 6d 20 4c 69 73 74 69  BE Program Listi
5040: 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  ng:\n");.      f
5050: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
5060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5070: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5080: 4f 70 28 73 74 64 6f 75 74 2c 20 69 2c 20 26 61  Op(stdout, i, &a
5090: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
50a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
50b0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
50c0: 49 54 45 5f 56 64 62 65 45 51 50 20 29 7b 0a 20  ITE_VdbeEQP ){. 
50d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
50e0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
50f0: 20 20 20 20 20 20 69 66 28 20 61 4f 70 5b 69 5d        if( aOp[i]
5100: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 70 6c  .opcode==OP_Expl
5110: 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
5120: 20 69 66 28 20 6f 6e 63 65 20 29 20 70 72 69 6e   if( once ) prin
5130: 74 66 28 22 56 44 42 45 20 51 75 65 72 79 20 50  tf("VDBE Query P
5140: 6c 61 6e 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20  lan:\n");.      
5150: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e      printf("%s\n
5160: 22 2c 20 61 4f 70 5b 69 5d 2e 70 34 2e 7a 29 3b  ", aOp[i].p4.z);
5170: 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
5180: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
5190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
51a0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
51b0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54  s & SQLITE_VdbeT
51c0: 72 61 63 65 20 29 20 20 70 72 69 6e 74 66 28 22  race )  printf("
51d0: 56 44 42 45 20 54 72 61 63 65 3a 5c 6e 22 29 3b  VDBE Trace:\n");
51e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
51f0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
5200: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 70 4f  .#endif.  for(pO
5210: 70 3d 26 61 4f 70 5b 70 2d 3e 70 63 5d 3b 20 31  p=&aOp[p->pc]; 1
5220: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ; pOp++){.    /*
5230: 20 45 72 72 6f 72 73 20 61 72 65 20 64 65 74 65   Errors are dete
5240: 63 74 65 64 20 62 79 20 69 6e 64 69 76 69 64 75  cted by individu
5250: 61 6c 20 6f 70 63 6f 64 65 73 2c 20 77 69 74 68  al opcodes, with
5260: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 0a 20 20   an immediate.  
5270: 20 20 2a 2a 20 6a 75 6d 70 73 20 74 6f 20 61 62    ** jumps to ab
5280: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
5290: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
52a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
52b0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
52c0: 4f 70 3e 3d 61 4f 70 20 26 26 20 70 4f 70 3c 26  Op>=aOp && pOp<&
52d0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 29 3b 0a 23 69  aOp[p->nOp]);.#i
52e0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
52f0: 45 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  E.    start = sq
5300: 6c 69 74 65 33 48 77 74 69 6d 65 28 29 3b 0a 23  lite3Hwtime();.#
5310: 65 6e 64 69 66 0a 20 20 20 20 6e 56 6d 53 74 65  endif.    nVmSte
5320: 70 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  p++;.#ifdef SQLI
5330: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
5340: 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 69 66  CANSTATUS.    if
5350: 28 20 70 2d 3e 61 6e 45 78 65 63 20 29 20 70 2d  ( p->anExec ) p-
5360: 3e 61 6e 45 78 65 63 5b 28 69 6e 74 29 28 70 4f  >anExec[(int)(pO
5370: 70 2d 61 4f 70 29 5d 2b 2b 3b 0a 23 65 6e 64 69  p-aOp)]++;.#endi
5380: 66 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61  f..    /* Only a
5390: 6c 6c 6f 77 20 74 72 61 63 69 6e 67 20 69 66 20  llow tracing if 
53a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
53b0: 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a  defined..    */.
53c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
53d0: 42 55 47 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  BUG.    if( db->
53e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
53f0: 64 62 65 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dbeTrace ){.    
5400: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
5410: 6e 74 4f 70 28 73 74 64 6f 75 74 2c 20 28 69 6e  ntOp(stdout, (in
5420: 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 2c 20 70  t)(pOp - aOp), p
5430: 4f 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  Op);.    }.#endi
5440: 66 0a 20 20 20 20 20 20 0a 0a 20 20 20 20 2f 2a  f.      ..    /*
5450: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
5460: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 69 6d 75   we need to simu
5470: 6c 61 74 65 20 61 6e 20 69 6e 74 65 72 72 75 70  late an interrup
5480: 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  t.  This only ha
5490: 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 69 66 20  ppens.    ** if 
54a0: 77 65 20 68 61 76 65 20 61 20 73 70 65 63 69 61  we have a specia
54b0: 6c 20 74 65 73 74 20 62 75 69 6c 64 2e 0a 20 20  l test build..  
54c0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
54d0: 54 45 5f 54 45 53 54 0a 20 20 20 20 69 66 28 20  TE_TEST.    if( 
54e0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
54f0: 74 5f 63 6f 75 6e 74 3e 30 20 29 7b 0a 20 20 20  t_count>0 ){.   
5500: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72     sqlite3_inter
5510: 72 75 70 74 5f 63 6f 75 6e 74 2d 2d 3b 0a 20 20  rupt_count--;.  
5520: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5530: 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3d  interrupt_count=
5540: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5550: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
5560: 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
5570: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
5580: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
5590: 67 20 6f 6e 20 6f 74 68 65 72 20 6f 70 65 72 61  g on other opera
55a0: 6e 64 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  nds */.#ifdef SQ
55b0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
55c0: 0a 20 20 20 20 20 20 75 38 20 6f 70 50 72 6f 70  .      u8 opProp
55d0: 65 72 74 79 20 3d 20 73 71 6c 69 74 65 33 4f 70  erty = sqlite3Op
55e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 70  codeProperty[pOp
55f0: 2d 3e 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 20  ->opcode];.     
5600: 20 69 66 28 20 28 6f 70 50 72 6f 70 65 72 74 79   if( (opProperty
5610: 20 26 20 4f 50 46 4c 47 5f 49 4e 31 29 21 3d 30   & OPFLG_IN1)!=0
5620: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
5630: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 29 3b  rt( pOp->p1>0 );
5640: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5650: 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e 4d   pOp->p1<=(p->nM
5660: 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
5670: 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  r) );.        as
5680: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
5690: 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 29  (&aMem[pOp->p1])
56a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
56b0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
56c0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
56d0: 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  s(&aMem[pOp->p1]
56e0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 52 45 47  ) );.        REG
56f0: 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
5700: 3e 70 31 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  >p1, &aMem[pOp->
5710: 70 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p1]);.      }.  
5720: 20 20 20 20 69 66 28 20 28 6f 70 50 72 6f 70 65      if( (opPrope
5730: 72 74 79 20 26 20 4f 50 46 4c 47 5f 49 4e 32 29  rty & OPFLG_IN2)
5740: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
5750: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 30  ssert( pOp->p2>0
5760: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
5770: 72 74 28 20 70 4f 70 2d 3e 70 32 3c 3d 28 70 2d  rt( pOp->p2<=(p-
5780: 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
5790: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
57a0: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
57b0: 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  lid(&aMem[pOp->p
57c0: 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61  2]) );.        a
57d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
57e0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
57f0: 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  ants(&aMem[pOp->
5800: 70 32 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20  p2]) );.        
5810: 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
5820: 4f 70 2d 3e 70 32 2c 20 26 61 4d 65 6d 5b 70 4f  Op->p2, &aMem[pO
5830: 70 2d 3e 70 32 5d 29 3b 0a 20 20 20 20 20 20 7d  p->p2]);.      }
5840: 0a 20 20 20 20 20 20 69 66 28 20 28 6f 70 50 72  .      if( (opPr
5850: 6f 70 65 72 74 79 20 26 20 4f 50 46 4c 47 5f 49  operty & OPFLG_I
5860: 4e 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  N3)!=0 ){.      
5870: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
5880: 33 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  3>0 );.        a
5890: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 3d  ssert( pOp->p3<=
58a0: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
58b0: 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  nCursor) );.    
58c0: 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49      assert( memI
58d0: 73 56 61 6c 69 64 28 26 61 4d 65 6d 5b 70 4f 70  sValid(&aMem[pOp
58e0: 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20 20  ->p3]) );.      
58f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5900: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
5910: 61 72 69 61 6e 74 73 28 26 61 4d 65 6d 5b 70 4f  ariants(&aMem[pO
5920: 70 2d 3e 70 33 5d 29 20 29 3b 0a 20 20 20 20 20  p->p3]) );.     
5930: 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43     REGISTER_TRAC
5940: 45 28 70 4f 70 2d 3e 70 33 2c 20 26 61 4d 65 6d  E(pOp->p3, &aMem
5950: 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
5960: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6f    }.      if( (o
5970: 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46 4c  pProperty & OPFL
5980: 47 5f 4f 55 54 32 29 21 3d 30 20 29 7b 0a 20 20  G_OUT2)!=0 ){.  
5990: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
59a0: 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 20 20 20  p->p2>0 );.     
59b0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e     assert( pOp->
59c0: 70 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d  p2<=(p->nMem+1 -
59d0: 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a   p->nCursor) );.
59e0: 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74          memAbout
59f0: 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65  ToChange(p, &aMe
5a00: 6d 5b 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 20  m[pOp->p2]);.   
5a10: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5a20: 6f 70 50 72 6f 70 65 72 74 79 20 26 20 4f 50 46  opProperty & OPF
5a30: 4c 47 5f 4f 55 54 33 29 21 3d 30 20 29 7b 0a 20  LG_OUT3)!=0 ){. 
5a40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5a50: 4f 70 2d 3e 70 33 3e 30 20 29 3b 0a 20 20 20 20  Op->p3>0 );.    
5a60: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
5a70: 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
5a80: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
5a90: 0a 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75  .        memAbou
5aa0: 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d  tToChange(p, &aM
5ab0: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20  em[pOp->p3]);.  
5ac0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
5ad0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
5ae0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
5af0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
5b00: 46 49 4c 45 29 0a 20 20 20 20 70 4f 72 69 67 4f  FILE).    pOrigO
5b10: 70 20 3d 20 70 4f 70 3b 0a 23 65 6e 64 69 66 0a  p = pOp;.#endif.
5b20: 20 20 0a 20 20 20 20 73 77 69 74 63 68 28 20 70    .    switch( p
5b30: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 0a 2f  Op->opcode ){../
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5b90: 20 57 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 73   What follows is
5ba0: 20 61 20 6d 61 73 73 69 76 65 20 73 77 69 74 63   a massive switc
5bb0: 68 20 73 74 61 74 65 6d 65 6e 74 20 77 68 65 72  h statement wher
5bc0: 65 20 65 61 63 68 20 63 61 73 65 20 69 6d 70 6c  e each case impl
5bd0: 65 6d 65 6e 74 73 20 61 0a 2a 2a 20 73 65 70 61  ements a.** sepa
5be0: 72 61 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  rate instruction
5bf0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
5c00: 6d 61 63 68 69 6e 65 2e 20 20 49 66 20 77 65 20  machine.  If we 
5c10: 66 6f 6c 6c 6f 77 20 74 68 65 20 75 73 75 61 6c  follow the usual
5c20: 0a 2a 2a 20 69 6e 64 65 6e 74 61 74 69 6f 6e 20  .** indentation 
5c30: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2c 20 65 61 63  conventions, eac
5c40: 68 20 63 61 73 65 20 73 68 6f 75 6c 64 20 62 65  h case should be
5c50: 20 69 6e 64 65 6e 74 65 64 20 62 79 20 36 20 73   indented by 6 s
5c60: 70 61 63 65 73 2e 20 20 42 75 74 0a 2a 2a 20 74  paces.  But.** t
5c70: 68 61 74 20 69 73 20 61 20 6c 6f 74 20 6f 66 20  hat is a lot of 
5c80: 77 61 73 74 65 64 20 73 70 61 63 65 20 6f 6e 20  wasted space on 
5c90: 74 68 65 20 6c 65 66 74 20 6d 61 72 67 69 6e 2e  the left margin.
5ca0: 20 20 53 6f 20 74 68 65 20 63 6f 64 65 20 77 69    So the code wi
5cb0: 74 68 69 6e 0a 2a 2a 20 74 68 65 20 73 77 69 74  thin.** the swit
5cc0: 63 68 20 73 74 61 74 65 6d 65 6e 74 20 77 69 6c  ch statement wil
5cd0: 6c 20 62 72 65 61 6b 20 77 69 74 68 20 63 6f 6e  l break with con
5ce0: 76 65 6e 74 69 6f 6e 20 61 6e 64 20 62 65 20 66  vention and be f
5cf0: 6c 75 73 68 2d 6c 65 66 74 2e 20 41 6e 6f 74 68  lush-left. Anoth
5d00: 65 72 0a 2a 2a 20 62 69 67 20 63 6f 6d 6d 65 6e  er.** big commen
5d10: 74 20 28 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  t (similar to th
5d20: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 20 6d 61 72  is one) will mar
5d30: 6b 20 74 68 65 20 70 6f 69 6e 74 20 69 6e 20 74  k the point in t
5d40: 68 65 20 63 6f 64 65 20 77 68 65 72 65 0a 2a 2a  he code where.**
5d50: 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 62   we transition b
5d60: 61 63 6b 20 74 6f 20 6e 6f 72 6d 61 6c 20 69 6e  ack to normal in
5d70: 64 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  dentation..**.**
5d80: 20 54 68 65 20 66 6f 72 6d 61 74 74 69 6e 67 20   The formatting 
5d90: 6f 66 20 65 61 63 68 20 63 61 73 65 20 69 73 20  of each case is 
5da0: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 68 65 20  important.  The 
5db0: 6d 61 6b 65 66 69 6c 65 20 66 6f 72 20 53 51 4c  makefile for SQL
5dc0: 69 74 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73  ite.** generates
5dd0: 20 74 77 6f 20 43 20 66 69 6c 65 73 20 22 6f 70   two C files "op
5de0: 63 6f 64 65 73 2e 68 22 20 61 6e 64 20 22 6f 70  codes.h" and "op
5df0: 63 6f 64 65 73 2e 63 22 20 62 79 20 73 63 61 6e  codes.c" by scan
5e00: 6e 69 6e 67 20 74 68 69 73 0a 2a 2a 20 66 69 6c  ning this.** fil
5e10: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6c 69  e looking for li
5e20: 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  nes that begin w
5e30: 69 74 68 20 22 63 61 73 65 20 4f 50 5f 22 2e 20  ith "case OP_". 
5e40: 20 54 68 65 20 6f 70 63 6f 64 65 73 2e 68 20 66   The opcodes.h f
5e50: 69 6c 65 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  iles.** will be 
5e60: 66 69 6c 6c 65 64 20 77 69 74 68 20 23 64 65 66  filled with #def
5e70: 69 6e 65 73 20 74 68 61 74 20 67 69 76 65 20 75  ines that give u
5e80: 6e 69 71 75 65 20 69 6e 74 65 67 65 72 20 76 61  nique integer va
5e90: 6c 75 65 73 20 74 6f 20 65 61 63 68 0a 2a 2a 20  lues to each.** 
5ea0: 6f 70 63 6f 64 65 20 61 6e 64 20 74 68 65 20 6f  opcode and the o
5eb0: 70 63 6f 64 65 73 2e 63 20 66 69 6c 65 20 69 73  pcodes.c file is
5ec0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 61 6e 20   filled with an 
5ed0: 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73  array of strings
5ee0: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
5ef0: 74 72 69 6e 67 20 69 73 20 74 68 65 20 73 79 6d  tring is the sym
5f00: 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74  bolic name for t
5f10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
5f20: 20 6f 70 63 6f 64 65 2e 20 20 49 66 20 74 68 65   opcode.  If the
5f30: 0a 2a 2a 20 63 61 73 65 20 73 74 61 74 65 6d 65  .** case stateme
5f40: 6e 74 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62  nt is followed b
5f50: 79 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 66 20 74  y a comment of t
5f60: 68 65 20 66 6f 72 6d 20 22 2f 23 20 73 61 6d 65  he form "/# same
5f70: 20 61 73 20 2e 2e 2e 20 23 2f 22 0a 2a 2a 20 74   as ... #/".** t
5f80: 68 61 74 20 63 6f 6d 6d 65 6e 74 20 69 73 20 75  hat comment is u
5f90: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
5fa0: 20 74 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   the particular 
5fb0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63  value of the opc
5fc0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ode..**.** Other
5fd0: 20 6b 65 79 77 6f 72 64 73 20 69 6e 20 74 68 65   keywords in the
5fe0: 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74 20 66 6f   comment that fo
5ff0: 6c 6c 6f 77 73 20 65 61 63 68 20 63 61 73 65 20  llows each case 
6000: 61 72 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 63  are used to.** c
6010: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 4f 50 46  onstruct the OPF
6020: 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 76  LG_INITIALIZER v
6030: 61 6c 75 65 20 74 68 61 74 20 69 6e 69 74 69 61  alue that initia
6040: 6c 69 7a 65 73 20 6f 70 63 6f 64 65 50 72 6f 70  lizes opcodeProp
6050: 65 72 74 79 5b 5d 2e 0a 2a 2a 20 4b 65 79 77 6f  erty[]..** Keywo
6060: 72 64 73 20 69 6e 63 6c 75 64 65 3a 20 69 6e 31  rds include: in1
6070: 2c 20 69 6e 32 2c 20 69 6e 33 2c 20 6f 75 74 32  , in2, in3, out2
6080: 2c 20 6f 75 74 33 2e 20 20 53 65 65 0a 2a 2a 20  , out3.  See.** 
6090: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
60a0: 6b 20 73 63 72 69 70 74 20 66 6f 72 20 61 64 64  k script for add
60b0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
60c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 6f 63 75 6d  ion..**.** Docum
60d0: 65 6e 74 61 74 69 6f 6e 20 61 62 6f 75 74 20 56  entation about V
60e0: 44 42 45 20 6f 70 63 6f 64 65 73 20 69 73 20 67  DBE opcodes is g
60f0: 65 6e 65 72 61 74 65 64 20 62 79 20 73 63 61 6e  enerated by scan
6100: 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 0a 2a  ning this file.*
6110: 2a 20 66 6f 72 20 6c 69 6e 65 73 20 6f 66 20 74  * for lines of t
6120: 68 61 74 20 63 6f 6e 74 61 69 6e 20 22 4f 70 63  hat contain "Opc
6130: 6f 64 65 3a 22 2e 20 20 54 68 61 74 20 6c 69 6e  ode:".  That lin
6140: 65 20 61 6e 64 20 61 6c 6c 20 73 75 62 73 65 71  e and all subseq
6150: 75 65 6e 74 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 20  uent.** comment 
6160: 6c 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 69  lines are used i
6170: 6e 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e  n the generation
6180: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2e 68   of the opcode.h
6190: 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  tml documentatio
61a0: 6e 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  n.** file..**.**
61b0: 20 53 55 4d 4d 41 52 59 3a 0a 2a 2a 0a 2a 2a 20   SUMMARY:.**.** 
61c0: 20 20 20 20 46 6f 72 6d 61 74 74 69 6e 67 20 69      Formatting i
61d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  s important to s
61e0: 63 72 69 70 74 73 20 74 68 61 74 20 73 63 61 6e  cripts that scan
61f0: 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 20 20   this file..**  
6200: 20 20 20 44 6f 20 6e 6f 74 20 64 65 76 69 61 74     Do not deviat
6210: 65 20 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61  e from the forma
6220: 74 74 69 6e 67 20 73 74 79 6c 65 20 63 75 72 72  tting style curr
6230: 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 0a 2a 2a  ently in use..**
6240: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
6250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6290: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 47 6f 74  ./* Opcode:  Got
62a0: 6f 20 2a 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a  o * P2 * * *.**.
62b0: 2a 2a 20 41 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  ** An unconditio
62c0: 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  nal jump to addr
62d0: 65 73 73 20 50 32 2e 0a 2a 2a 20 54 68 65 20 6e  ess P2..** The n
62e0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
62f0: 65 78 65 63 75 74 65 64 20 77 69 6c 6c 20 62 65  executed will be
6300: 20 0a 2a 2a 20 74 68 65 20 6f 6e 65 20 61 74 20   .** the one at 
6310: 69 6e 64 65 78 20 50 32 20 66 72 6f 6d 20 74 68  index P2 from th
6320: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
6330: 2a 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  * the program..*
6340: 2a 0a 2a 2a 20 54 68 65 20 50 31 20 70 61 72 61  *.** The P1 para
6350: 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 61 63 74  meter is not act
6360: 75 61 6c 6c 79 20 75 73 65 64 20 62 79 20 74 68  ually used by th
6370: 69 73 20 6f 70 63 6f 64 65 2e 20 20 48 6f 77 65  is opcode.  Howe
6380: 76 65 72 2c 20 69 74 0a 2a 2a 20 69 73 20 73 6f  ver, it.** is so
6390: 6d 65 74 69 6d 65 73 20 73 65 74 20 74 6f 20 31  metimes set to 1
63a0: 20 69 6e 73 74 65 61 64 20 6f 66 20 30 20 61 73   instead of 0 as
63b0: 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 63   a hint to the c
63c0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c  ommand-line shel
63d0: 6c 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 47  l.** that this G
63e0: 6f 74 6f 20 69 73 20 74 68 65 20 62 6f 74 74 6f  oto is the botto
63f0: 6d 20 6f 66 20 61 20 6c 6f 6f 70 20 61 6e 64 20  m of a loop and 
6400: 74 68 61 74 20 74 68 65 20 6c 69 6e 65 73 20 66  that the lines f
6410: 72 6f 6d 20 50 32 20 64 6f 77 6e 0a 2a 2a 20 74  rom P2 down.** t
6420: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69  o the current li
6430: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64  ne should be ind
6440: 65 6e 74 65 64 20 66 6f 72 20 45 58 50 4c 41 49  ented for EXPLAI
6450: 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63 61 73  N output..*/.cas
6460: 65 20 4f 50 5f 47 6f 74 6f 3a 20 7b 20 20 20 20  e OP_Goto: {    
6470: 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
6480: 20 2a 2f 0a 6a 75 6d 70 5f 74 6f 5f 70 32 5f 61   */.jump_to_p2_a
6490: 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f 69 6e 74  nd_check_for_int
64a0: 65 72 72 75 70 74 3a 0a 20 20 70 4f 70 20 3d 20  errupt:.  pOp = 
64b0: 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20 2d 20 31  &aOp[pOp->p2 - 1
64c0: 5d 3b 0a 0a 20 20 2f 2a 20 4f 70 63 6f 64 65 73  ];..  /* Opcodes
64d0: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
64e0: 73 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  s the bottom of 
64f0: 61 20 6c 6f 6f 70 20 28 4f 50 5f 4e 65 78 74 2c  a loop (OP_Next,
6500: 20 4f 50 5f 50 72 65 76 2c 0a 20 20 2a 2a 20 4f   OP_Prev,.  ** O
6510: 50 5f 56 4e 65 78 74 2c 20 4f 50 5f 52 6f 77 53  P_VNext, OP_RowS
6520: 65 74 4e 65 78 74 2c 20 6f 72 20 4f 50 5f 53 6f  etNext, or OP_So
6530: 72 74 65 72 4e 65 78 74 29 20 61 6c 6c 20 6a 75  rterNext) all ju
6540: 6d 70 20 68 65 72 65 20 75 70 6f 6e 0a 20 20 2a  mp here upon.  *
6550: 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 43  * completion.  C
6560: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 73  heck to see if s
6570: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
6580: 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
6590: 65 64 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ed.  ** or if th
65a0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
65b0: 61 63 6b 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ack needs to be 
65c0: 69 6e 76 6f 6b 65 64 2e 20 0a 20 20 2a 2a 0a 20  invoked. .  **. 
65d0: 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 75 73   ** This code us
65e0: 65 73 20 75 6e 73 74 72 75 63 74 75 72 65 64 20  es unstructured 
65f0: 22 67 6f 74 6f 22 20 73 74 61 74 65 6d 65 6e 74  "goto" statement
6600: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6c  s and does not l
6610: 6f 6f 6b 20 63 6c 65 61 6e 2e 0a 20 20 2a 2a 20  ook clean..  ** 
6620: 42 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  But that is not 
6630: 64 75 65 20 74 6f 20 73 6c 6f 70 70 79 20 63 6f  due to sloppy co
6640: 64 69 6e 67 20 68 61 62 69 74 73 2e 20 54 68 65  ding habits. The
6650: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6660: 20 74 68 69 73 0a 20 20 2a 2a 20 77 61 79 20 66   this.  ** way f
6670: 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  or performance, 
6680: 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
6690: 74 6f 20 72 75 6e 20 74 68 65 20 69 6e 74 65 72  to run the inter
66a0: 72 75 70 74 20 61 6e 64 20 70 72 6f 67 72 65 73  rupt and progres
66b0: 73 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 6f 6e  s.  ** checks on
66c0: 20 65 76 65 72 79 20 6f 70 63 6f 64 65 2e 20 20   every opcode.  
66d0: 54 68 69 73 20 68 65 6c 70 73 20 73 71 6c 69 74  This helps sqlit
66e0: 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 75 6e  e3_step() to run
66f0: 20 61 62 6f 75 74 20 31 2e 35 25 0a 20 20 2a 2a   about 1.5%.  **
6700: 20 66 61 73 74 65 72 20 61 63 63 6f 72 64 69 6e   faster accordin
6710: 67 20 74 6f 20 22 76 61 6c 67 72 69 6e 64 20 2d  g to "valgrind -
6720: 2d 74 6f 6f 6c 3d 63 61 63 68 65 67 72 69 6e 64  -tool=cachegrind
6730: 22 20 2a 2f 0a 63 68 65 63 6b 5f 66 6f 72 5f 69  " */.check_for_i
6740: 6e 74 65 72 72 75 70 74 3a 0a 20 20 69 66 28 20  nterrupt:.  if( 
6750: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
6760: 70 74 65 64 20 29 20 67 6f 74 6f 20 61 62 6f 72  pted ) goto abor
6770: 74 5f 64 75 65 5f 74 6f 5f 69 6e 74 65 72 72 75  t_due_to_interru
6780: 70 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  pt;.#ifndef SQLI
6790: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
67a0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 43  _CALLBACK.  /* C
67b0: 61 6c 6c 20 74 68 65 20 70 72 6f 67 72 65 73 73  all the progress
67c0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 69 74 20   callback if it 
67d0: 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  is configured an
67e0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6e  d the required n
67f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 56 44  umber.  ** of VD
6800: 42 45 20 6f 70 73 20 68 61 76 65 20 62 65 65 6e  BE ops have been
6810: 20 65 78 65 63 75 74 65 64 20 28 65 69 74 68 65   executed (eithe
6820: 72 20 73 69 6e 63 65 20 74 68 69 73 20 69 6e 76  r since this inv
6830: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  ocation of.  ** 
6840: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
6850: 29 20 6f 72 20 73 69 6e 63 65 20 6c 61 73 74 20  ) or since last 
6860: 74 69 6d 65 20 74 68 65 20 70 72 6f 67 72 65 73  time the progres
6870: 73 20 63 61 6c 6c 62 61 63 6b 20 77 61 73 20 63  s callback was c
6880: 61 6c 6c 65 64 29 2e 0a 20 20 2a 2a 20 49 66 20  alled)..  ** If 
6890: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
68a0: 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
68b0: 6e 2d 7a 65 72 6f 2c 20 65 78 69 74 20 74 68 65  n-zero, exit the
68c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
68d0: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 72 65 74   with.  ** a ret
68e0: 75 72 6e 20 63 6f 64 65 20 53 51 4c 49 54 45 5f  urn code SQLITE_
68f0: 41 42 4f 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  ABORT..  */.  if
6900: 28 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 21  ( db->xProgress!
6910: 3d 30 20 26 26 20 6e 56 6d 53 74 65 70 3e 3d 6e  =0 && nVmStep>=n
6920: 50 72 6f 67 72 65 73 73 4c 69 6d 69 74 20 29 7b  ProgressLimit ){
6930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6940: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 21 3d 30  >nProgressOps!=0
6950: 20 29 3b 0a 20 20 20 20 6e 50 72 6f 67 72 65 73   );.    nProgres
6960: 73 4c 69 6d 69 74 20 3d 20 6e 56 6d 53 74 65 70  sLimit = nVmStep
6970: 20 2b 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73   + db->nProgress
6980: 4f 70 73 20 2d 20 28 6e 56 6d 53 74 65 70 25 64  Ops - (nVmStep%d
6990: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 29  b->nProgressOps)
69a0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 78 50  ;.    if( db->xP
69b0: 72 6f 67 72 65 73 73 28 64 62 2d 3e 70 50 72 6f  rogress(db->pPro
69c0: 67 72 65 73 73 41 72 67 29 20 29 7b 0a 20 20 20  gressArg) ){.   
69d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
69e0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 20 20  NTERRUPT;.      
69f0: 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
6a00: 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  o_error;.    }. 
6a10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 62   }.#endif.  .  b
6a20: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
6a30: 64 65 3a 20 20 47 6f 73 75 62 20 50 31 20 50 32  de:  Gosub P1 P2
6a40: 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69   * * *.**.** Wri
6a50: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  te the current a
6a60: 64 64 72 65 73 73 20 6f 6e 74 6f 20 72 65 67 69  ddress onto regi
6a70: 73 74 65 72 20 50 31 0a 2a 2a 20 61 6e 64 20 74  ster P1.** and t
6a80: 68 65 6e 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  hen jump to addr
6a90: 65 73 73 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ess P2..*/.case 
6aa0: 4f 50 5f 47 6f 73 75 62 3a 20 7b 20 20 20 20 20  OP_Gosub: {     
6ab0: 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a         /* jump *
6ac0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
6ad0: 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70 31  >p1>0 && pOp->p1
6ae0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
6af0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
6b00: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
6b10: 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
6b20: 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28   VdbeMemDynamic(
6b30: 70 49 6e 31 29 3d 3d 30 20 29 3b 0a 20 20 6d 65  pIn1)==0 );.  me
6b40: 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
6b50: 2c 20 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d  , pIn1);.  pIn1-
6b60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6b70: 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69 20 3d 20  ;.  pIn1->u.i = 
6b80: 28 69 6e 74 29 28 70 4f 70 2d 61 4f 70 29 3b 0a  (int)(pOp-aOp);.
6b90: 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
6ba0: 28 70 4f 70 2d 3e 70 31 2c 20 70 49 6e 31 29 3b  (pOp->p1, pIn1);
6bb0: 0a 0a 20 20 2f 2a 20 4d 6f 73 74 20 6a 75 6d 70  ..  /* Most jump
6bc0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 64 6f 20 61   operations do a
6bd0: 20 67 6f 74 6f 20 74 6f 20 74 68 69 73 20 73 70   goto to this sp
6be0: 6f 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75  ot in order to u
6bf0: 70 64 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  pdate.  ** the p
6c00: 4f 70 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 6a  Op pointer. */.j
6c10: 75 6d 70 5f 74 6f 5f 70 32 3a 0a 20 20 70 4f 70  ump_to_p2:.  pOp
6c20: 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 32 20   = &aOp[pOp->p2 
6c30: 2d 20 31 5d 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  - 1];.  break;.}
6c40: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 52 65  ../* Opcode:  Re
6c50: 74 75 72 6e 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  turn P1 * * * *.
6c60: 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 74 68  **.** Jump to th
6c70: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
6c80: 6f 6e 20 61 66 74 65 72 20 74 68 65 20 61 64 64  on after the add
6c90: 72 65 73 73 20 69 6e 20 72 65 67 69 73 74 65 72  ress in register
6ca0: 20 50 31 2e 20 20 41 66 74 65 72 0a 2a 2a 20 74   P1.  After.** t
6cb0: 68 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74 65  he jump, registe
6cc0: 72 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e 64  r P1 becomes und
6cd0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73 65 20  efined..*/.case 
6ce0: 4f 50 5f 52 65 74 75 72 6e 3a 20 7b 20 20 20 20  OP_Return: {    
6cf0: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
6d00: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
6d10: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
6d20: 72 74 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3d  rt( pIn1->flags=
6d30: 3d 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 70 4f  =MEM_Int );.  pO
6d40: 70 20 3d 20 26 61 4f 70 5b 70 49 6e 31 2d 3e 75  p = &aOp[pIn1->u
6d50: 2e 69 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61  .i];.  pIn1->fla
6d60: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
6d70: 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  ed;.  break;.}..
6d80: 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 69 74 43  /* Opcode: InitC
6d90: 6f 72 6f 75 74 69 6e 65 20 50 31 20 50 32 20 50  oroutine P1 P2 P
6da0: 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20  3 * *.**.** Set 
6db0: 75 70 20 72 65 67 69 73 74 65 72 20 50 31 20 73  up register P1 s
6dc0: 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 59  o that it will Y
6dd0: 69 65 6c 64 20 74 6f 20 74 68 65 20 63 6f 72 6f  ield to the coro
6de0: 75 74 69 6e 65 0a 2a 2a 20 6c 6f 63 61 74 65 64  utine.** located
6df0: 20 61 74 20 61 64 64 72 65 73 73 20 50 33 2e 0a   at address P3..
6e00: 2a 2a 0a 2a 2a 20 49 66 20 50 32 21 3d 30 20 74  **.** If P2!=0 t
6e10: 68 65 6e 20 74 68 65 20 63 6f 72 6f 75 74 69 6e  hen the coroutin
6e20: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
6e30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
6e40: 6c 6f 77 73 0a 2a 2a 20 74 68 69 73 20 6f 70 63  lows.** this opc
6e50: 6f 64 65 2e 20 20 53 6f 20 6a 75 6d 70 20 6f 76  ode.  So jump ov
6e60: 65 72 20 74 68 65 20 63 6f 72 6f 75 74 69 6e 65  er the coroutine
6e70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
6e80: 74 6f 0a 2a 2a 20 61 64 64 72 65 73 73 20 50 32  to.** address P2
6e90: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
6ea0: 3a 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65 0a 2a  : EndCoroutine.*
6eb0: 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 69 74 43 6f  /.case OP_InitCo
6ec0: 72 6f 75 74 69 6e 65 3a 20 7b 20 20 20 20 20 2f  routine: {     /
6ed0: 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  * jump */.  asse
6ee0: 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20 26 26  rt( pOp->p1>0 &&
6ef0: 20 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e 6e    pOp->p1<=(p->n
6f00: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
6f10: 6f 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  or) );.  assert(
6f20: 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 26 26 20 70   pOp->p2>=0 && p
6f30: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4f 70 20 29 3b  Op->p2<p->nOp );
6f40: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
6f50: 70 33 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  p3>=0 && pOp->p3
6f60: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 75  <p->nOp );.  pOu
6f70: 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
6f80: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 56  1];.  assert( !V
6f90: 64 62 65 4d 65 6d 44 79 6e 61 6d 69 63 28 70 4f  dbeMemDynamic(pO
6fa0: 75 74 29 20 29 3b 0a 20 20 70 4f 75 74 2d 3e 75  ut) );.  pOut->u
6fb0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 20 2d 20 31  .i = pOp->p3 - 1
6fc0: 3b 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20  ;.  pOut->flags 
6fd0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 69 66 28  = MEM_Int;.  if(
6fe0: 20 70 4f 70 2d 3e 70 32 20 29 20 67 6f 74 6f 20   pOp->p2 ) goto 
6ff0: 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
7000: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
7010: 65 3a 20 20 45 6e 64 43 6f 72 6f 75 74 69 6e 65  e:  EndCoroutine
7020: 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
7030: 2a 20 54 68 65 20 69 6e 73 74 72 75 63 74 69 6f  * The instructio
7040: 6e 20 61 74 20 74 68 65 20 61 64 64 72 65 73 73  n at the address
7050: 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
7060: 69 73 20 61 20 59 69 65 6c 64 2e 0a 2a 2a 20 4a  is a Yield..** J
7070: 75 6d 70 20 74 6f 20 74 68 65 20 50 32 20 70 61  ump to the P2 pa
7080: 72 61 6d 65 74 65 72 20 6f 66 20 74 68 61 74 20  rameter of that 
7090: 59 69 65 6c 64 2e 0a 2a 2a 20 41 66 74 65 72 20  Yield..** After 
70a0: 74 68 65 20 6a 75 6d 70 2c 20 72 65 67 69 73 74  the jump, regist
70b0: 65 72 20 50 31 20 62 65 63 6f 6d 65 73 20 75 6e  er P1 becomes un
70c0: 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  defined..**.** S
70d0: 65 65 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72  ee also: InitCor
70e0: 6f 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f  outine.*/.case O
70f0: 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 3a 20  P_EndCoroutine: 
7100: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  {           /* i
7110: 6e 31 20 2a 2f 0a 20 20 56 64 62 65 4f 70 20 2a  n1 */.  VdbeOp *
7120: 70 43 61 6c 6c 65 72 3b 0a 20 20 70 49 6e 31 20  pCaller;.  pIn1 
7130: 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
7140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
7150: 2d 3e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74  ->flags==MEM_Int
7160: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
7170: 6e 31 2d 3e 75 2e 69 3e 3d 30 20 26 26 20 70 49  n1->u.i>=0 && pI
7180: 6e 31 2d 3e 75 2e 69 3c 70 2d 3e 6e 4f 70 20 29  n1->u.i<p->nOp )
7190: 3b 0a 20 20 70 43 61 6c 6c 65 72 20 3d 20 26 61  ;.  pCaller = &a
71a0: 4f 70 5b 70 49 6e 31 2d 3e 75 2e 69 5d 3b 0a 20  Op[pIn1->u.i];. 
71b0: 20 61 73 73 65 72 74 28 20 70 43 61 6c 6c 65 72   assert( pCaller
71c0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 59 69 65  ->opcode==OP_Yie
71d0: 6c 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ld );.  assert( 
71e0: 70 43 61 6c 6c 65 72 2d 3e 70 32 3e 3d 30 20 26  pCaller->p2>=0 &
71f0: 26 20 70 43 61 6c 6c 65 72 2d 3e 70 32 3c 70 2d  & pCaller->p2<p-
7200: 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20  >nOp );.  pOp = 
7210: 26 61 4f 70 5b 70 43 61 6c 6c 65 72 2d 3e 70 32  &aOp[pCaller->p2
7220: 20 2d 20 31 5d 3b 0a 20 20 70 49 6e 31 2d 3e 66   - 1];.  pIn1->f
7230: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
7240: 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  ined;.  break;.}
7250: 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 59 69  ../* Opcode:  Yi
7260: 65 6c 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  eld P1 P2 * * *.
7270: 2a 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 70  **.** Swap the p
7280: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 77  rogram counter w
7290: 69 74 68 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ith the value in
72a0: 20 72 65 67 69 73 74 65 72 20 50 31 2e 20 20 54   register P1.  T
72b0: 68 69 73 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  his.** has the e
72c0: 66 66 65 63 74 20 6f 66 20 79 69 65 6c 64 69 6e  ffect of yieldin
72d0: 67 20 74 6f 20 61 20 63 6f 72 6f 75 74 69 6e 65  g to a coroutine
72e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
72f0: 6f 72 6f 75 74 69 6e 65 20 74 68 61 74 20 69 73  oroutine that is
7300: 20 6c 61 75 6e 63 68 65 64 20 62 79 20 74 68 69   launched by thi
7310: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  s instruction en
7320: 64 73 20 77 69 74 68 0a 2a 2a 20 59 69 65 6c 64  ds with.** Yield
7330: 20 6f 72 20 52 65 74 75 72 6e 20 74 68 65 6e 20   or Return then 
7340: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 74 68 65 20  continue to the 
7350: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
7360: 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
7370: 20 63 6f 72 6f 75 74 69 6e 65 20 6c 61 75 6e 63   coroutine launc
7380: 68 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74  hed by this inst
7390: 72 75 63 74 69 6f 6e 20 65 6e 64 73 20 77 69 74  ruction ends wit
73a0: 68 0a 2a 2a 20 45 6e 64 43 6f 72 6f 75 74 69 6e  h.** EndCoroutin
73b0: 65 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  e, then jump to 
73c0: 50 32 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  P2 rather than c
73d0: 6f 6e 74 69 6e 75 69 6e 67 20 77 69 74 68 20 74  ontinuing with t
73e0: 68 65 0a 2a 2a 20 6e 65 78 74 20 69 6e 73 74 72  he.** next instr
73f0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65  uction..**.** Se
7400: 65 20 61 6c 73 6f 3a 20 49 6e 69 74 43 6f 72 6f  e also: InitCoro
7410: 75 74 69 6e 65 0a 2a 2f 0a 63 61 73 65 20 4f 50  utine.*/.case OP
7420: 5f 59 69 65 6c 64 3a 20 7b 20 20 20 20 20 20 20  _Yield: {       
7430: 20 20 20 20 20 2f 2a 20 69 6e 31 2c 20 6a 75 6d       /* in1, jum
7440: 70 20 2a 2f 0a 20 20 69 6e 74 20 70 63 44 65 73  p */.  int pcDes
7450: 74 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  t;.  pIn1 = &aMe
7460: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  m[pOp->p1];.  as
7470: 73 65 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e  sert( VdbeMemDyn
7480: 61 6d 69 63 28 70 49 6e 31 29 3d 3d 30 20 29 3b  amic(pIn1)==0 );
7490: 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 3d  .  pIn1->flags =
74a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 70 63 44 65   MEM_Int;.  pcDe
74b0: 73 74 20 3d 20 28 69 6e 74 29 70 49 6e 31 2d 3e  st = (int)pIn1->
74c0: 75 2e 69 3b 0a 20 20 70 49 6e 31 2d 3e 75 2e 69  u.i;.  pIn1->u.i
74d0: 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61   = (int)(pOp - a
74e0: 4f 70 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  Op);.  REGISTER_
74f0: 54 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70  TRACE(pOp->p1, p
7500: 49 6e 31 29 3b 0a 20 20 70 4f 70 20 3d 20 26 61  In1);.  pOp = &a
7510: 4f 70 5b 70 63 44 65 73 74 5d 3b 0a 20 20 62 72  Op[pcDest];.  br
7520: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
7530: 65 3a 20 20 48 61 6c 74 49 66 4e 75 6c 6c 20 20  e:  HaltIfNull  
7540: 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
7550: 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72  * Synopsis: if r
7560: 5b 50 33 5d 3d 6e 75 6c 6c 20 68 61 6c 74 0a 2a  [P3]=null halt.*
7570: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 76  *.** Check the v
7580: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
7590: 20 50 33 2e 20 20 49 66 20 69 74 20 69 73 20 4e   P3.  If it is N
75a0: 55 4c 4c 20 74 68 65 6e 20 48 61 6c 74 20 75 73  ULL then Halt us
75b0: 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
75c0: 20 50 31 2c 20 50 32 2c 20 61 6e 64 20 50 34 20   P1, P2, and P4 
75d0: 61 73 20 69 66 20 74 68 69 73 20 77 65 72 65 20  as if this were 
75e0: 61 20 48 61 6c 74 20 69 6e 73 74 72 75 63 74 69  a Halt instructi
75f0: 6f 6e 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 76  on.  If the.** v
7600: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
7610: 20 50 33 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   P3 is not NULL,
7620: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
7630: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
7640: 2a 20 54 68 65 20 50 35 20 70 61 72 61 6d 65 74  * The P5 paramet
7650: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 31 2e 0a  er should be 1..
7660: 2a 2f 0a 63 61 73 65 20 4f 50 5f 48 61 6c 74 49  */.case OP_HaltI
7670: 66 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 2f 2a  fNull: {      /*
7680: 20 69 6e 33 20 2a 2f 0a 20 20 70 49 6e 33 20 3d   in3 */.  pIn3 =
7690: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
76a0: 0a 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c  .  if( (pIn3->fl
76b0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
76c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 2f 2a  =0 ) break;.  /*
76d0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
76e0: 74 6f 20 4f 50 5f 48 61 6c 74 20 2a 2f 0a 7d 0a  to OP_Halt */.}.
76f0: 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 20 48 61 6c  ./* Opcode:  Hal
7700: 74 20 50 31 20 50 32 20 2a 20 50 34 20 50 35 0a  t P1 P2 * P4 P5.
7710: 2a 2a 0a 2a 2a 20 45 78 69 74 20 69 6d 6d 65 64  **.** Exit immed
7720: 69 61 74 65 6c 79 2e 20 20 41 6c 6c 20 6f 70 65  iately.  All ope
7730: 6e 20 63 75 72 73 6f 72 73 2c 20 65 74 63 20 61  n cursors, etc a
7740: 72 65 20 63 6c 6f 73 65 64 0a 2a 2a 20 61 75 74  re closed.** aut
7750: 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 0a 2a  omatically..**.*
7760: 2a 20 50 31 20 69 73 20 74 68 65 20 72 65 73 75  * P1 is the resu
7770: 6c 74 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  lt code returned
7780: 20 62 79 20 73 71 6c 69 74 65 33 5f 65 78 65 63   by sqlite3_exec
7790: 28 29 2c 20 73 71 6c 69 74 65 33 5f 72 65 73 65  (), sqlite3_rese
77a0: 74 28 29 2c 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  t(),.** or sqlit
77b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29 2e 20 20  e3_finalize().  
77c0: 46 6f 72 20 61 20 6e 6f 72 6d 61 6c 20 68 61 6c  For a normal hal
77d0: 74 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 62  t, this should b
77e0: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 28 30 29 2e  e SQLITE_OK (0).
77f0: 0a 2a 2a 20 46 6f 72 20 65 72 72 6f 72 73 2c 20  .** For errors, 
7800: 69 74 20 63 61 6e 20 62 65 20 73 6f 6d 65 20 6f  it can be some o
7810: 74 68 65 72 20 76 61 6c 75 65 2e 20 20 49 66 20  ther value.  If 
7820: 50 31 21 3d 30 20 74 68 65 6e 20 50 32 20 77 69  P1!=0 then P2 wi
7830: 6c 6c 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  ll determine.** 
7840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7850: 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 63  o rollback the c
7860: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
7870: 6f 6e 2e 20 20 44 6f 20 6e 6f 74 20 72 6f 6c 6c  on.  Do not roll
7880: 62 61 63 6b 0a 2a 2a 20 69 66 20 50 32 3d 3d 4f  back.** if P2==O
7890: 45 5f 46 61 69 6c 2e 20 44 6f 20 74 68 65 20 72  E_Fail. Do the r
78a0: 6f 6c 6c 62 61 63 6b 20 69 66 20 50 32 3d 3d 4f  ollback if P2==O
78b0: 45 5f 52 6f 6c 6c 62 61 63 6b 2e 20 20 49 66 20  E_Rollback.  If 
78c0: 50 32 3d 3d 4f 45 5f 41 62 6f 72 74 2c 0a 2a 2a  P2==OE_Abort,.**
78d0: 20 74 68 65 6e 20 62 61 63 6b 20 6f 75 74 20 61   then back out a
78e0: 6c 6c 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ll changes that 
78f0: 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 64 75  have occurred du
7900: 72 69 6e 67 20 74 68 69 73 20 65 78 65 63 75 74  ring this execut
7910: 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
7920: 42 45 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 72  BE, but do not r
7930: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
7940: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
7950: 49 66 20 50 34 20 69 73 20 6e 6f 74 20 6e 75 6c  If P4 is not nul
7960: 6c 20 74 68 65 6e 20 69 74 20 69 73 20 61 6e 20  l then it is an 
7970: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
7980: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 50 35 20 69  ring..**.** P5 i
7990: 73 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65  s a value betwee
79a0: 6e 20 30 20 61 6e 64 20 34 2c 20 69 6e 63 6c 75  n 0 and 4, inclu
79b0: 73 69 76 65 2c 20 74 68 61 74 20 6d 6f 64 69 66  sive, that modif
79c0: 69 65 73 20 74 68 65 20 50 34 20 73 74 72 69 6e  ies the P4 strin
79d0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20  g..**.**    0:  
79e0: 28 6e 6f 20 63 68 61 6e 67 65 29 0a 2a 2a 20 20  (no change).**  
79f0: 20 20 31 3a 20 20 4e 4f 54 20 4e 55 4c 4c 20 63    1:  NOT NULL c
7a00: 6f 6e 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  ontraint failed:
7a10: 20 50 34 0a 2a 2a 20 20 20 20 32 3a 20 20 55 4e   P4.**    2:  UN
7a20: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
7a30: 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 20 20 20  failed: P4.**   
7a40: 20 33 3a 20 20 43 48 45 43 4b 20 63 6f 6e 73 74   3:  CHECK const
7a50: 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 50 34  raint failed: P4
7a60: 0a 2a 2a 20 20 20 20 34 3a 20 20 46 4f 52 45 49  .**    4:  FOREI
7a70: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
7a80: 74 20 66 61 69 6c 65 64 3a 20 50 34 0a 2a 2a 0a  t failed: P4.**.
7a90: 2a 2a 20 49 66 20 50 35 20 69 73 20 6e 6f 74 20  ** If P5 is not 
7aa0: 7a 65 72 6f 20 61 6e 64 20 50 34 20 69 73 20 4e  zero and P4 is N
7ab0: 55 4c 4c 2c 20 74 68 65 6e 20 65 76 65 72 79 74  ULL, then everyt
7ac0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 22  hing after the "
7ad0: 3a 22 20 69 73 0a 2a 2a 20 6f 6d 69 74 74 65 64  :" is.** omitted
7ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
7af0: 20 61 6e 20 69 6d 70 6c 69 65 64 20 22 48 61 6c   an implied "Hal
7b00: 74 20 30 20 30 20 30 22 20 69 6e 73 74 72 75 63  t 0 0 0" instruc
7b10: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 20 61 74  tion inserted at
7b20: 20 74 68 65 20 76 65 72 79 20 65 6e 64 20 6f 66   the very end of
7b30: 0a 2a 2a 20 65 76 65 72 79 20 70 72 6f 67 72 61  .** every progra
7b40: 6d 2e 20 20 53 6f 20 61 20 6a 75 6d 70 20 70 61  m.  So a jump pa
7b50: 73 74 20 74 68 65 20 6c 61 73 74 20 69 6e 73 74  st the last inst
7b60: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ruction of the p
7b70: 72 6f 67 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65  rogram.** is the
7b80: 20 73 61 6d 65 20 61 73 20 65 78 65 63 75 74 69   same as executi
7b90: 6e 67 20 48 61 6c 74 2e 0a 2a 2f 0a 63 61 73 65  ng Halt..*/.case
7ba0: 20 4f 50 5f 48 61 6c 74 3a 20 7b 0a 20 20 56 64   OP_Halt: {.  Vd
7bb0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
7bc0: 0a 20 20 69 6e 74 20 70 63 78 3b 0a 0a 20 20 70  .  int pcx;..  p
7bd0: 63 78 20 3d 20 28 69 6e 74 29 28 70 4f 70 20 2d  cx = (int)(pOp -
7be0: 20 61 4f 70 29 3b 0a 20 20 69 66 28 20 70 4f 70   aOp);.  if( pOp
7bf0: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->p1==SQLITE_OK 
7c00: 26 26 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  && p->pFrame ){.
7c10: 20 20 20 20 2f 2a 20 48 61 6c 74 20 74 68 65 20      /* Halt the 
7c20: 73 75 62 2d 70 72 6f 67 72 61 6d 2e 20 52 65 74  sub-program. Ret
7c30: 75 72 6e 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  urn control to t
7c40: 68 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 2e  he parent frame.
7c50: 20 2a 2f 0a 20 20 20 20 70 46 72 61 6d 65 20 3d   */.    pFrame =
7c60: 20 70 2d 3e 70 46 72 61 6d 65 3b 0a 20 20 20 20   p->pFrame;.    
7c70: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 70 46 72 61  p->pFrame = pFra
7c80: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  me->pParent;.   
7c90: 20 70 2d 3e 6e 46 72 61 6d 65 2d 2d 3b 0a 20 20   p->nFrame--;.  
7ca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7cb0: 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
7cc0: 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 70 63 78  Change);.    pcx
7cd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 72   = sqlite3VdbeFr
7ce0: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
7cf0: 65 29 3b 0a 20 20 20 20 6c 61 73 74 52 6f 77 69  e);.    lastRowi
7d00: 64 20 3d 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  d = db->lastRowi
7d10: 64 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  d;.    if( pOp->
7d20: 70 32 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  p2==OE_Ignore ){
7d30: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75  .      /* Instru
7d40: 63 74 69 6f 6e 20 70 63 78 20 69 73 20 74 68 65  ction pcx is the
7d50: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 74 68 61 74   OP_Program that
7d60: 20 69 6e 76 6f 6b 65 64 20 74 68 65 20 73 75 62   invoked the sub
7d70: 2d 70 72 6f 67 72 61 6d 20 0a 20 20 20 20 20 20  -program .      
7d80: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
7d90: 6e 67 20 68 61 6c 74 65 64 2e 20 49 66 20 74 68  ng halted. If th
7da0: 65 20 70 32 20 69 6e 73 74 72 75 63 74 69 6f 6e  e p2 instruction
7db0: 20 6f 66 20 74 68 69 73 20 4f 50 5f 48 61 6c 74   of this OP_Halt
7dc0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  .      ** instru
7dd0: 63 74 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ction is set to 
7de0: 4f 45 5f 49 67 6e 6f 72 65 2c 20 74 68 65 6e 20  OE_Ignore, then 
7df0: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  the sub-program 
7e00: 69 73 20 74 68 72 6f 77 69 6e 67 0a 20 20 20 20  is throwing.    
7e10: 20 20 2a 2a 20 61 6e 20 49 47 4e 4f 52 45 20 65    ** an IGNORE e
7e20: 78 63 65 70 74 69 6f 6e 2e 20 49 6e 20 74 68 69  xception. In thi
7e30: 73 20 63 61 73 65 20 6a 75 6d 70 20 74 6f 20 74  s case jump to t
7e40: 68 65 20 61 64 64 72 65 73 73 20 73 70 65 63 69  he address speci
7e50: 66 69 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 73  fied.      ** as
7e60: 20 74 68 65 20 70 32 20 6f 66 20 74 68 65 20 63   the p2 of the c
7e70: 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67 72 61  alling OP_Progra
7e80: 6d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 63 78  m.  */.      pcx
7e90: 20 3d 20 70 2d 3e 61 4f 70 5b 70 63 78 5d 2e 70   = p->aOp[pcx].p
7ea0: 32 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  2-1;.    }.    a
7eb0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
7ec0: 20 61 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b   aMem = p->aMem;
7ed0: 0a 20 20 20 20 70 4f 70 20 3d 20 26 61 4f 70 5b  .    pOp = &aOp[
7ee0: 70 63 78 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b  pcx];.    break;
7ef0: 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 70  .  }.  p->rc = p
7f00: 4f 70 2d 3e 70 31 3b 0a 20 20 70 2d 3e 65 72 72  Op->p1;.  p->err
7f10: 6f 72 41 63 74 69 6f 6e 20 3d 20 28 75 38 29 70  orAction = (u8)p
7f20: 4f 70 2d 3e 70 32 3b 0a 20 20 70 2d 3e 70 63 20  Op->p2;.  p->pc 
7f30: 3d 20 70 63 78 3b 0a 20 20 61 73 73 65 72 74 28  = pcx;.  assert(
7f40: 20 70 4f 70 2d 3e 70 35 3e 3d 30 20 26 26 20 70   pOp->p5>=0 && p
7f50: 4f 70 2d 3e 70 35 3c 3d 34 20 29 3b 0a 20 20 69  Op->p5<=4 );.  i
7f60: 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
7f70: 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
7f80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
7f90: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
7fa0: 7a 54 79 70 65 5b 5d 20 3d 20 7b 20 22 4e 4f 54  zType[] = { "NOT
7fb0: 20 4e 55 4c 4c 22 2c 20 22 55 4e 49 51 55 45 22   NULL", "UNIQUE"
7fc0: 2c 20 22 43 48 45 43 4b 22 2c 0a 20 20 20 20 20  , "CHECK",.     
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ff0: 20 20 20 20 20 20 20 20 22 46 4f 52 45 49 47 4e          "FOREIGN
8000: 20 4b 45 59 22 20 7d 3b 0a 20 20 20 20 20 20 74   KEY" };.      t
8010: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35  estcase( pOp->p5
8020: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
8030: 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d  tcase( pOp->p5==
8040: 32 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  2 );.      testc
8050: 61 73 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 33 20  ase( pOp->p5==3 
8060: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8070: 65 28 20 70 4f 70 2d 3e 70 35 3d 3d 34 20 29 3b  e( pOp->p5==4 );
8080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8090: 62 65 45 72 72 6f 72 28 70 2c 20 22 25 73 20 63  beError(p, "%s c
80a0: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
80b0: 22 2c 20 61 7a 54 79 70 65 5b 70 4f 70 2d 3e 70  ", azType[pOp->p
80c0: 35 2d 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  5-1]);.      if(
80d0: 20 70 4f 70 2d 3e 70 34 2e 7a 20 29 7b 0a 20 20   pOp->p4.z ){.  
80e0: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
80f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8100: 66 28 64 62 2c 20 22 25 7a 3a 20 25 73 22 2c 20  f(db, "%z: %s", 
8110: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 70 4f 70 2d  p->zErrMsg, pOp-
8120: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a  >p4.z);.      }.
8130: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8140: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
8150: 72 28 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  r(p, "%s", pOp->
8160: 70 34 2e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p4.z);.    }.   
8170: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 70 4f 70   sqlite3_log(pOp
8180: 2d 3e 70 31 2c 20 22 61 62 6f 72 74 20 61 74 20  ->p1, "abort at 
8190: 25 64 20 69 6e 20 5b 25 73 5d 3a 20 25 73 22 2c  %d in [%s]: %s",
81a0: 20 70 63 78 2c 20 70 2d 3e 7a 53 71 6c 2c 20 70   pcx, p->zSql, p
81b0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  ->zErrMsg);.  }.
81c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
81d0: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 61 73 73  beHalt(p);.  ass
81e0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
81f0: 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  BUSY || rc==SQLI
8200: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
8210: 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  ITE_ERROR );.  i
8220: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
8230: 53 59 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  SY ){.    p->rc 
8240: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
8250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8260: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
8270: 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
8280: 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
8290: 41 49 4e 54 20 29 3b 0a 20 20 20 20 61 73 73 65  AINT );.    asse
82a0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
82b0: 4b 20 7c 7c 20 64 62 2d 3e 6e 44 65 66 65 72 72  K || db->nDeferr
82c0: 65 64 43 6f 6e 73 3e 30 20 7c 7c 20 64 62 2d 3e  edCons>0 || db->
82d0: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
82e0: 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  >0 );.    rc = p
82f0: 2d 3e 72 63 20 3f 20 53 51 4c 49 54 45 5f 45 52  ->rc ? SQLITE_ER
8300: 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 44 4f 4e  ROR : SQLITE_DON
8310: 45 3b 0a 20 20 7d 0a 20 20 67 6f 74 6f 20 76 64  E;.  }.  goto vd
8320: 62 65 5f 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  be_return;.}../*
8330: 20 4f 70 63 6f 64 65 3a 20 49 6e 74 65 67 65 72   Opcode: Integer
8340: 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
8350: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
8360: 50 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 33 32 2d  P1.**.** The 32-
8370: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
8380: 65 20 50 31 20 69 73 20 77 72 69 74 74 65 6e 20  e P1 is written 
8390: 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
83a0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 74  ..*/.case OP_Int
83b0: 65 67 65 72 3a 20 7b 20 20 20 20 20 20 20 20 20  eger: {         
83c0: 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70 4f 75  /* out2 */.  pOu
83d0: 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
83e0: 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f  se(p, pOp);.  pO
83f0: 75 74 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  ut->u.i = pOp->p
8400: 31 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  1;.  break;.}../
8410: 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 74 36 34 20  * Opcode: Int64 
8420: 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20 53  * P2 * P4 *.** S
8430: 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 50  ynopsis: r[P2]=P
8440: 34 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 61 20  4.**.** P4 is a 
8450: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 36 34 2d  pointer to a 64-
8460: 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
8470: 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74 68 61 74  e..** Write that
8480: 20 76 61 6c 75 65 20 69 6e 74 6f 20 72 65 67 69   value into regi
8490: 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63 61 73 65  ster P2..*/.case
84a0: 20 4f 50 5f 49 6e 74 36 34 3a 20 7b 20 20 20 20   OP_Int64: {    
84b0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
84c0: 2f 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  /.  pOut = out2P
84d0: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
84e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
84f0: 2d 3e 70 34 2e 70 49 36 34 21 3d 30 20 29 3b 0a  ->p4.pI64!=0 );.
8500: 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 2a 70    pOut->u.i = *p
8510: 4f 70 2d 3e 70 34 2e 70 49 36 34 3b 0a 20 20 62  Op->p4.pI64;.  b
8520: 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  reak;.}..#ifndef
8530: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
8540: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f  ATING_POINT./* O
8550: 70 63 6f 64 65 3a 20 52 65 61 6c 20 2a 20 50 32  pcode: Real * P2
8560: 20 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70   * P4 *.** Synop
8570: 73 69 73 3a 20 72 5b 50 32 5d 3d 50 34 0a 2a 2a  sis: r[P2]=P4.**
8580: 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
8590: 74 65 72 20 74 6f 20 61 20 36 34 2d 62 69 74 20  ter to a 64-bit 
85a0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
85b0: 61 6c 75 65 2e 0a 2a 2a 20 57 72 69 74 65 20 74  alue..** Write t
85c0: 68 61 74 20 76 61 6c 75 65 20 69 6e 74 6f 20 72  hat value into r
85d0: 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2f 0a 63  egister P2..*/.c
85e0: 61 73 65 20 4f 50 5f 52 65 61 6c 3a 20 7b 20 20  ase OP_Real: {  
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
8600: 65 20 61 73 20 54 4b 5f 46 4c 4f 41 54 2c 20 6f  e as TK_FLOAT, o
8610: 75 74 32 20 2a 2f 0a 20 20 70 4f 75 74 20 3d 20  ut2 */.  pOut = 
8620: 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70  out2Prerelease(p
8630: 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d 3e  , pOp);.  pOut->
8640: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c  flags = MEM_Real
8650: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
8660: 69 74 65 33 49 73 4e 61 4e 28 2a 70 4f 70 2d 3e  ite3IsNaN(*pOp->
8670: 70 34 2e 70 52 65 61 6c 29 20 29 3b 0a 20 20 70  p4.pReal) );.  p
8680: 4f 75 74 2d 3e 75 2e 72 20 3d 20 2a 70 4f 70 2d  Out->u.r = *pOp-
8690: 3e 70 34 2e 70 52 65 61 6c 3b 0a 20 20 62 72 65  >p4.pReal;.  bre
86a0: 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ak;.}.#endif../*
86b0: 20 4f 70 63 6f 64 65 3a 20 53 74 72 69 6e 67 38   Opcode: String8
86c0: 20 2a 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20   * P2 * P4 *.** 
86d0: 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
86e0: 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 34 20 70 6f  'P4'.**.** P4 po
86f0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 20 74 65  ints to a nul te
8700: 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 73  rminated UTF-8 s
8710: 74 72 69 6e 67 2e 20 54 68 69 73 20 6f 70 63 6f  tring. This opco
8720: 64 65 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  de is transforme
8730: 64 20 0a 2a 2a 20 69 6e 74 6f 20 61 20 53 74 72  d .** into a Str
8740: 69 6e 67 20 6f 70 63 6f 64 65 20 62 65 66 6f 72  ing opcode befor
8750: 65 20 69 74 20 69 73 20 65 78 65 63 75 74 65 64  e it is executed
8760: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
8770: 69 6d 65 2e 20 20 44 75 72 69 6e 67 0a 2a 2a 20  ime.  During.** 
8780: 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  this transformat
8790: 69 6f 6e 2c 20 74 68 65 20 6c 65 6e 67 74 68 20  ion, the length 
87a0: 6f 66 20 73 74 72 69 6e 67 20 50 34 20 69 73 20  of string P4 is 
87b0: 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 73 74 6f  computed and sto
87c0: 72 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 50 31  red.** as the P1
87d0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 63   parameter..*/.c
87e0: 61 73 65 20 4f 50 5f 53 74 72 69 6e 67 38 3a 20  ase OP_String8: 
87f0: 7b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d  {         /* sam
8800: 65 20 61 73 20 54 4b 5f 53 54 52 49 4e 47 2c 20  e as TK_STRING, 
8810: 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73 65 72 74  out2 */.  assert
8820: 28 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  ( pOp->p4.z!=0 )
8830: 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
8840: 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
8850: 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  );.  pOp->opcode
8860: 20 3d 20 4f 50 5f 53 74 72 69 6e 67 3b 0a 20 20   = OP_String;.  
8870: 70 4f 70 2d 3e 70 31 20 3d 20 73 71 6c 69 74 65  pOp->p1 = sqlite
8880: 33 53 74 72 6c 65 6e 33 30 28 70 4f 70 2d 3e 70  3Strlen30(pOp->p
8890: 34 2e 7a 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  4.z);..#ifndef S
88a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
88b0: 0a 20 20 69 66 28 20 65 6e 63 6f 64 69 6e 67 21  .  if( encoding!
88c0: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a  =SQLITE_UTF8 ){.
88d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
88e0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4f  VdbeMemSetStr(pO
88f0: 75 74 2c 20 70 4f 70 2d 3e 70 34 2e 7a 2c 20 2d  ut, pOp->p4.z, -
8900: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8910: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8920: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
8930: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
8940: 3d 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 29  =SQLITE_TOOBIG )
8950: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
8960: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK!=sqlite3Vdbe
8970: 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
8980: 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 20 29  Out, encoding) )
8990: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
89a0: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 2d 3e    assert( pOut->
89b0: 73 7a 4d 61 6c 6c 6f 63 3e 30 20 26 26 20 70 4f  szMalloc>0 && pO
89c0: 75 74 2d 3e 7a 4d 61 6c 6c 6f 63 3d 3d 70 4f 75  ut->zMalloc==pOu
89d0: 74 2d 3e 7a 20 29 3b 0a 20 20 20 20 61 73 73 65  t->z );.    asse
89e0: 72 74 28 20 56 64 62 65 4d 65 6d 44 79 6e 61 6d  rt( VdbeMemDynam
89f0: 69 63 28 70 4f 75 74 29 3d 3d 30 20 29 3b 0a 20  ic(pOut)==0 );. 
8a00: 20 20 20 70 4f 75 74 2d 3e 73 7a 4d 61 6c 6c 6f     pOut->szMallo
8a10: 63 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d  c = 0;.    pOut-
8a20: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 53 74  >flags |= MEM_St
8a30: 61 74 69 63 3b 0a 20 20 20 20 69 66 28 20 70 4f  atic;.    if( pO
8a40: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 44 59  p->p4type==P4_DY
8a50: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
8a60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8a70: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
8a80: 20 7d 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79   }.    pOp->p4ty
8a90: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
8aa0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
8ab0: 20 70 4f 75 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f   pOut->z;.    pO
8ac0: 70 2d 3e 70 31 20 3d 20 70 4f 75 74 2d 3e 6e 3b  p->p1 = pOut->n;
8ad0: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
8ae0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 54 4f 4f 42   rc==SQLITE_TOOB
8af0: 49 47 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  IG );.#endif.  i
8b00: 66 28 20 70 4f 70 2d 3e 70 31 3e 64 62 2d 3e 61  f( pOp->p1>db->a
8b10: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8b20: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
8b30: 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a    goto too_big;.
8b40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
8b50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
8b60: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
8b70: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
8b80: 65 2c 20 4f 50 5f 53 74 72 69 6e 67 20 2a 2f 0a  e, OP_String */.
8b90: 7d 0a 20 20 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  }.  ./* Opcode: 
8ba0: 53 74 72 69 6e 67 20 50 31 20 50 32 20 50 33 20  String P1 P2 P3 
8bb0: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
8bc0: 73 3a 20 72 5b 50 32 5d 3d 27 50 34 27 20 28 6c  s: r[P2]='P4' (l
8bd0: 65 6e 3d 50 31 29 0a 2a 2a 0a 2a 2a 20 54 68 65  en=P1).**.** The
8be0: 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 50 34   string value P4
8bf0: 20 6f 66 20 6c 65 6e 67 74 68 20 50 31 20 28 62   of length P1 (b
8c00: 79 74 65 73 29 20 69 73 20 73 74 6f 72 65 64 20  ytes) is stored 
8c10: 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
8c20: 2a 2a 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 6e  **.** If P3 is n
8c30: 6f 74 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  ot zero and the 
8c40: 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65 67 69 73  content of regis
8c50: 74 65 72 20 50 33 20 69 73 20 65 71 75 61 6c 20  ter P3 is equal 
8c60: 74 6f 20 50 35 2c 20 74 68 65 6e 0a 2a 2a 20 74  to P5, then.** t
8c70: 68 65 20 64 61 74 61 74 79 70 65 20 6f 66 20 74  he datatype of t
8c80: 68 65 20 72 65 67 69 73 74 65 72 20 50 32 20 69  he register P2 i
8c90: 73 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 42  s converted to B
8ca0: 4c 4f 42 2e 20 20 54 68 65 20 63 6f 6e 74 65 6e  LOB.  The conten
8cb0: 74 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d 65  t is.** the same
8cc0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 62 79 74   sequence of byt
8cd0: 65 73 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79  es, it is merely
8ce0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
8cf0: 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 0a 2a  a BLOB instead.*
8d00: 2a 20 6f 66 20 61 20 73 74 72 69 6e 67 2c 20 61  * of a string, a
8d10: 73 20 69 66 20 69 74 20 68 61 64 20 62 65 65 6e  s if it had been
8d20: 20 43 41 53 54 2e 20 20 49 6e 20 6f 74 68 65 72   CAST.  In other
8d30: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 69 66   words:.**.** if
8d40: 28 20 50 33 21 3d 30 20 61 6e 64 20 72 65 67 5b  ( P3!=0 and reg[
8d50: 50 33 5d 3d 3d 50 35 20 29 20 72 65 67 5b 50 32  P3]==P5 ) reg[P2
8d60: 5d 20 3a 3d 20 43 41 53 54 28 72 65 67 5b 50 32  ] := CAST(reg[P2
8d70: 5d 20 61 73 20 42 4c 4f 42 29 0a 2a 2f 0a 63 61  ] as BLOB).*/.ca
8d80: 73 65 20 4f 50 5f 53 74 72 69 6e 67 3a 20 7b 20  se OP_String: { 
8d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32           /* out2
8da0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f   */.  assert( pO
8db0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 3b 0a 20 20  p->p4.z!=0 );.  
8dc0: 70 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65  pOut = out2Prere
8dd0: 6c 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20  lease(p, pOp);. 
8de0: 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
8df0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53 74 61 74 69  EM_Str|MEM_Stati
8e00: 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 70 4f  c|MEM_Term;.  pO
8e10: 75 74 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e  ut->z = pOp->p4.
8e20: 7a 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 70  z;.  pOut->n = p
8e30: 4f 70 2d 3e 70 31 3b 0a 20 20 70 4f 75 74 2d 3e  Op->p1;.  pOut->
8e40: 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a  enc = encoding;.
8e50: 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
8e60: 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 23 69 66  BSIZE(pOut);.#if
8e70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45  ndef SQLITE_LIKE
8e80: 5f 44 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c  _DOESNT_MATCH_BL
8e90: 4f 42 53 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  OBS.  if( pOp->p
8ea0: 33 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  3>0 ){.    asser
8eb0: 74 28 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e  t( pOp->p3<=(p->
8ec0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
8ed0: 73 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 33  sor) );.    pIn3
8ee0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
8ef0: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
8f00: 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
8f10: 5f 49 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  _Int );.    if( 
8f20: 70 49 6e 33 2d 3e 75 2e 69 3d 3d 70 4f 70 2d 3e  pIn3->u.i==pOp->
8f30: 70 35 20 29 20 70 4f 75 74 2d 3e 66 6c 61 67 73  p5 ) pOut->flags
8f40: 20 3d 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   = MEM_Blob|MEM_
8f50: 53 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b  Static|MEM_Term;
8f60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 72  .  }.#endif.  br
8f70: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
8f80: 65 3a 20 4e 75 6c 6c 20 50 31 20 50 32 20 50 33  e: Null P1 P2 P3
8f90: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
8fa0: 3a 20 72 5b 50 32 2e 2e 50 33 5d 3d 4e 55 4c 4c  : r[P2..P3]=NULL
8fb0: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 4e  .**.** Write a N
8fc0: 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69 73 74 65  ULL into registe
8fd0: 72 73 20 50 32 2e 20 20 49 66 20 50 33 20 67 72  rs P2.  If P3 gr
8fe0: 65 61 74 65 72 20 74 68 61 6e 20 50 32 2c 20 74  eater than P2, t
8ff0: 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 0a 2a  hen also write.*
9000: 2a 20 4e 55 4c 4c 20 69 6e 74 6f 20 72 65 67 69  * NULL into regi
9010: 73 74 65 72 20 50 33 20 61 6e 64 20 65 76 65 72  ster P3 and ever
9020: 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 62 65  y register in be
9030: 74 77 65 65 6e 20 50 32 20 61 6e 64 20 50 33 2e  tween P2 and P3.
9040: 20 20 49 66 20 50 33 0a 2a 2a 20 69 73 20 6c 65    If P3.** is le
9050: 73 73 20 74 68 61 6e 20 50 32 20 28 74 79 70 69  ss than P2 (typi
9060: 63 61 6c 6c 79 20 50 33 20 69 73 20 7a 65 72 6f  cally P3 is zero
9070: 29 20 74 68 65 6e 20 6f 6e 6c 79 20 72 65 67 69  ) then only regi
9080: 73 74 65 72 20 50 32 20 69 73 0a 2a 2a 20 73 65  ster P2 is.** se
9090: 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
90a0: 20 49 66 20 74 68 65 20 50 31 20 76 61 6c 75 65   If the P1 value
90b0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
90c0: 65 6e 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  en also set the 
90d0: 4d 45 4d 5f 43 6c 65 61 72 65 64 20 66 6c 61 67  MEM_Cleared flag
90e0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 4e 55 4c 4c   so that.** NULL
90f0: 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 6e 6f 74   values will not
9100: 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 65   compare equal e
9110: 76 65 6e 20 69 66 20 53 51 4c 49 54 45 5f 4e 55  ven if SQLITE_NU
9120: 4c 4c 45 51 20 69 73 20 73 65 74 20 6f 6e 0a 2a  LLEQ is set on.*
9130: 2a 20 4f 50 5f 4e 65 20 6f 72 20 4f 50 5f 45 71  * OP_Ne or OP_Eq
9140: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c  ..*/.case OP_Nul
9150: 6c 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  l: {           /
9160: 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74 20  * out2 */.  int 
9170: 63 6e 74 3b 0a 20 20 75 31 36 20 6e 75 6c 6c 46  cnt;.  u16 nullF
9180: 6c 61 67 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75  lag;.  pOut = ou
9190: 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20  t2Prerelease(p, 
91a0: 70 4f 70 29 3b 0a 20 20 63 6e 74 20 3d 20 70 4f  pOp);.  cnt = pO
91b0: 70 2d 3e 70 33 2d 70 4f 70 2d 3e 70 32 3b 0a 20  p->p3-pOp->p2;. 
91c0: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
91d0: 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70  <=(p->nMem+1 - p
91e0: 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->nCursor) );.  
91f0: 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 6e 75  pOut->flags = nu
9200: 6c 6c 46 6c 61 67 20 3d 20 70 4f 70 2d 3e 70 31  llFlag = pOp->p1
9210: 20 3f 20 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d   ? (MEM_Null|MEM
9220: 5f 43 6c 65 61 72 65 64 29 20 3a 20 4d 45 4d 5f  _Cleared) : MEM_
9230: 4e 75 6c 6c 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20  Null;.  pOut->n 
9240: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 63 6e  = 0;.  while( cn
9250: 74 3e 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2b  t>0 ){.    pOut+
9260: 2b 3b 0a 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  +;.    memAboutT
9270: 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29  oChange(p, pOut)
9280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9290: 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74  eMemSetNull(pOut
92a0: 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61  );.    pOut->fla
92b0: 67 73 20 3d 20 6e 75 6c 6c 46 6c 61 67 3b 0a 20  gs = nullFlag;. 
92c0: 20 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 30 3b 0a     pOut->n = 0;.
92d0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 7d 0a 20      cnt--;.  }. 
92e0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
92f0: 63 6f 64 65 3a 20 53 6f 66 74 4e 75 6c 6c 20 50  code: SoftNull P
9300: 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e  1 * * * *.** Syn
9310: 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 4e 55 4c  opsis: r[P1]=NUL
9320: 4c 0a 2a 2a 0a 2a 2a 20 53 65 74 20 72 65 67 69  L.**.** Set regi
9330: 73 74 65 72 20 50 31 20 74 6f 20 68 61 76 65 20  ster P1 to have 
9340: 74 68 65 20 76 61 6c 75 65 20 4e 55 4c 4c 20 61  the value NULL a
9350: 73 20 73 65 65 6e 20 62 79 20 74 68 65 20 4f 50  s seen by the OP
9360: 5f 4d 61 6b 65 52 65 63 6f 72 64 0a 2a 2a 20 69  _MakeRecord.** i
9370: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 62 75 74 20  nstruction, but 
9380: 64 6f 20 6e 6f 74 20 66 72 65 65 20 61 6e 79 20  do not free any 
9390: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 6d  string or blob m
93a0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
93b0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 72 65 67   with.** the reg
93c0: 69 73 74 65 72 2c 20 73 6f 20 74 68 61 74 20 69  ister, so that i
93d0: 66 20 74 68 65 20 76 61 6c 75 65 20 77 61 73 20  f the value was 
93e0: 61 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  a string or blob
93f0: 20 74 68 61 74 20 77 61 73 0a 2a 2a 20 70 72 65   that was.** pre
9400: 76 69 6f 75 73 6c 79 20 63 6f 70 69 65 64 20 75  viously copied u
9410: 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2c 20 74  sing OP_SCopy, t
9420: 68 65 20 63 6f 70 69 65 73 20 77 69 6c 6c 20 63  he copies will c
9430: 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 20 76 61  ontinue to be va
9440: 6c 69 64 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  lid..*/.case OP_
9450: 53 6f 66 74 4e 75 6c 6c 3a 20 7b 0a 20 20 61 73  SoftNull: {.  as
9460: 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 30 20  sert( pOp->p1>0 
9470: 26 26 20 70 4f 70 2d 3e 70 31 3c 3d 28 70 2d 3e  && pOp->p1<=(p->
9480: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
9490: 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 20 3d  sor) );.  pOut =
94a0: 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
94b0: 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
94c0: 20 28 70 4f 75 74 2d 3e 66 6c 61 67 73 7c 4d 45   (pOut->flags|ME
94d0: 4d 5f 4e 75 6c 6c 29 26 7e 4d 45 4d 5f 55 6e 64  M_Null)&~MEM_Und
94e0: 65 66 69 6e 65 64 3b 0a 20 20 62 72 65 61 6b 3b  efined;.  break;
94f0: 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42  .}../* Opcode: B
9500: 6c 6f 62 20 50 31 20 50 32 20 2a 20 50 34 20 2a  lob P1 P2 * P4 *
9510: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
9520: 50 32 5d 3d 50 34 20 28 6c 65 6e 3d 50 31 29 0a  P2]=P4 (len=P1).
9530: 2a 2a 0a 2a 2a 20 50 34 20 70 6f 69 6e 74 73 20  **.** P4 points 
9540: 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  to a blob of dat
9550: 61 20 50 31 20 62 79 74 65 73 20 6c 6f 6e 67 2e  a P1 bytes long.
9560: 20 20 53 74 6f 72 65 20 74 68 69 73 0a 2a 2a 20    Store this.** 
9570: 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
9580: 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f   P2..*/.case OP_
9590: 42 6c 6f 62 3a 20 7b 20 20 20 20 20 20 20 20 20  Blob: {         
95a0: 20 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a         /* out2 *
95b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  /.  assert( pOp-
95c0: 3e 70 31 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  >p1 <= SQLITE_MA
95d0: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 70 4f  X_LENGTH );.  pO
95e0: 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65  ut = out2Prerele
95f0: 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73  ase(p, pOp);.  s
9600: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
9610: 53 74 72 28 70 4f 75 74 2c 20 70 4f 70 2d 3e 70  Str(pOut, pOp->p
9620: 34 2e 7a 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 2c  4.z, pOp->p1, 0,
9630: 20 30 29 3b 0a 20 20 70 4f 75 74 2d 3e 65 6e 63   0);.  pOut->enc
9640: 20 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 55   = encoding;.  U
9650: 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53 49  PDATE_MAX_BLOBSI
9660: 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72 65 61  ZE(pOut);.  brea
9670: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
9680: 20 56 61 72 69 61 62 6c 65 20 50 31 20 50 32 20   Variable P1 P2 
9690: 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
96a0: 69 73 3a 20 72 5b 50 32 5d 3d 70 61 72 61 6d 65  is: r[P2]=parame
96b0: 74 65 72 28 50 31 2c 50 34 29 0a 2a 2a 0a 2a 2a  ter(P1,P4).**.**
96c0: 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 76 61   Transfer the va
96d0: 6c 75 65 73 20 6f 66 20 62 6f 75 6e 64 20 70 61  lues of bound pa
96e0: 72 61 6d 65 74 65 72 20 50 31 20 69 6e 74 6f 20  rameter P1 into 
96f0: 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a 0a 2a  register P2.**.*
9700: 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
9710: 65 72 20 69 73 20 6e 61 6d 65 64 2c 20 74 68 65  er is named, the
9720: 6e 20 69 74 73 20 6e 61 6d 65 20 61 70 70 65 61  n its name appea
9730: 72 73 20 69 6e 20 50 34 2e 0a 2a 2a 20 54 68 65  rs in P4..** The
9740: 20 50 34 20 76 61 6c 75 65 20 69 73 20 75 73 65   P4 value is use
9750: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 62 69 6e  d by sqlite3_bin
9760: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
9770: 28 29 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56  ()..*/.case OP_V
9780: 61 72 69 61 62 6c 65 3a 20 7b 20 20 20 20 20 20  ariable: {      
9790: 20 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f        /* out2 */
97a0: 0a 20 20 4d 65 6d 20 2a 70 56 61 72 3b 20 20 20  .  Mem *pVar;   
97b0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 62 65 69      /* Value bei
97c0: 6e 67 20 74 72 61 6e 73 66 65 72 72 65 64 20 2a  ng transferred *
97d0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
97e0: 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d 3e 70  ->p1>0 && pOp->p
97f0: 31 3c 3d 70 2d 3e 6e 56 61 72 20 29 3b 0a 20 20  1<=p->nVar );.  
9800: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e  assert( pOp->p4.
9810: 7a 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  z==0 || pOp->p4.
9820: 7a 3d 3d 73 71 6c 69 74 65 33 56 4c 69 73 74 4e  z==sqlite3VListN
9830: 75 6d 54 6f 4e 61 6d 65 28 70 2d 3e 70 56 4c 69  umToName(p->pVLi
9840: 73 74 2c 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20  st,pOp->p1) );. 
9850: 20 70 56 61 72 20 3d 20 26 70 2d 3e 61 56 61 72   pVar = &p->aVar
9860: 5b 70 4f 70 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20  [pOp->p1 - 1];. 
9870: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9880: 4d 65 6d 54 6f 6f 42 69 67 28 70 56 61 72 29 20  MemTooBig(pVar) 
9890: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f 6f 5f  ){.    goto too_
98a0: 62 69 67 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20  big;.  }.  pOut 
98b0: 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65  = out2Prerelease
98c0: 28 70 2c 20 70 4f 70 29 3b 0a 20 20 73 71 6c 69  (p, pOp);.  sqli
98d0: 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
98e0: 77 43 6f 70 79 28 70 4f 75 74 2c 20 70 56 61 72  wCopy(pOut, pVar
98f0: 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  , MEM_Static);. 
9900: 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42   UPDATE_MAX_BLOB
9910: 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20 20 62 72  SIZE(pOut);.  br
9920: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9930: 65 3a 20 4d 6f 76 65 20 50 31 20 50 32 20 50 33  e: Move P1 P2 P3
9940: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9950: 3a 20 72 5b 50 32 40 50 33 5d 3d 72 5b 50 31 40  : r[P2@P3]=r[P1@
9960: 50 33 5d 0a 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74  P3].**.** Move t
9970: 68 65 20 50 33 20 76 61 6c 75 65 73 20 69 6e 20  he P3 values in 
9980: 72 65 67 69 73 74 65 72 20 50 31 2e 2e 50 31 2b  register P1..P1+
9990: 50 33 2d 31 20 6f 76 65 72 20 69 6e 74 6f 0a 2a  P3-1 over into.*
99a0: 2a 20 72 65 67 69 73 74 65 72 73 20 50 32 2e 2e  * registers P2..
99b0: 50 32 2b 50 33 2d 31 2e 20 20 52 65 67 69 73 74  P2+P3-1.  Regist
99c0: 65 72 73 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20  ers P1..P1+P3-1 
99d0: 61 72 65 0a 2a 2a 20 6c 65 66 74 20 68 6f 6c 64  are.** left hold
99e0: 69 6e 67 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  ing a NULL.  It 
99f0: 69 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  is an error for 
9a00: 72 65 67 69 73 74 65 72 20 72 61 6e 67 65 73 0a  register ranges.
9a10: 2a 2a 20 50 31 2e 2e 50 31 2b 50 33 2d 31 20 61  ** P1..P1+P3-1 a
9a20: 6e 64 20 50 32 2e 2e 50 32 2b 50 33 2d 31 20 74  nd P2..P2+P3-1 t
9a30: 6f 20 6f 76 65 72 6c 61 70 2e 20 20 49 74 20 69  o overlap.  It i
9a40: 73 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 66 6f  s an error.** fo
9a50: 72 20 50 33 20 74 6f 20 62 65 20 6c 65 73 73 20  r P3 to be less 
9a60: 74 68 61 6e 20 31 2e 0a 2a 2f 0a 63 61 73 65 20  than 1..*/.case 
9a70: 4f 50 5f 4d 6f 76 65 3a 20 7b 0a 20 20 69 6e 74  OP_Move: {.  int
9a80: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n;           /*
9a90: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73   Number of regis
9aa0: 74 65 72 73 20 6c 65 66 74 20 74 6f 20 63 6f 70  ters left to cop
9ab0: 79 20 2a 2f 0a 20 20 69 6e 74 20 70 31 3b 20 20  y */.  int p1;  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
9ad0: 74 65 72 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d  ter to copy from
9ae0: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 3b 20 20 20   */.  int p2;   
9af0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
9b00: 65 72 20 74 6f 20 63 6f 70 79 20 74 6f 20 2a 2f  er to copy to */
9b10: 0a 0a 20 20 6e 20 3d 20 70 4f 70 2d 3e 70 33 3b  ..  n = pOp->p3;
9b20: 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31 3b  .  p1 = pOp->p1;
9b30: 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32 3b  .  p2 = pOp->p2;
9b40: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 26  .  assert( n>0 &
9b50: 26 20 70 31 3e 30 20 26 26 20 70 32 3e 30 20 29  & p1>0 && p2>0 )
9b60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 31 2b 6e  ;.  assert( p1+n
9b70: 3c 3d 70 32 20 7c 7c 20 70 32 2b 6e 3c 3d 70 31  <=p2 || p2+n<=p1
9b80: 20 29 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61   );..  pIn1 = &a
9b90: 4d 65 6d 5b 70 31 5d 3b 0a 20 20 70 4f 75 74 20  Mem[p1];.  pOut 
9ba0: 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 64  = &aMem[p2];.  d
9bb0: 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o{.    assert( p
9bc0: 4f 75 74 3c 3d 26 61 4d 65 6d 5b 28 70 2d 3e 6e  Out<=&aMem[(p->n
9bd0: 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
9be0: 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  or)] );.    asse
9bf0: 72 74 28 20 70 49 6e 31 3c 3d 26 61 4d 65 6d 5b  rt( pIn1<=&aMem[
9c00: 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
9c10: 6e 43 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20  nCursor)] );.   
9c20: 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
9c30: 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20  lid(pIn1) );.   
9c40: 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67   memAboutToChang
9c50: 65 28 70 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20  e(p, pOut);.    
9c60: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 4d 6f  sqlite3VdbeMemMo
9c70: 76 65 28 70 4f 75 74 2c 20 70 49 6e 31 29 3b 0a  ve(pOut, pIn1);.
9c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c90: 42 55 47 0a 20 20 20 20 69 66 28 20 70 4f 75 74  BUG.    if( pOut
9ca0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 3e 3d 26 61  ->pScopyFrom>=&a
9cb0: 4d 65 6d 5b 70 31 5d 20 26 26 20 70 4f 75 74 2d  Mem[p1] && pOut-
9cc0: 3e 70 53 63 6f 70 79 46 72 6f 6d 3c 70 4f 75 74  >pScopyFrom<pOut
9cd0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
9ce0: 70 53 63 6f 70 79 46 72 6f 6d 20 2b 3d 20 70 4f  pScopyFrom += pO
9cf0: 70 2d 3e 70 32 20 2d 20 70 31 3b 0a 20 20 20 20  p->p2 - p1;.    
9d00: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 65 65  }.#endif.    Dee
9d10: 70 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74  phemeralize(pOut
9d20: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
9d30: 54 52 41 43 45 28 70 32 2b 2b 2c 20 70 4f 75 74  TRACE(p2++, pOut
9d40: 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a 20  );.    pIn1++;. 
9d50: 20 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 7d 77 68     pOut++;.  }wh
9d60: 69 6c 65 28 20 2d 2d 6e 20 29 3b 0a 20 20 62 72  ile( --n );.  br
9d70: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
9d80: 65 3a 20 43 6f 70 79 20 50 31 20 50 32 20 50 33  e: Copy P1 P2 P3
9d90: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
9da0: 3a 20 72 5b 50 32 40 50 33 2b 31 5d 3d 72 5b 50  : r[P2@P3+1]=r[P
9db0: 31 40 50 33 2b 31 5d 0a 2a 2a 0a 2a 2a 20 4d 61  1@P3+1].**.** Ma
9dc0: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 72 65 67  ke a copy of reg
9dd0: 69 73 74 65 72 73 20 50 31 2e 2e 50 31 2b 50 33  isters P1..P1+P3
9de0: 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 73 20   into registers 
9df0: 50 32 2e 2e 50 32 2b 50 33 2e 0a 2a 2a 0a 2a 2a  P2..P2+P3..**.**
9e00: 20 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   This instructio
9e10: 6e 20 6d 61 6b 65 73 20 61 20 64 65 65 70 20 63  n makes a deep c
9e20: 6f 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65  opy of the value
9e30: 2e 20 20 41 20 64 75 70 6c 69 63 61 74 65 0a 2a  .  A duplicate.*
9e40: 2a 20 69 73 20 6d 61 64 65 20 6f 66 20 61 6e 79  * is made of any
9e50: 20 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   string or blob 
9e60: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 61  constant.  See a
9e70: 6c 73 6f 20 4f 50 5f 53 43 6f 70 79 2e 0a 2a 2f  lso OP_SCopy..*/
9e80: 0a 63 61 73 65 20 4f 50 5f 43 6f 70 79 3a 20 7b  .case OP_Copy: {
9e90: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
9ea0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 49 6e 31   pOp->p3;.  pIn1
9eb0: 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31   = &aMem[pOp->p1
9ec0: 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  ];.  pOut = &aMe
9ed0: 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 61 73  m[pOp->p2];.  as
9ee0: 73 65 72 74 28 20 70 4f 75 74 21 3d 70 49 6e 31  sert( pOut!=pIn1
9ef0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29   );.  while( 1 )
9f00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9f10: 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
9f20: 70 4f 75 74 2c 20 70 49 6e 31 2c 20 4d 45 4d 5f  pOut, pIn1, MEM_
9f30: 45 70 68 65 6d 29 3b 0a 20 20 20 20 44 65 65 70  Ephem);.    Deep
9f40: 68 65 6d 65 72 61 6c 69 7a 65 28 70 4f 75 74 29  hemeralize(pOut)
9f50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9f60: 44 45 42 55 47 0a 20 20 20 20 70 4f 75 74 2d 3e  DEBUG.    pOut->
9f70: 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a  pScopyFrom = 0;.
9f80: 23 65 6e 64 69 66 0a 20 20 20 20 52 45 47 49 53  #endif.    REGIS
9f90: 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70  TER_TRACE(pOp->p
9fa0: 32 2b 70 4f 70 2d 3e 70 33 2d 6e 2c 20 70 4f 75  2+pOp->p3-n, pOu
9fb0: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e 2d 2d  t);.    if( (n--
9fc0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
9fd0: 20 20 70 4f 75 74 2b 2b 3b 0a 20 20 20 20 70 49    pOut++;.    pI
9fe0: 6e 31 2b 2b 3b 0a 20 20 7d 0a 20 20 62 72 65 61  n1++;.  }.  brea
9ff0: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
a000: 20 53 43 6f 70 79 20 50 31 20 50 32 20 2a 20 2a   SCopy P1 P2 * *
a010: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
a020: 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a  r[P2]=r[P1].**.*
a030: 2a 20 4d 61 6b 65 20 61 20 73 68 61 6c 6c 6f 77  * Make a shallow
a040: 20 63 6f 70 79 20 6f 66 20 72 65 67 69 73 74 65   copy of registe
a050: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a060: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a070: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 6d 61  s instruction ma
a080: 6b 65 73 20 61 20 73 68 61 6c 6c 6f 77 20 63 6f  kes a shallow co
a090: 70 79 20 6f 66 20 74 68 65 20 76 61 6c 75 65 2e  py of the value.
a0a0: 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
a0b0: 2a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6f 72  * is a string or
a0c0: 20 62 6c 6f 62 2c 20 74 68 65 6e 20 74 68 65 20   blob, then the 
a0d0: 63 6f 70 79 20 69 73 20 6f 6e 6c 79 20 61 20 70  copy is only a p
a0e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
a0f0: 20 6f 72 69 67 69 6e 61 6c 20 61 6e 64 20 68 65   original and he
a100: 6e 63 65 20 69 66 20 74 68 65 20 6f 72 69 67 69  nce if the origi
a110: 6e 61 6c 20 63 68 61 6e 67 65 73 20 73 6f 20 77  nal changes so w
a120: 69 6c 6c 20 74 68 65 20 63 6f 70 79 2e 0a 2a 2a  ill the copy..**
a130: 20 57 6f 72 73 65 2c 20 69 66 20 74 68 65 20 6f   Worse, if the o
a140: 72 69 67 69 6e 61 6c 20 69 73 20 64 65 61 6c 6c  riginal is deall
a150: 6f 63 61 74 65 64 2c 20 74 68 65 20 63 6f 70 79  ocated, the copy
a160: 20 62 65 63 6f 6d 65 73 20 69 6e 76 61 6c 69 64   becomes invalid
a170: 2e 0a 2a 2a 20 54 68 75 73 20 74 68 65 20 70 72  ..** Thus the pr
a180: 6f 67 72 61 6d 20 6d 75 73 74 20 67 75 61 72 61  ogram must guara
a190: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 6f 72  ntee that the or
a1a0: 69 67 69 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  iginal will not 
a1b0: 63 68 61 6e 67 65 0a 2a 2a 20 64 75 72 69 6e 67  change.** during
a1c0: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
a1d0: 20 74 68 65 20 63 6f 70 79 2e 20 20 55 73 65 20   the copy.  Use 
a1e0: 4f 50 5f 43 6f 70 79 20 74 6f 20 6d 61 6b 65 20  OP_Copy to make 
a1f0: 61 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f  a complete.** co
a200: 70 79 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53  py..*/.case OP_S
a210: 43 6f 70 79 3a 20 7b 20 20 20 20 20 20 20 20 20  Copy: {         
a220: 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20     /* out2 */.  
a230: 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
a240: 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74 20 3d 20  ->p1];.  pOut = 
a250: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a260: 20 20 61 73 73 65 72 74 28 20 70 4f 75 74 21 3d    assert( pOut!=
a270: 70 49 6e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  pIn1 );.  sqlite
a280: 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
a290: 6f 70 79 28 70 4f 75 74 2c 20 70 49 6e 31 2c 20  opy(pOut, pIn1, 
a2a0: 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 23 69 66 64  MEM_Ephem);.#ifd
a2b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a2c0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 70 53 63 6f    if( pOut->pSco
a2d0: 70 79 46 72 6f 6d 3d 3d 30 20 29 20 70 4f 75 74  pyFrom==0 ) pOut
a2e0: 2d 3e 70 53 63 6f 70 79 46 72 6f 6d 20 3d 20 70  ->pScopyFrom = p
a2f0: 49 6e 31 3b 0a 23 65 6e 64 69 66 0a 20 20 62 72  In1;.#endif.  br
a300: 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
a310: 65 3a 20 49 6e 74 43 6f 70 79 20 50 31 20 50 32  e: IntCopy P1 P2
a320: 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73   * * *.** Synops
a330: 69 73 3a 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 0a  is: r[P2]=r[P1].
a340: 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 74  **.** Transfer t
a350: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
a360: 20 68 65 6c 64 20 69 6e 20 72 65 67 69 73 74 65   held in registe
a370: 72 20 50 31 20 69 6e 74 6f 20 72 65 67 69 73 74  r P1 into regist
a380: 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  er P2..**.** Thi
a390: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  s is an optimize
a3a0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 43 6f  d version of SCo
a3b0: 70 79 20 74 68 61 74 20 77 6f 72 6b 73 20 6f 6e  py that works on
a3c0: 6c 79 20 66 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ly for integer.*
a3d0: 2a 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 63 61 73  * values..*/.cas
a3e0: 65 20 4f 50 5f 49 6e 74 43 6f 70 79 3a 20 7b 20  e OP_IntCopy: { 
a3f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
a400: 74 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  t2 */.  pIn1 = &
a410: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
a420: 20 61 73 73 65 72 74 28 20 28 70 49 6e 31 2d 3e   assert( (pIn1->
a430: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
a440: 21 3d 30 20 29 3b 0a 20 20 70 4f 75 74 20 3d 20  !=0 );.  pOut = 
a450: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
a460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
a470: 53 65 74 49 6e 74 36 34 28 70 4f 75 74 2c 20 70  SetInt64(pOut, p
a480: 49 6e 31 2d 3e 75 2e 69 29 3b 0a 20 20 62 72 65  In1->u.i);.  bre
a490: 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
a4a0: 3a 20 52 65 73 75 6c 74 52 6f 77 20 50 31 20 50  : ResultRow P1 P
a4b0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
a4c0: 73 69 73 3a 20 6f 75 74 70 75 74 3d 72 5b 50 31  sis: output=r[P1
a4d0: 40 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  @P2].**.** The r
a4e0: 65 67 69 73 74 65 72 73 20 50 31 20 74 68 72 6f  egisters P1 thro
a4f0: 75 67 68 20 50 31 2b 50 32 2d 31 20 63 6f 6e 74  ugh P1+P2-1 cont
a500: 61 69 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ain a single row
a510: 20 6f 66 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 20   of.** results. 
a520: 54 68 69 73 20 6f 70 63 6f 64 65 20 63 61 75 73  This opcode caus
a530: 65 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73  es the sqlite3_s
a540: 74 65 70 28 29 20 63 61 6c 6c 20 74 6f 20 74 65  tep() call to te
a550: 72 6d 69 6e 61 74 65 0a 2a 2a 20 77 69 74 68 20  rminate.** with 
a560: 61 6e 20 53 51 4c 49 54 45 5f 52 4f 57 20 72 65  an SQLITE_ROW re
a570: 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 69 74  turn code and it
a580: 20 73 65 74 73 20 75 70 20 74 68 65 20 73 71 6c   sets up the sql
a590: 69 74 65 33 5f 73 74 6d 74 0a 2a 2a 20 73 74 72  ite3_stmt.** str
a5a0: 75 63 74 75 72 65 20 74 6f 20 70 72 6f 76 69 64  ucture to provid
a5b0: 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  e access to the 
a5c0: 72 28 50 31 29 2e 2e 72 28 50 31 2b 50 32 2d 31  r(P1)..r(P1+P2-1
a5d0: 29 20 76 61 6c 75 65 73 20 61 73 0a 2a 2a 20 74  ) values as.** t
a5e0: 68 65 20 72 65 73 75 6c 74 20 72 6f 77 2e 0a 2a  he result row..*
a5f0: 2f 0a 63 61 73 65 20 4f 50 5f 52 65 73 75 6c 74  /.case OP_Result
a600: 52 6f 77 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70 4d  Row: {.  Mem *pM
a610: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  em;.  int i;.  a
a620: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 73 43 6f  ssert( p->nResCo
a630: 6c 75 6d 6e 3d 3d 70 4f 70 2d 3e 70 32 20 29 3b  lumn==pOp->p2 );
a640: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
a650: 70 31 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p1>0 );.  assert
a660: 28 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  ( pOp->p1+pOp->p
a670: 32 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  2<=(p->nMem+1 - 
a680: 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
a690: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a6a0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
a6b0: 41 4c 4c 42 41 43 4b 0a 20 20 2f 2a 20 52 75 6e  ALLBACK.  /* Run
a6c0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 6f   the progress co
a6d0: 75 6e 74 65 72 20 6a 75 73 74 20 62 65 66 6f 72  unter just befor
a6e0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
a6f0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 6f  /.  if( db->xPro
a700: 67 72 65 73 73 21 3d 30 0a 20 20 20 26 26 20 6e  gress!=0.   && n
a710: 56 6d 53 74 65 70 3e 3d 6e 50 72 6f 67 72 65 73  VmStep>=nProgres
a720: 73 4c 69 6d 69 74 0a 20 20 20 26 26 20 64 62 2d  sLimit.   && db-
a730: 3e 78 50 72 6f 67 72 65 73 73 28 64 62 2d 3e 70  >xProgress(db->p
a740: 50 72 6f 67 72 65 73 73 41 72 67 29 21 3d 30 0a  ProgressArg)!=0.
a750: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
a760: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
a770: 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
a780: 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
a790: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
a7a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
a7b0: 68 61 73 20 76 69 6f 6c 61 74 65 64 20 69 6d 6d  has violated imm
a7c0: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
a7d0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ey constraints, 
a7e0: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 74 75  do.  ** not retu
a7f0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
a800: 20 72 6f 77 73 20 6d 6f 64 69 66 69 65 64 2e 20   rows modified. 
a810: 41 6e 64 20 64 6f 20 6e 6f 74 20 52 45 4c 45 41  And do not RELEA
a820: 53 45 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  SE the statement
a830: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
a840: 6e 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  n. It needs to b
a850: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
a860: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
a870: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
a880: 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
a890: 30 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  0)) ){.    asser
a8a0: 74 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  t( db->flags&SQL
a8b0: 49 54 45 5f 43 6f 75 6e 74 52 6f 77 73 20 29 3b  ITE_CountRows );
a8c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a8d0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
a8e0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  );.    goto abor
a8f0: 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
a900: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a910: 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f 77   SQLITE_CountRow
a920: 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  s flag is set in
a930: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 6d   sqlite3.flags m
a940: 61 73 6b 2c 20 74 68 65 6e 20 0a 20 20 2a 2a 20  ask, then .  ** 
a950: 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  DML statements i
a960: 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f 64  nvoke this opcod
a970: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  e to return the 
a980: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a  number of rows .
a990: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 6f    ** modified to
a9a0: 20 74 68 65 20 75 73 65 72 2e 20 54 68 69 73 20   the user. This 
a9b0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
a9c0: 74 68 61 74 20 61 20 56 4d 20 74 68 61 74 0a 20  that a VM that. 
a9d0: 20 2a 2a 20 6f 70 65 6e 73 20 61 20 73 74 61 74   ** opens a stat
a9e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
a9f0: 6e 20 6d 61 79 20 69 6e 76 6f 6b 65 20 74 68 69  n may invoke thi
aa00: 73 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20  s opcode..  **. 
aa10: 20 2a 2a 20 49 6e 20 63 61 73 65 20 74 68 69 73   ** In case this
aa20: 20 69 73 20 73 75 63 68 20 61 20 73 74 61 74 65   is such a state
aa30: 6d 65 6e 74 2c 20 63 6c 6f 73 65 20 61 6e 79 20  ment, close any 
aa40: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
aa50: 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 65  ction.  ** opene
aa60: 64 20 62 79 20 74 68 69 73 20 56 4d 20 62 65 66  d by this VM bef
aa70: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 63 6f  ore returning co
aa80: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 75 73 65  ntrol to the use
aa90: 72 2e 20 54 68 69 73 20 69 73 20 74 6f 0a 20 20  r. This is to.  
aaa0: 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 73  ** ensure that s
aab0: 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
aac0: 74 69 6f 6e 73 20 61 72 65 20 61 6c 77 61 79 73  tions are always
aad0: 20 6e 65 73 74 65 64 2c 20 6e 6f 74 20 6f 76 65   nested, not ove
aae0: 72 6c 61 70 70 69 6e 67 2e 0a 20 20 2a 2a 20 49  rlapping..  ** I
aaf0: 66 20 74 68 65 20 6f 70 65 6e 20 73 74 61 74 65  f the open state
ab00: 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
ab10: 20 69 73 20 6e 6f 74 20 63 6c 6f 73 65 64 20 68   is not closed h
ab20: 65 72 65 2c 20 74 68 65 6e 20 74 68 65 20 75 73  ere, then the us
ab30: 65 72 0a 20 20 2a 2a 20 6d 61 79 20 73 74 65 70  er.  ** may step
ab40: 20 61 6e 6f 74 68 65 72 20 56 4d 20 74 68 61 74   another VM that
ab50: 20 6f 70 65 6e 73 20 69 74 73 20 6f 77 6e 20 73   opens its own s
ab60: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
ab70: 74 69 6f 6e 2e 20 54 68 69 73 0a 20 20 2a 2a 20  tion. This.  ** 
ab80: 6d 61 79 20 6c 65 61 64 20 74 6f 20 6f 76 65 72  may lead to over
ab90: 6c 61 70 70 69 6e 67 20 73 74 61 74 65 6d 65 6e  lapping statemen
aba0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  t transactions..
abb0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
abc0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
abd0: 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 61 20 74  ion is never a t
abe0: 6f 70 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  op-level transac
abf0: 74 69 6f 6e 2e 20 20 48 65 6e 63 65 0a 20 20 2a  tion.  Hence.  *
ac00: 2a 20 74 68 65 20 52 45 4c 45 41 53 45 20 63 61  * the RELEASE ca
ac10: 6c 6c 20 62 65 6c 6f 77 20 63 61 6e 20 6e 65 76  ll below can nev
ac20: 65 72 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  er fail..  */.  
ac30: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
ac40: 65 6d 65 6e 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ement==0 || db->
ac50: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6f 75  flags&SQLITE_Cou
ac60: 6e 74 52 6f 77 73 20 29 3b 0a 20 20 72 63 20 3d  ntRows );.  rc =
ac70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
ac80: 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 53 41  eStatement(p, SA
ac90: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
aca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
acb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
acc0: 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  /* Invalidate al
acd0: 6c 20 65 70 68 65 6d 65 72 61 6c 20 63 75 72 73  l ephemeral curs
ace0: 6f 72 20 72 6f 77 20 63 61 63 68 65 73 20 2a 2f  or row caches */
acf0: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
ad00: 20 28 70 2d 3e 63 61 63 68 65 43 74 72 20 2b 20   (p->cacheCtr + 
ad10: 32 29 7c 31 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  2)|1;..  /* Make
ad20: 20 73 75 72 65 20 74 68 65 20 72 65 73 75 6c 74   sure the result
ad30: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
ad40: 20 72 6f 77 20 61 72 65 20 5c 30 30 30 20 74 65   row are \000 te
ad50: 72 6d 69 6e 61 74 65 64 0a 20 20 2a 2a 20 61 6e  rminated.  ** an
ad60: 64 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e  d have an assign
ad70: 65 64 20 74 79 70 65 2e 20 20 54 68 65 20 72 65  ed type.  The re
ad80: 73 75 6c 74 73 20 61 72 65 20 64 65 2d 65 70 68  sults are de-eph
ad90: 65 6d 65 72 61 6c 69 7a 65 64 20 61 73 0a 20 20  emeralized as.  
ada0: 2a 2a 20 61 20 73 69 64 65 20 65 66 66 65 63 74  ** a side effect
adb0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 65 6d 20 3d 20  ..  */.  pMem = 
adc0: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
add0: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
ade0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70    for(i=0; i<pOp
adf0: 2d 3e 70 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ->p2; i++){.    
ae00: 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c  assert( memIsVal
ae10: 69 64 28 26 70 4d 65 6d 5b 69 5d 29 20 29 3b 0a  id(&pMem[i]) );.
ae20: 20 20 20 20 44 65 65 70 68 65 6d 65 72 61 6c 69      Deephemerali
ae30: 7a 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20  ze(&pMem[i]);.  
ae40: 20 20 61 73 73 65 72 74 28 20 28 70 4d 65 6d 5b    assert( (pMem[
ae50: 69 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 45  i].flags & MEM_E
ae60: 70 68 65 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  phem)==0.       
ae70: 20 20 20 20 20 7c 7c 20 28 70 4d 65 6d 5b 69 5d       || (pMem[i]
ae80: 2e 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 53 74  .flags & (MEM_St
ae90: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  r|MEM_Blob))==0 
aea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
aeb0: 62 65 4d 65 6d 4e 75 6c 54 65 72 6d 69 6e 61 74  beMemNulTerminat
aec0: 65 28 26 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  e(&pMem[i]);.   
aed0: 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
aee0: 70 4f 70 2d 3e 70 31 2b 69 2c 20 26 70 4d 65 6d  pOp->p1+i, &pMem
aef0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
af00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
af10: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
af20: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63  .  if( db->mTrac
af30: 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45  e & SQLITE_TRACE
af40: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 64 62 2d 3e  _ROW ){.    db->
af50: 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52  xTrace(SQLITE_TR
af60: 41 43 45 5f 52 4f 57 2c 20 64 62 2d 3e 70 54 72  ACE_ROW, db->pTr
af70: 61 63 65 41 72 67 2c 20 70 2c 20 30 29 3b 0a 20  aceArg, p, 0);. 
af80: 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
af90: 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 2a 2f 0a  SQLITE_ROW.  */.
afa0: 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28    p->pc = (int)(
afb0: 70 4f 70 20 2d 20 61 4f 70 29 20 2b 20 31 3b 0a  pOp - aOp) + 1;.
afc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
afd0: 57 3b 0a 20 20 67 6f 74 6f 20 76 64 62 65 5f 72  W;.  goto vdbe_r
afe0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  eturn;.}../* Opc
aff0: 6f 64 65 3a 20 43 6f 6e 63 61 74 20 50 31 20 50  ode: Concat P1 P
b000: 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  2 P3 * *.** Syno
b010: 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 32  psis: r[P3]=r[P2
b020: 5d 2b 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 41 64  ]+r[P1].**.** Ad
b030: 64 20 74 68 65 20 74 65 78 74 20 69 6e 20 72 65  d the text in re
b040: 67 69 73 74 65 72 20 50 31 20 6f 6e 74 6f 20 74  gister P1 onto t
b050: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 65  he end of the te
b060: 78 74 20 69 6e 0a 2a 2a 20 72 65 67 69 73 74 65  xt in.** registe
b070: 72 20 50 32 20 61 6e 64 20 73 74 6f 72 65 20 74  r P2 and store t
b080: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
b090: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
b0a0: 65 69 74 68 65 72 20 74 68 65 20 50 31 20 6f 72  either the P1 or
b0b0: 20 50 32 20 74 65 78 74 20 61 72 65 20 4e 55 4c   P2 text are NUL
b0c0: 4c 20 74 68 65 6e 20 73 74 6f 72 65 20 4e 55 4c  L then store NUL
b0d0: 4c 20 69 6e 20 50 33 2e 0a 2a 2a 0a 2a 2a 20 20  L in P3..**.**  
b0e0: 20 50 33 20 3d 20 50 32 20 7c 7c 20 50 31 0a 2a   P3 = P2 || P1.*
b0f0: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
b100: 61 6c 20 66 6f 72 20 50 31 20 61 6e 64 20 50 33  al for P1 and P3
b110: 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65 20   to be the same 
b120: 72 65 67 69 73 74 65 72 2e 20 53 6f 6d 65 74 69  register. Someti
b130: 6d 65 73 2c 0a 2a 2a 20 69 66 20 50 33 20 69 73  mes,.** if P3 is
b140: 20 74 68 65 20 73 61 6d 65 20 72 65 67 69 73 74   the same regist
b150: 65 72 20 61 73 20 50 32 2c 20 74 68 65 20 69 6d  er as P2, the im
b160: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
b170: 61 62 6c 65 0a 2a 2a 20 74 6f 20 61 76 6f 69 64  able.** to avoid
b180: 20 61 20 6d 65 6d 63 70 79 28 29 2e 0a 2a 2f 0a   a memcpy()..*/.
b190: 63 61 73 65 20 4f 50 5f 43 6f 6e 63 61 74 3a 20  case OP_Concat: 
b1a0: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
b1b0: 61 6d 65 20 61 73 20 54 4b 5f 43 4f 4e 43 41 54  ame as TK_CONCAT
b1c0: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
b1d0: 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74 65 3b   */.  i64 nByte;
b1e0: 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d  ..  pIn1 = &aMem
b1f0: 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e  [pOp->p1];.  pIn
b200: 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  2 = &aMem[pOp->p
b210: 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26 61 4d  2];.  pOut = &aM
b220: 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
b230: 73 73 65 72 74 28 20 70 49 6e 31 21 3d 70 4f 75  ssert( pIn1!=pOu
b240: 74 20 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31  t );.  if( (pIn1
b250: 2d 3e 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e  ->flags | pIn2->
b260: 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 4e 75 6c  flags) & MEM_Nul
b270: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
b280: 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
b290: 4f 75 74 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  Out);.    break;
b2a0: 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 61 6e  .  }.  if( Expan
b2b0: 64 42 6c 6f 62 28 70 49 6e 31 29 20 7c 7c 20 45  dBlob(pIn1) || E
b2c0: 78 70 61 6e 64 42 6c 6f 62 28 70 49 6e 32 29 20  xpandBlob(pIn2) 
b2d0: 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
b2e0: 20 53 74 72 69 6e 67 69 66 79 28 70 49 6e 31 2c   Stringify(pIn1,
b2f0: 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 53 74   encoding);.  St
b300: 72 69 6e 67 69 66 79 28 70 49 6e 32 2c 20 65 6e  ringify(pIn2, en
b310: 63 6f 64 69 6e 67 29 3b 0a 20 20 6e 42 79 74 65  coding);.  nByte
b320: 20 3d 20 70 49 6e 31 2d 3e 6e 20 2b 20 70 49 6e   = pIn1->n + pIn
b330: 32 2d 3e 6e 3b 0a 20 20 69 66 28 20 6e 42 79 74  2->n;.  if( nByt
b340: 65 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  e>db->aLimit[SQL
b350: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
b360: 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
b370: 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 69 66 28  o_big;.  }.  if(
b380: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
b390: 72 6f 77 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e  row(pOut, (int)n
b3a0: 42 79 74 65 2b 32 2c 20 70 4f 75 74 3d 3d 70 49  Byte+2, pOut==pI
b3b0: 6e 32 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  n2) ){.    goto 
b3c0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 4d 65  no_mem;.  }.  Me
b3d0: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75  mSetTypeFlag(pOu
b3e0: 74 2c 20 4d 45 4d 5f 53 74 72 29 3b 0a 20 20 69  t, MEM_Str);.  i
b3f0: 66 28 20 70 4f 75 74 21 3d 70 49 6e 32 20 29 7b  f( pOut!=pIn2 ){
b400: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74  .    memcpy(pOut
b410: 2d 3e 7a 2c 20 70 49 6e 32 2d 3e 7a 2c 20 70 49  ->z, pIn2->z, pI
b420: 6e 32 2d 3e 6e 29 3b 0a 20 20 7d 0a 20 20 6d 65  n2->n);.  }.  me
b430: 6d 63 70 79 28 26 70 4f 75 74 2d 3e 7a 5b 70 49  mcpy(&pOut->z[pI
b440: 6e 32 2d 3e 6e 5d 2c 20 70 49 6e 31 2d 3e 7a 2c  n2->n], pIn1->z,
b450: 20 70 49 6e 31 2d 3e 6e 29 3b 0a 20 20 70 4f 75   pIn1->n);.  pOu
b460: 74 2d 3e 7a 5b 6e 42 79 74 65 5d 3d 30 3b 0a 20  t->z[nByte]=0;. 
b470: 20 70 4f 75 74 2d 3e 7a 5b 6e 42 79 74 65 2b 31   pOut->z[nByte+1
b480: 5d 20 3d 20 30 3b 0a 20 20 70 4f 75 74 2d 3e 66  ] = 0;.  pOut->f
b490: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 54 65 72 6d  lags |= MEM_Term
b4a0: 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 28 69  ;.  pOut->n = (i
b4b0: 6e 74 29 6e 42 79 74 65 3b 0a 20 20 70 4f 75 74  nt)nByte;.  pOut
b4c0: 2d 3e 65 6e 63 20 3d 20 65 6e 63 6f 64 69 6e 67  ->enc = encoding
b4d0: 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  ;.  UPDATE_MAX_B
b4e0: 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
b4f0: 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
b500: 63 6f 64 65 3a 20 41 64 64 20 50 31 20 50 32 20  code: Add P1 P2 
b510: 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  P3 * *.** Synops
b520: 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50 31 5d 2b  is: r[P3]=r[P1]+
b530: 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 41 64 64 20  r[P2].**.** Add 
b540: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
b550: 69 73 74 65 72 20 50 31 20 74 6f 20 74 68 65 20  ister P1 to the 
b560: 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65  value in registe
b570: 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  r P2.** and stor
b580: 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
b590: 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20  register P3..** 
b5a0: 49 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20  If either input 
b5b0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  is NULL, the res
b5c0: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a  ult is NULL..*/.
b5d0: 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 75 6c 74 69  /* Opcode: Multi
b5e0: 70 6c 79 20 50 31 20 50 32 20 50 33 20 2a 20 2a  ply P1 P2 P3 * *
b5f0: 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
b600: 50 33 5d 3d 72 5b 50 31 5d 2a 72 5b 50 32 5d 0a  P3]=r[P1]*r[P2].
b610: 2a 2a 0a 2a 2a 0a 2a 2a 20 4d 75 6c 74 69 70 6c  **.**.** Multipl
b620: 79 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72  y the value in r
b630: 65 67 69 73 74 65 72 20 50 31 20 62 79 20 74 68  egister P1 by th
b640: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
b650: 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73 74  ter P2.** and st
b660: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
b670: 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  n register P3..*
b680: 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70 75  * If either inpu
b690: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  t is NULL, the r
b6a0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  esult is NULL..*
b6b0: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 75 62  /./* Opcode: Sub
b6c0: 74 72 61 63 74 20 50 31 20 50 32 20 50 33 20 2a  tract P1 P2 P3 *
b6d0: 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
b6e0: 72 5b 50 33 5d 3d 72 5b 50 32 5d 2d 72 5b 50 31  r[P3]=r[P2]-r[P1
b6f0: 5d 0a 2a 2a 0a 2a 2a 20 53 75 62 74 72 61 63 74  ].**.** Subtract
b700: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
b710: 67 69 73 74 65 72 20 50 31 20 66 72 6f 6d 20 74  gister P1 from t
b720: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
b730: 73 74 65 72 20 50 32 0a 2a 2a 20 61 6e 64 20 73  ster P2.** and s
b740: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
b750: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
b760: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
b770: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
b780: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b790: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 69  */./* Opcode: Di
b7a0: 76 69 64 65 20 50 31 20 50 32 20 50 33 20 2a 20  vide P1 P2 P3 * 
b7b0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
b7c0: 5b 50 33 5d 3d 72 5b 50 32 5d 2f 72 5b 50 31 5d  [P3]=r[P2]/r[P1]
b7d0: 0a 2a 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68  .**.** Divide th
b7e0: 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  e value in regis
b7f0: 74 65 72 20 50 31 20 62 79 20 74 68 65 20 76 61  ter P1 by the va
b800: 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20  lue in register 
b810: 50 32 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  P2.** and store 
b820: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65  the result in re
b830: 67 69 73 74 65 72 20 50 33 20 28 50 33 3d 50 32  gister P3 (P3=P2
b840: 2f 50 31 29 2e 20 49 66 20 74 68 65 20 76 61 6c  /P1). If the val
b850: 75 65 20 69 6e 20 0a 2a 2a 20 72 65 67 69 73 74  ue in .** regist
b860: 65 72 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74  er P1 is zero, t
b870: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
b880: 73 20 4e 55 4c 4c 2e 20 49 66 20 65 69 74 68 65  s NULL. If eithe
b890: 72 20 69 6e 70 75 74 20 69 73 20 0a 2a 2a 20 4e  r input is .** N
b8a0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
b8b0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
b8c0: 70 63 6f 64 65 3a 20 52 65 6d 61 69 6e 64 65 72  pcode: Remainder
b8d0: 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
b8e0: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
b8f0: 3d 72 5b 50 32 5d 25 72 5b 50 31 5d 0a 2a 2a 0a  =r[P2]%r[P1].**.
b900: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  ** Compute the r
b910: 65 6d 61 69 6e 64 65 72 20 61 66 74 65 72 20 69  emainder after i
b920: 6e 74 65 67 65 72 20 72 65 67 69 73 74 65 72 20  nteger register 
b930: 50 32 20 69 73 20 64 69 76 69 64 65 64 20 62 79  P2 is divided by
b940: 20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31   .** register P1
b950: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
b960: 65 73 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65  esult in registe
b970: 72 20 50 33 2e 20 0a 2a 2a 20 49 66 20 74 68 65  r P3. .** If the
b980: 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
b990: 65 72 20 50 31 20 69 73 20 7a 65 72 6f 20 74 68  er P1 is zero th
b9a0: 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  e result is NULL
b9b0: 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  ..** If either o
b9c0: 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 20  perand is NULL, 
b9d0: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
b9e0: 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41  LL..*/.case OP_A
b9f0: 64 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  dd:             
ba00: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
ba10: 20 54 4b 5f 50 4c 55 53 2c 20 69 6e 31 2c 20 69   TK_PLUS, in1, i
ba20: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
ba30: 20 4f 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20   OP_Subtract:   
ba40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61             /* sa
ba50: 6d 65 20 61 73 20 54 4b 5f 4d 49 4e 55 53 2c 20  me as TK_MINUS, 
ba60: 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a  in1, in2, out3 *
ba70: 2f 0a 63 61 73 65 20 4f 50 5f 4d 75 6c 74 69 70  /.case OP_Multip
ba80: 6c 79 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ly:             
ba90: 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 53   /* same as TK_S
baa0: 54 41 52 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f  TAR, in1, in2, o
bab0: 75 74 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 44  ut3 */.case OP_D
bac0: 69 76 69 64 65 3a 20 20 20 20 20 20 20 20 20 20  ivide:          
bad0: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
bae0: 20 54 4b 5f 53 4c 41 53 48 2c 20 69 6e 31 2c 20   TK_SLASH, in1, 
baf0: 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73  in2, out3 */.cas
bb00: 65 20 4f 50 5f 52 65 6d 61 69 6e 64 65 72 3a 20  e OP_Remainder: 
bb10: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  {           /* s
bb20: 61 6d 65 20 61 73 20 54 4b 5f 52 45 4d 2c 20 69  ame as TK_REM, i
bb30: 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f  n1, in2, out3 */
bb40: 0a 20 20 63 68 61 72 20 62 49 6e 74 69 6e 74 3b  .  char bIntint;
bb50: 20 20 20 2f 2a 20 53 74 61 72 74 65 64 20 6f 75     /* Started ou
bb60: 74 20 61 73 20 74 77 6f 20 69 6e 74 65 67 65 72  t as two integer
bb70: 20 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 75   operands */.  u
bb80: 31 36 20 66 6c 61 67 73 3b 20 20 20 20 20 20 2f  16 flags;      /
bb90: 2a 20 43 6f 6d 62 69 6e 65 64 20 4d 45 4d 5f 2a  * Combined MEM_*
bba0: 20 66 6c 61 67 73 20 66 72 6f 6d 20 62 6f 74 68   flags from both
bbb0: 20 69 6e 70 75 74 73 20 2a 2f 0a 20 20 75 31 36   inputs */.  u16
bbc0: 20 74 79 70 65 31 3b 20 20 20 20 20 20 2f 2a 20   type1;      /* 
bbd0: 4e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66 20  Numeric type of 
bbe0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
bbf0: 20 20 75 31 36 20 74 79 70 65 32 3b 20 20 20 20    u16 type2;    
bc00: 20 20 2f 2a 20 4e 75 6d 65 72 69 63 20 74 79 70    /* Numeric typ
bc10: 65 20 6f 66 20 72 69 67 68 74 20 6f 70 65 72 61  e of right opera
bc20: 6e 64 20 2a 2f 0a 20 20 69 36 34 20 69 41 3b 20  nd */.  i64 iA; 
bc30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
bc40: 65 72 20 76 61 6c 75 65 20 6f 66 20 6c 65 66 74  er value of left
bc50: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 36   operand */.  i6
bc60: 34 20 69 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  4 iB;         /*
bc70: 20 49 6e 74 65 67 65 72 20 76 61 6c 75 65 20 6f   Integer value o
bc80: 66 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  f right operand 
bc90: 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72 41 3b 20  */.  double rA; 
bca0: 20 20 20 20 20 2f 2a 20 52 65 61 6c 20 76 61 6c       /* Real val
bcb0: 75 65 20 6f 66 20 6c 65 66 74 20 6f 70 65 72 61  ue of left opera
bcc0: 6e 64 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 72  nd */.  double r
bcd0: 42 3b 20 20 20 20 20 20 2f 2a 20 52 65 61 6c 20  B;      /* Real 
bce0: 76 61 6c 75 65 20 6f 66 20 72 69 67 68 74 20 6f  value of right o
bcf0: 70 65 72 61 6e 64 20 2a 2f 0a 0a 20 20 70 49 6e  perand */..  pIn
bd00: 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  1 = &aMem[pOp->p
bd10: 31 5d 3b 0a 20 20 74 79 70 65 31 20 3d 20 6e 75  1];.  type1 = nu
bd20: 6d 65 72 69 63 54 79 70 65 28 70 49 6e 31 29 3b  mericType(pIn1);
bd30: 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
bd40: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 74 79 70 65  pOp->p2];.  type
bd50: 32 20 3d 20 6e 75 6d 65 72 69 63 54 79 70 65 28  2 = numericType(
bd60: 70 49 6e 32 29 3b 0a 20 20 70 4f 75 74 20 3d 20  pIn2);.  pOut = 
bd70: 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
bd80: 20 20 66 6c 61 67 73 20 3d 20 70 49 6e 31 2d 3e    flags = pIn1->
bd90: 66 6c 61 67 73 20 7c 20 70 49 6e 32 2d 3e 66 6c  flags | pIn2->fl
bda0: 61 67 73 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  ags;.  if( (flag
bdb0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30  s & MEM_Null)!=0
bdc0: 20 29 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74   ) goto arithmet
bdd0: 69 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c  ic_result_is_nul
bde0: 6c 3b 0a 20 20 69 66 28 20 28 74 79 70 65 31 20  l;.  if( (type1 
bdf0: 26 20 74 79 70 65 32 20 26 20 4d 45 4d 5f 49 6e  & type2 & MEM_In
be00: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 41 20  t)!=0 ){.    iA 
be10: 3d 20 70 49 6e 31 2d 3e 75 2e 69 3b 0a 20 20 20  = pIn1->u.i;.   
be20: 20 69 42 20 3d 20 70 49 6e 32 2d 3e 75 2e 69 3b   iB = pIn2->u.i;
be30: 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d 20 31  .    bIntint = 1
be40: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 4f  ;.    switch( pO
be50: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
be60: 20 20 20 63 61 73 65 20 4f 50 5f 41 64 64 3a 20     case OP_Add: 
be70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
be80: 33 41 64 64 49 6e 74 36 34 28 26 69 42 2c 69 41  3AddInt64(&iB,iA
be90: 29 20 29 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68  ) ) goto fp_math
bea0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
beb0: 63 61 73 65 20 4f 50 5f 53 75 62 74 72 61 63 74  case OP_Subtract
bec0: 3a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 75  :  if( sqlite3Su
bed0: 62 49 6e 74 36 34 28 26 69 42 2c 69 41 29 20 29  bInt64(&iB,iA) )
bee0: 20 67 6f 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20   goto fp_math;  
bef0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf00: 65 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20  e OP_Multiply:  
bf10: 69 66 28 20 73 71 6c 69 74 65 33 4d 75 6c 49 6e  if( sqlite3MulIn
bf20: 74 36 34 28 26 69 42 2c 69 41 29 20 29 20 67 6f  t64(&iB,iA) ) go
bf30: 74 6f 20 66 70 5f 6d 61 74 68 3b 20 20 62 72 65  to fp_math;  bre
bf40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
bf50: 50 5f 44 69 76 69 64 65 3a 20 7b 0a 20 20 20 20  P_Divide: {.    
bf60: 20 20 20 20 69 66 28 20 69 41 3d 3d 30 20 29 20      if( iA==0 ) 
bf70: 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69 63 5f  goto arithmetic_
bf80: 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a  result_is_null;.
bf90: 20 20 20 20 20 20 20 20 69 66 28 20 69 41 3d 3d          if( iA==
bfa0: 2d 31 20 26 26 20 69 42 3d 3d 53 4d 41 4c 4c 45  -1 && iB==SMALLE
bfb0: 53 54 5f 49 4e 54 36 34 20 29 20 67 6f 74 6f 20  ST_INT64 ) goto 
bfc0: 66 70 5f 6d 61 74 68 3b 0a 20 20 20 20 20 20 20  fp_math;.       
bfd0: 20 69 42 20 2f 3d 20 69 41 3b 0a 20 20 20 20 20   iB /= iA;.     
bfe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bff0: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
c000: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   {.        if( i
c010: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
c020: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
c030: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
c040: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
c050: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 42 20 25   1;.        iB %
c060: 3d 20 69 41 3b 0a 20 20 20 20 20 20 20 20 62 72  = iA;.        br
c070: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c080: 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69   }.    pOut->u.i
c090: 20 3d 20 69 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = iB;.    MemSe
c0a0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
c0b0: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 7d 65 6c 73  MEM_Int);.  }els
c0c0: 65 7b 0a 20 20 20 20 62 49 6e 74 69 6e 74 20 3d  e{.    bIntint =
c0d0: 20 30 3b 0a 66 70 5f 6d 61 74 68 3a 0a 20 20 20   0;.fp_math:.   
c0e0: 20 72 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rA = sqlite3Vdb
c0f0: 65 52 65 61 6c 56 61 6c 75 65 28 70 49 6e 31 29  eRealValue(pIn1)
c100: 3b 0a 20 20 20 20 72 42 20 3d 20 73 71 6c 69 74  ;.    rB = sqlit
c110: 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75 65 28  e3VdbeRealValue(
c120: 70 49 6e 32 29 3b 0a 20 20 20 20 73 77 69 74 63  pIn2);.    switc
c130: 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29  h( pOp->opcode )
c140: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
c150: 41 64 64 3a 20 20 20 20 20 20 20 20 20 72 42 20  Add:         rB 
c160: 2b 3d 20 72 41 3b 20 20 20 20 20 20 20 62 72 65  += rA;       bre
c170: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
c180: 50 5f 53 75 62 74 72 61 63 74 3a 20 20 20 20 72  P_Subtract:    r
c190: 42 20 2d 3d 20 72 41 3b 20 20 20 20 20 20 20 62  B -= rA;       b
c1a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c1b0: 20 4f 50 5f 4d 75 6c 74 69 70 6c 79 3a 20 20 20   OP_Multiply:   
c1c0: 20 72 42 20 2a 3d 20 72 41 3b 20 20 20 20 20 20   rB *= rA;      
c1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c1e0: 73 65 20 4f 50 5f 44 69 76 69 64 65 3a 20 7b 0a  se OP_Divide: {.
c1f0: 20 20 20 20 20 20 20 20 2f 2a 20 28 64 6f 75 62          /* (doub
c200: 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
c210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
c220: 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
c230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 41 3d  .        if( rA=
c240: 3d 28 64 6f 75 62 6c 65 29 30 20 29 20 67 6f 74  =(double)0 ) got
c250: 6f 20 61 72 69 74 68 6d 65 74 69 63 5f 72 65 73  o arithmetic_res
c260: 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3b 0a 20 20 20  ult_is_null;.   
c270: 20 20 20 20 20 72 42 20 2f 3d 20 72 41 3b 0a 20       rB /= rA;. 
c280: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c290: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
c2a0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
c2b0: 41 20 3d 20 28 69 36 34 29 72 41 3b 0a 20 20 20  A = (i64)rA;.   
c2c0: 20 20 20 20 20 69 42 20 3d 20 28 69 36 34 29 72       iB = (i64)r
c2d0: 42 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  B;.        if( i
c2e0: 41 3d 3d 30 20 29 20 67 6f 74 6f 20 61 72 69 74  A==0 ) goto arit
c2f0: 68 6d 65 74 69 63 5f 72 65 73 75 6c 74 5f 69 73  hmetic_result_is
c300: 5f 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69  _null;.        i
c310: 66 28 20 69 41 3d 3d 2d 31 20 29 20 69 41 20 3d  f( iA==-1 ) iA =
c320: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 42 20 3d   1;.        rB =
c330: 20 28 64 6f 75 62 6c 65 29 28 69 42 20 25 20 69   (double)(iB % i
c340: 41 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  A);.        brea
c350: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c370: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
c380: 4e 54 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69  NT.    pOut->u.i
c390: 20 3d 20 72 42 3b 0a 20 20 20 20 4d 65 6d 53 65   = rB;.    MemSe
c3a0: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
c3b0: 4d 45 4d 5f 49 6e 74 29 3b 0a 23 65 6c 73 65 0a  MEM_Int);.#else.
c3c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
c3d0: 73 4e 61 4e 28 72 42 29 20 29 7b 0a 20 20 20 20  sNaN(rB) ){.    
c3e0: 20 20 67 6f 74 6f 20 61 72 69 74 68 6d 65 74 69    goto arithmeti
c3f0: 63 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c  c_result_is_null
c400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74  ;.    }.    pOut
c410: 2d 3e 75 2e 72 20 3d 20 72 42 3b 0a 20 20 20 20  ->u.r = rB;.    
c420: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70  MemSetTypeFlag(p
c430: 4f 75 74 2c 20 4d 45 4d 5f 52 65 61 6c 29 3b 0a  Out, MEM_Real);.
c440: 20 20 20 20 69 66 28 20 28 28 74 79 70 65 31 7c      if( ((type1|
c450: 74 79 70 65 32 29 26 4d 45 4d 5f 52 65 61 6c 29  type2)&MEM_Real)
c460: 3d 3d 30 20 26 26 20 21 62 49 6e 74 69 6e 74 20  ==0 && !bIntint 
c470: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c480: 56 64 62 65 49 6e 74 65 67 65 72 41 66 66 69 6e  VdbeIntegerAffin
c490: 69 74 79 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d  ity(pOut);.    }
c4a0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 62 72  .#endif.  }.  br
c4b0: 65 61 6b 3b 0a 0a 61 72 69 74 68 6d 65 74 69 63  eak;..arithmetic
c4c0: 5f 72 65 73 75 6c 74 5f 69 73 5f 6e 75 6c 6c 3a  _result_is_null:
c4d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
c4e0: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
c4f0: 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
c500: 70 63 6f 64 65 3a 20 43 6f 6c 6c 53 65 71 20 50  pcode: CollSeq P
c510: 31 20 2a 20 2a 20 50 34 0a 2a 2a 0a 2a 2a 20 50  1 * * P4.**.** P
c520: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
c530: 6f 20 61 20 43 6f 6c 6c 53 65 71 20 73 74 72 75  o a CollSeq stru
c540: 63 74 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  ct. If the next 
c550: 63 61 6c 6c 20 74 6f 20 61 20 75 73 65 72 20 66  call to a user f
c560: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6f 72 20 61 67  unction.** or ag
c570: 67 72 65 67 61 74 65 20 63 61 6c 6c 73 20 73 71  gregate calls sq
c580: 6c 69 74 65 33 47 65 74 46 75 6e 63 43 6f 6c 6c  lite3GetFuncColl
c590: 53 65 71 28 29 2c 20 74 68 69 73 20 63 6f 6c 6c  Seq(), this coll
c5a0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
c5b0: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
c5c0: 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  ed. This is used
c5d0: 20 62 79 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   by the built-in
c5e0: 20 6d 69 6e 28 29 2c 20 6d 61 78 28 29 20 61 6e   min(), max() an
c5f0: 64 20 6e 75 6c 6c 69 66 28 29 0a 2a 2a 20 66 75  d nullif().** fu
c600: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  nctions..**.** I
c610: 66 20 50 31 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f P1 is not zero
c620: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
c630: 65 67 69 73 74 65 72 20 74 68 61 74 20 61 20 73  egister that a s
c640: 75 62 73 65 71 75 65 6e 74 20 6d 69 6e 28 29 20  ubsequent min() 
c650: 6f 72 0a 2a 2a 20 6d 61 78 28 29 20 61 67 67 72  or.** max() aggr
c660: 65 67 61 74 65 20 77 69 6c 6c 20 73 65 74 20 74  egate will set t
c670: 6f 20 31 20 69 66 20 74 68 65 20 63 75 72 72 65  o 1 if the curre
c680: 6e 74 20 72 6f 77 20 69 73 20 6e 6f 74 20 74 68  nt row is not th
c690: 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 0a 2a 2a 20  e minimum or.** 
c6a0: 6d 61 78 69 6d 75 6d 2e 20 20 54 68 65 20 50 31  maximum.  The P1
c6b0: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
c6c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 20 62 79  tialized to 0 by
c6d0: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
c6e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  n..**.** The int
c6f0: 65 72 66 61 63 65 20 75 73 65 64 20 62 79 20 74  erface used by t
c700: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
c710: 6e 20 6f 66 20 74 68 65 20 61 66 6f 72 65 6d 65  n of the aforeme
c720: 6e 74 69 6f 6e 65 64 20 66 75 6e 63 74 69 6f 6e  ntioned function
c730: 73 0a 2a 2a 20 74 6f 20 72 65 74 72 69 65 76 65  s.** to retrieve
c740: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
c750: 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74  equence set by t
c760: 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f  his opcode is no
c770: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 70  t available.** p
c780: 75 62 6c 69 63 6c 79 2e 20 20 4f 6e 6c 79 20 62  ublicly.  Only b
c790: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
c7a0: 73 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f  s have access to
c7b0: 20 74 68 69 73 20 66 65 61 74 75 72 65 2e 0a 2a   this feature..*
c7c0: 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 6c 53 65  /.case OP_CollSe
c7d0: 71 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70  q: {.  assert( p
c7e0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43  Op->p4type==P4_C
c7f0: 4f 4c 4c 53 45 51 20 29 3b 0a 20 20 69 66 28 20  OLLSEQ );.  if( 
c800: 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20 73  pOp->p1 ){.    s
c810: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
c820: 49 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d  Int64(&aMem[pOp-
c830: 3e 70 31 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  >p1], 0);.  }.  
c840: 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
c850: 6f 64 65 3a 20 46 75 6e 63 74 69 6f 6e 30 20 50  ode: Function0 P
c860: 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
c870: 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
c880: 3d 66 75 6e 63 28 72 5b 50 32 40 50 35 5d 29 0a  =func(r[P2@P5]).
c890: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 61 20 75  **.** Invoke a u
c8a0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 50 34  ser function (P4
c8b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c8c0: 20 61 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63   a FuncDef objec
c8d0: 74 20 74 68 61 74 0a 2a 2a 20 64 65 66 69 6e 65  t that.** define
c8e0: 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 29 20  s the function) 
c8f0: 77 69 74 68 20 50 35 20 61 72 67 75 6d 65 6e 74  with P5 argument
c900: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65 67  s taken from reg
c910: 69 73 74 65 72 20 50 32 20 61 6e 64 0a 2a 2a 20  ister P2 and.** 
c920: 73 75 63 63 65 73 73 6f 72 73 2e 20 20 54 68 65  successors.  The
c930: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66   result of the f
c940: 75 6e 63 74 69 6f 6e 20 69 73 20 73 74 6f 72 65  unction is store
c950: 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
c960: 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 33  ..** Register P3
c970: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 6e 65   must not be one
c980: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
c990: 20 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50   inputs..**.** P
c9a0: 31 20 69 73 20 61 20 33 32 2d 62 69 74 20 62 69  1 is a 32-bit bi
c9b0: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
c9c0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
c9d0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 74 6f  each argument to
c9e0: 20 74 68 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f   the .** functio
c9f0: 6e 20 77 61 73 20 64 65 74 65 72 6d 69 6e 65 64  n was determined
ca00: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
ca10: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2e  at compile time.
ca20: 20 49 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   If the first.**
ca30: 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 63 6f   argument was co
ca40: 6e 73 74 61 6e 74 20 74 68 65 6e 20 62 69 74 20  nstant then bit 
ca50: 30 20 6f 66 20 50 31 20 69 73 20 73 65 74 2e 20  0 of P1 is set. 
ca60: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
ca70: 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
ca80: 74 68 65 72 20 6d 65 74 61 20 64 61 74 61 20 61  ther meta data a
ca90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
caa0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 61   user function a
cab0: 72 67 75 6d 65 6e 74 20 75 73 69 6e 67 20 74 68  rgument using th
cac0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 65 74  e.** sqlite3_set
cad0: 5f 61 75 78 64 61 74 61 28 29 20 41 50 49 20 6d  _auxdata() API m
cae0: 61 79 20 62 65 20 73 61 66 65 6c 79 20 72 65 74  ay be safely ret
caf0: 61 69 6e 65 64 20 75 6e 74 69 6c 20 74 68 65 20  ained until the 
cb00: 6e 65 78 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  next.** invocati
cb10: 6f 6e 20 6f 66 20 74 68 69 73 20 6f 70 63 6f 64  on of this opcod
cb20: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
cb30: 6f 3a 20 46 75 6e 63 74 69 6f 6e 2c 20 41 67 67  o: Function, Agg
cb40: 53 74 65 70 2c 20 41 67 67 46 69 6e 61 6c 0a 2a  Step, AggFinal.*
cb50: 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 75 6e  /./* Opcode: Fun
cb60: 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33 20 50  ction P1 P2 P3 P
cb70: 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
cb80: 3a 20 72 5b 50 33 5d 3d 66 75 6e 63 28 72 5b 50  : r[P3]=func(r[P
cb90: 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 49 6e 76  2@P5]).**.** Inv
cba0: 6f 6b 65 20 61 20 75 73 65 72 20 66 75 6e 63 74  oke a user funct
cbb0: 69 6f 6e 20 28 50 34 20 69 73 20 61 20 70 6f 69  ion (P4 is a poi
cbc0: 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
cbd0: 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63  e3_context objec
cbe0: 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6e 74 61 69  t that.** contai
cbf0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
cc00: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  the function to 
cc10: 62 65 20 72 75 6e 29 20 77 69 74 68 20 50 35 20  be run) with P5 
cc20: 61 72 67 75 6d 65 6e 74 73 20 74 61 6b 65 6e 0a  arguments taken.
cc30: 2a 2a 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  ** from register
cc40: 20 50 32 20 61 6e 64 20 73 75 63 63 65 73 73 6f   P2 and successo
cc50: 72 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  rs.  The result 
cc60: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
cc70: 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
cc80: 72 65 67 69 73 74 65 72 20 50 33 2e 20 20 52 65  register P3.  Re
cc90: 67 69 73 74 65 72 20 50 33 20 6d 75 73 74 20 6e  gister P3 must n
cca0: 6f 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  ot be one of the
ccb0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 70 75 74 73   function inputs
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  ..**.** P1 is a 
ccd0: 33 32 2d 62 69 74 20 62 69 74 6d 61 73 6b 20 69  32-bit bitmask i
cce0: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
ccf0: 72 20 6f 72 20 6e 6f 74 20 65 61 63 68 20 61 72  r or not each ar
cd00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 0a 2a  gument to the .*
cd10: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 64  * function was d
cd20: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
cd30: 63 6f 6e 73 74 61 6e 74 20 61 74 20 63 6f 6d 70  constant at comp
cd40: 69 6c 65 20 74 69 6d 65 2e 20 49 66 20 74 68 65  ile time. If the
cd50: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
cd60: 6e 74 20 77 61 73 20 63 6f 6e 73 74 61 6e 74 20  nt was constant 
cd70: 74 68 65 6e 20 62 69 74 20 30 20 6f 66 20 50 31  then bit 0 of P1
cd80: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 69 73   is set. This is
cd90: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
cda0: 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6d 65  ne.** whether me
cdb0: 74 61 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta data associat
cdc0: 65 64 20 77 69 74 68 20 61 20 75 73 65 72 20 66  ed with a user f
cdd0: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
cde0: 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
cdf0: 6c 69 74 65 33 5f 73 65 74 5f 61 75 78 64 61 74  lite3_set_auxdat
ce00: 61 28 29 20 41 50 49 20 6d 61 79 20 62 65 20 73  a() API may be s
ce10: 61 66 65 6c 79 20 72 65 74 61 69 6e 65 64 20 75  afely retained u
ce20: 6e 74 69 6c 20 74 68 65 20 6e 65 78 74 0a 2a 2a  ntil the next.**
ce30: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
ce40: 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  his opcode..**.*
ce50: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
ce60: 61 72 65 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  are initially co
ce70: 64 65 64 20 61 73 20 4f 50 5f 46 75 6e 63 74 69  ded as OP_Functi
ce80: 6f 6e 30 20 77 69 74 68 20 50 34 20 70 6f 69 6e  on0 with P4 poin
ce90: 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 46 75 6e  ting.** to a Fun
cea0: 63 44 65 66 20 6f 62 6a 65 63 74 2e 20 20 42 75  cDef object.  Bu
ceb0: 74 20 6f 6e 20 66 69 72 73 74 20 65 76 61 6c 75  t on first evalu
cec0: 61 74 69 6f 6e 2c 20 74 68 65 20 50 34 20 6f 70  ation, the P4 op
ced0: 65 72 61 6e 64 20 69 73 0a 2a 2a 20 61 75 74 6f  erand is.** auto
cee0: 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 76 65 72  matically conver
cef0: 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69  ted into an sqli
cf00: 74 65 33 5f 63 6f 6e 74 65 78 74 20 6f 62 6a 65  te3_context obje
cf10: 63 74 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61  ct and the opera
cf20: 74 69 6f 6e 0a 2a 2a 20 63 68 61 6e 67 65 64 20  tion.** changed 
cf30: 74 6f 20 74 68 69 73 20 4f 50 5f 46 75 6e 63 74  to this OP_Funct
cf40: 69 6f 6e 20 6f 70 63 6f 64 65 2e 20 20 49 6e 20  ion opcode.  In 
cf50: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 69 6e  this way, the in
cf60: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 0a  itialization of.
cf70: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ** the sqlite3_c
cf80: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 6f 63  ontext object oc
cf90: 63 75 72 73 20 6f 6e 6c 79 20 6f 6e 63 65 2c 20  curs only once, 
cfa0: 72 61 74 68 65 72 20 74 68 61 6e 20 6f 6e 63 65  rather than once
cfb0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 65 76 61   for each.** eva
cfc0: 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  luation of the f
cfd0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
cfe0: 65 65 20 61 6c 73 6f 3a 20 46 75 6e 63 74 69 6f  ee also: Functio
cff0: 6e 30 2c 20 41 67 67 53 74 65 70 2c 20 41 67 67  n0, AggStep, Agg
d000: 46 69 6e 61 6c 0a 2a 2f 0a 63 61 73 65 20 4f 50  Final.*/.case OP
d010: 5f 46 75 6e 63 74 69 6f 6e 30 3a 20 7b 0a 20 20  _Function0: {.  
d020: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
d030: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
d040: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
d050: 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 44  p4type==P4_FUNCD
d060: 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70 4f 70 2d  EF );.  n = pOp-
d070: 3e 70 35 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >p5;.  assert( p
d080: 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70 2d  Op->p3>0 && pOp-
d090: 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
d0a0: 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
d0b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20  .  assert( n==0 
d0c0: 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30 20 26 26  || (pOp->p2>0 &&
d0d0: 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28 70 2d 3e   pOp->p2+n<=(p->
d0e0: 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72  nMem+1 - p->nCur
d0f0: 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20 61 73 73  sor)+1) );.  ass
d100: 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c 70 4f 70  ert( pOp->p3<pOp
d110: 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e 70 33 3e  ->p2 || pOp->p3>
d120: 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b 0a 20 20  =pOp->p2+n );.  
d130: 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 44 62  pCtx = sqlite3Db
d140: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
d150: 73 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 2b 20  sizeof(*pCtx) + 
d160: 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28 73 71 6c  (n-1)*sizeof(sql
d170: 69 74 65 33 5f 76 61 6c 75 65 2a 29 29 3b 0a 20  ite3_value*));. 
d180: 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 20 67   if( pCtx==0 ) g
d190: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
d1a0: 74 78 2d 3e 70 4f 75 74 20 3d 20 30 3b 0a 20 20  tx->pOut = 0;.  
d1b0: 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d 20 70 4f  pCtx->pFunc = pO
d1c0: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 70  p->p4.pFunc;.  p
d1d0: 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69 6e 74 29  Ctx->iOp = (int)
d1e0: 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 70  (pOp - aOp);.  p
d1f0: 43 74 78 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a  Ctx->pVdbe = p;.
d200: 20 20 70 43 74 78 2d 3e 61 72 67 63 20 3d 20 6e    pCtx->argc = n
d210: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
d220: 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b 0a 20 20  = P4_FUNCCTX;.  
d230: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20 3d 20 70  pOp->p4.pCtx = p
d240: 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  Ctx;.  pOp->opco
d250: 64 65 20 3d 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  de = OP_Function
d260: 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ;.  /* Fall thro
d270: 75 67 68 20 69 6e 74 6f 20 4f 50 5f 46 75 6e 63  ugh into OP_Func
d280: 74 69 6f 6e 20 2a 2f 0a 7d 0a 63 61 73 65 20 4f  tion */.}.case O
d290: 50 5f 46 75 6e 63 74 69 6f 6e 3a 20 7b 0a 20 20  P_Function: {.  
d2a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
d2b0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
d2c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
d2d0: 70 34 74 79 70 65 3d 3d 50 34 5f 46 55 4e 43 43  p4type==P4_FUNCC
d2e0: 54 58 20 29 3b 0a 20 20 70 43 74 78 20 3d 20 70  TX );.  pCtx = p
d2f0: 4f 70 2d 3e 70 34 2e 70 43 74 78 3b 0a 0a 20 20  Op->p4.pCtx;..  
d300: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
d310: 69 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f 66  ion is inside of
d320: 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 20   a trigger, the 
d330: 72 65 67 69 73 74 65 72 20 61 72 72 61 79 20 69  register array i
d340: 6e 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69  n aMem[].  ** mi
d350: 67 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d 20  ght change from 
d360: 6f 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74  one evaluation t
d370: 6f 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68 65  o the next.  The
d380: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
d390: 6f 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20  ode.  ** checks 
d3a0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
d3b0: 67 69 73 74 65 72 20 61 72 72 61 79 20 68 61 73  gister array has
d3c0: 20 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69 66   changed, and if
d3d0: 20 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e   so it.  ** rein
d3e0: 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65  itializes the re
d3f0: 6c 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66 20  lavant parts of 
d400: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  the sqlite3_cont
d410: 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ext object */.  
d420: 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
d430: 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20 70 43 74  ->p3];.  if( pCt
d440: 78 2d 3e 70 4f 75 74 20 21 3d 20 70 4f 75 74 20  x->pOut != pOut 
d450: 29 7b 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 75  ){.    pCtx->pOu
d460: 74 20 3d 20 70 4f 75 74 3b 0a 20 20 20 20 66 6f  t = pOut;.    fo
d470: 72 28 69 3d 70 43 74 78 2d 3e 61 72 67 63 2d 31  r(i=pCtx->argc-1
d480: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 70 43 74  ; i>=0; i--) pCt
d490: 78 2d 3e 61 72 67 76 5b 69 5d 20 3d 20 26 61 4d  x->argv[i] = &aM
d4a0: 65 6d 5b 70 4f 70 2d 3e 70 32 2b 69 5d 3b 0a 20  em[pOp->p2+i];. 
d4b0: 20 7d 0a 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f   }..  memAboutTo
d4c0: 43 68 61 6e 67 65 28 70 2c 20 70 43 74 78 2d 3e  Change(p, pCtx->
d4d0: 70 4f 75 74 29 3b 0a 23 69 66 64 65 66 20 53 51  pOut);.#ifdef SQ
d4e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
d4f0: 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d 3e 61 72  (i=0; i<pCtx->ar
d500: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  gc; i++){.    as
d510: 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69 64  sert( memIsValid
d520: 28 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 20  (pCtx->argv[i]) 
d530: 29 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f  );.    REGISTER_
d540: 54 52 41 43 45 28 70 4f 70 2d 3e 70 32 2b 69 2c  TRACE(pOp->p2+i,
d550: 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d 29 3b   pCtx->argv[i]);
d560: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4d 65  .  }.#endif.  Me
d570: 6d 53 65 74 54 79 70 65 46 6c 61 67 28 70 43 74  mSetTypeFlag(pCt
d580: 78 2d 3e 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75 6c  x->pOut, MEM_Nul
d590: 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 66 45 72 72  l);.  pCtx->fErr
d5a0: 6f 72 4f 72 41 75 78 20 3d 20 30 3b 0a 20 20 64  orOrAux = 0;.  d
d5b0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c  b->lastRowid = l
d5c0: 61 73 74 52 6f 77 69 64 3b 0a 20 20 28 2a 70 43  astRowid;.  (*pC
d5d0: 74 78 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  tx->pFunc->xSFun
d5e0: 63 29 28 70 43 74 78 2c 20 70 43 74 78 2d 3e 61  c)(pCtx, pCtx->a
d5f0: 72 67 63 2c 20 70 43 74 78 2d 3e 61 72 67 76 29  rgc, pCtx->argv)
d600: 3b 2f 2a 20 49 4d 50 3a 20 52 2d 32 34 35 30 35  ;/* IMP: R-24505
d610: 2d 32 33 32 33 30 20 2a 2f 0a 20 20 6c 61 73 74  -23230 */.  last
d620: 52 6f 77 69 64 20 3d 20 64 62 2d 3e 6c 61 73 74  Rowid = db->last
d630: 52 6f 77 69 64 3b 20 20 2f 2a 20 52 65 6d 65 6d  Rowid;  /* Remem
d640: 62 65 72 20 72 6f 77 69 64 20 63 68 61 6e 67 65  ber rowid change
d650: 73 20 6d 61 64 65 20 62 79 20 78 53 46 75 6e 63  s made by xSFunc
d660: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
d670: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d680: 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 74 68 72  ed an error, thr
d690: 6f 77 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  ow an exception 
d6a0: 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 66  */.  if( pCtx->f
d6b0: 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a 20 20  ErrorOrAux ){.  
d6c0: 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73 45 72    if( pCtx->isEr
d6d0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ror ){.      sql
d6e0: 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
d6f0: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 76   "%s", sqlite3_v
d700: 61 6c 75 65 5f 74 65 78 74 28 70 43 74 78 2d 3e  alue_text(pCtx->
d710: 70 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72 63  pOut));.      rc
d720: 20 3d 20 70 43 74 78 2d 3e 69 73 45 72 72 6f 72   = pCtx->isError
d730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d740: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
d750: 44 61 74 61 28 64 62 2c 20 26 70 2d 3e 70 41 75  Data(db, &p->pAu
d760: 78 44 61 74 61 2c 20 70 43 74 78 2d 3e 69 4f 70  xData, pCtx->iOp
d770: 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20 20 20  , pOp->p1);.    
d780: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
d790: 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
d7a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 70 79  ;.  }..  /* Copy
d7b0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d7c0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74 6f  he function into
d7d0: 20 72 65 67 69 73 74 65 72 20 50 33 20 2a 2f 0a   register P3 */.
d7e0: 20 20 69 66 28 20 70 4f 75 74 2d 3e 66 6c 61 67    if( pOut->flag
d7f0: 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
d800: 5f 42 6c 6f 62 29 20 29 7b 0a 20 20 20 20 73 71  _Blob) ){.    sq
d810: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 45  lite3VdbeChangeE
d820: 6e 63 6f 64 69 6e 67 28 70 43 74 78 2d 3e 70 4f  ncoding(pCtx->pO
d830: 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20  ut, encoding);. 
d840: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
d850: 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 43 74 78  beMemTooBig(pCtx
d860: 2d 3e 70 4f 75 74 29 20 29 20 67 6f 74 6f 20 74  ->pOut) ) goto t
d870: 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 52  oo_big;.  }..  R
d880: 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f  EGISTER_TRACE(pO
d890: 70 2d 3e 70 33 2c 20 70 43 74 78 2d 3e 70 4f 75  p->p3, pCtx->pOu
d8a0: 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
d8b0: 5f 42 4c 4f 42 53 49 5a 45 28 70 43 74 78 2d 3e  _BLOBSIZE(pCtx->
d8c0: 70 4f 75 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  pOut);.  break;.
d8d0: 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 42 69  }../* Opcode: Bi
d8e0: 74 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20  tAnd P1 P2 P3 * 
d8f0: 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
d900: 5b 50 33 5d 3d 72 5b 50 31 5d 26 72 5b 50 32 5d  [P3]=r[P1]&r[P2]
d910: 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20 74 68 65 20  .**.** Take the 
d920: 62 69 74 2d 77 69 73 65 20 41 4e 44 20 6f 66 20  bit-wise AND of 
d930: 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65  the values in re
d940: 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50 32  gister P1 and P2
d950: 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20 74 68   and.** store th
d960: 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67 69  e result in regi
d970: 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20 65  ster P3..** If e
d980: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
d990: 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ULL, the result 
d9a0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f  is NULL..*/./* O
d9b0: 70 63 6f 64 65 3a 20 42 69 74 4f 72 20 50 31 20  pcode: BitOr P1 
d9c0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
d9d0: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
d9e0: 31 5d 7c 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 54  1]|r[P2].**.** T
d9f0: 61 6b 65 20 74 68 65 20 62 69 74 2d 77 69 73 65  ake the bit-wise
da00: 20 4f 52 20 6f 66 20 74 68 65 20 76 61 6c 75 65   OR of the value
da10: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31  s in register P1
da20: 20 61 6e 64 20 50 32 20 61 6e 64 0a 2a 2a 20 73   and P2 and.** s
da30: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
da40: 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
da50: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 69 6e 70  ** If either inp
da60: 75 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ut is NULL, the 
da70: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
da80: 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 68  */./* Opcode: Sh
da90: 69 66 74 4c 65 66 74 20 50 31 20 50 32 20 50 33  iftLeft P1 P2 P3
daa0: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
dab0: 3a 20 72 5b 50 33 5d 3d 72 5b 50 32 5d 3c 3c 72  : r[P3]=r[P2]<<r
dac0: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 53 68 69 66 74  [P1].**.** Shift
dad0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
dae0: 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
daf0: 32 20 74 6f 20 74 68 65 20 6c 65 66 74 20 62 79  2 to the left by
db00: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
db10: 66 20 62 69 74 73 20 73 70 65 63 69 66 69 65 64  f bits specified
db20: 20 62 79 20 74 68 65 20 69 6e 74 65 67 65 72 20   by the integer 
db30: 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a  in register P1..
db40: 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  ** Store the res
db50: 75 6c 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  ult in register 
db60: 50 33 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  P3..** If either
db70: 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2c 20   input is NULL, 
db80: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 4e 55  the result is NU
db90: 4c 4c 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  LL..*/./* Opcode
dba0: 3a 20 53 68 69 66 74 52 69 67 68 74 20 50 31 20  : ShiftRight P1 
dbb0: 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
dbc0: 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72 5b 50  opsis: r[P3]=r[P
dbd0: 32 5d 3e 3e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20  2]>>r[P1].**.** 
dbe0: 53 68 69 66 74 20 74 68 65 20 69 6e 74 65 67 65  Shift the intege
dbf0: 72 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73  r value in regis
dc00: 74 65 72 20 50 32 20 74 6f 20 74 68 65 20 72 69  ter P2 to the ri
dc10: 67 68 74 20 62 79 20 74 68 65 0a 2a 2a 20 6e 75  ght by the.** nu
dc20: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 73 70 65  mber of bits spe
dc30: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 69 6e  cified by the in
dc40: 74 65 67 65 72 20 69 6e 20 72 65 67 69 73 74 65  teger in registe
dc50: 72 20 50 31 2e 0a 2a 2a 20 53 74 6f 72 65 20 74  r P1..** Store t
dc60: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 72 65 67  he result in reg
dc70: 69 73 74 65 72 20 50 33 2e 0a 2a 2a 20 49 66 20  ister P3..** If 
dc80: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
dc90: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 75 6c 74  NULL, the result
dca0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 61 73   is NULL..*/.cas
dcb0: 65 20 4f 50 5f 42 69 74 41 6e 64 3a 20 20 20 20  e OP_BitAnd:    
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcd0: 73 61 6d 65 20 61 73 20 54 4b 5f 42 49 54 41 4e  same as TK_BITAN
dce0: 44 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74  D, in1, in2, out
dcf0: 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74  3 */.case OP_Bit
dd00: 4f 72 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Or:             
dd10: 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
dd20: 54 4b 5f 42 49 54 4f 52 2c 20 69 6e 31 2c 20 69  TK_BITOR, in1, i
dd30: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61 73 65  n2, out3 */.case
dd40: 20 4f 50 5f 53 68 69 66 74 4c 65 66 74 3a 20 20   OP_ShiftLeft:  
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
dd60: 61 6d 65 20 61 73 20 54 4b 5f 4c 53 48 49 46 54  ame as TK_LSHIFT
dd70: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 6f 75 74 33  , in1, in2, out3
dd80: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 68 69 66   */.case OP_Shif
dd90: 74 52 69 67 68 74 3a 20 7b 20 20 20 20 20 20 20  tRight: {       
dda0: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
ddb0: 4b 5f 52 53 48 49 46 54 2c 20 69 6e 31 2c 20 69  K_RSHIFT, in1, i
ddc0: 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 36  n2, out3 */.  i6
ddd0: 34 20 69 41 3b 0a 20 20 75 36 34 20 75 41 3b 0a  4 iA;.  u64 uA;.
dde0: 20 20 69 36 34 20 69 42 3b 0a 20 20 75 38 20 6f    i64 iB;.  u8 o
ddf0: 70 3b 0a 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d  p;..  pIn1 = &aM
de00: 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70  em[pOp->p1];.  p
de10: 49 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In2 = &aMem[pOp-
de20: 3e 70 32 5d 3b 0a 20 20 70 4f 75 74 20 3d 20 26  >p2];.  pOut = &
de30: 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20  aMem[pOp->p3];. 
de40: 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67   if( (pIn1->flag
de50: 73 20 7c 20 70 49 6e 32 2d 3e 66 6c 61 67 73 29  s | pIn2->flags)
de60: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
de70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
de80: 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29 3b 0a  mSetNull(pOut);.
de90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
dea0: 20 69 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62   iA = sqlite3Vdb
deb0: 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 32 29 3b  eIntValue(pIn2);
dec0: 0a 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 56  .  iB = sqlite3V
ded0: 64 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31  dbeIntValue(pIn1
dee0: 29 3b 0a 20 20 6f 70 20 3d 20 70 4f 70 2d 3e 6f  );.  op = pOp->o
def0: 70 63 6f 64 65 3b 0a 20 20 69 66 28 20 6f 70 3d  pcode;.  if( op=
df00: 3d 4f 50 5f 42 69 74 41 6e 64 20 29 7b 0a 20 20  =OP_BitAnd ){.  
df10: 20 20 69 41 20 26 3d 20 69 42 3b 0a 20 20 7d 65    iA &= iB;.  }e
df20: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 42  lse if( op==OP_B
df30: 69 74 4f 72 20 29 7b 0a 20 20 20 20 69 41 20 7c  itOr ){.    iA |
df40: 3d 20 69 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = iB;.  }else if
df50: 28 20 69 42 21 3d 30 20 29 7b 0a 20 20 20 20 61  ( iB!=0 ){.    a
df60: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 53 68  ssert( op==OP_Sh
df70: 69 66 74 52 69 67 68 74 20 7c 7c 20 6f 70 3d 3d  iftRight || op==
df80: 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a  OP_ShiftLeft );.
df90: 0a 20 20 20 20 2f 2a 20 49 66 20 73 68 69 66 74  .    /* If shift
dfa0: 69 6e 67 20 62 79 20 61 20 6e 65 67 61 74 69 76  ing by a negativ
dfb0: 65 20 61 6d 6f 75 6e 74 2c 20 73 68 69 66 74 20  e amount, shift 
dfc0: 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 69 72  in the other dir
dfd0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66  ection */.    if
dfe0: 28 20 69 42 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( iB<0 ){.      
dff0: 61 73 73 65 72 74 28 20 4f 50 5f 53 68 69 66 74  assert( OP_Shift
e000: 52 69 67 68 74 3d 3d 4f 50 5f 53 68 69 66 74 4c  Right==OP_ShiftL
e010: 65 66 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 6f  eft+1 );.      o
e020: 70 20 3d 20 32 2a 4f 50 5f 53 68 69 66 74 4c 65  p = 2*OP_ShiftLe
e030: 66 74 20 2b 20 31 20 2d 20 6f 70 3b 0a 20 20 20  ft + 1 - op;.   
e040: 20 20 20 69 42 20 3d 20 69 42 3e 28 2d 36 34 29     iB = iB>(-64)
e050: 20 3f 20 2d 69 42 20 3a 20 36 34 3b 0a 20 20 20   ? -iB : 64;.   
e060: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 42 3e 3d   }..    if( iB>=
e070: 36 34 20 29 7b 0a 20 20 20 20 20 20 69 41 20 3d  64 ){.      iA =
e080: 20 28 69 41 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 4f   (iA>=0 || op==O
e090: 50 5f 53 68 69 66 74 4c 65 66 74 29 20 3f 20 30  P_ShiftLeft) ? 0
e0a0: 20 3a 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   : -1;.    }else
e0b0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
e0c0: 75 41 2c 20 26 69 41 2c 20 73 69 7a 65 6f 66 28  uA, &iA, sizeof(
e0d0: 75 41 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  uA));.      if( 
e0e0: 6f 70 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74  op==OP_ShiftLeft
e0f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3c   ){.        uA <
e100: 3c 3d 20 69 42 3b 0a 20 20 20 20 20 20 7d 65 6c  <= iB;.      }el
e110: 73 65 7b 0a 20 20 20 20 20 20 20 20 75 41 20 3e  se{.        uA >
e120: 3e 3d 20 69 42 3b 0a 20 20 20 20 20 20 20 20 2f  >= iB;.        /
e130: 2a 20 53 69 67 6e 2d 65 78 74 65 6e 64 20 6f 6e  * Sign-extend on
e140: 20 61 20 72 69 67 68 74 20 73 68 69 66 74 20 6f   a right shift o
e150: 66 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  f a negative num
e160: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ber */.        i
e170: 66 28 20 69 41 3c 30 20 29 20 75 41 20 7c 3d 20  f( iA<0 ) uA |= 
e180: 28 28 28 28 75 36 34 29 30 78 66 66 66 66 66 66  ((((u64)0xffffff
e190: 66 66 29 3c 3c 33 32 29 7c 30 78 66 66 66 66 66  ff)<<32)|0xfffff
e1a0: 66 66 66 29 20 3c 3c 20 28 36 34 2d 69 42 29 3b  fff) << (64-iB);
e1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
e1c0: 65 6d 63 70 79 28 26 69 41 2c 20 26 75 41 2c 20  emcpy(&iA, &uA, 
e1d0: 73 69 7a 65 6f 66 28 69 41 29 29 3b 0a 20 20 20  sizeof(iA));.   
e1e0: 20 7d 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75   }.  }.  pOut->u
e1f0: 2e 69 20 3d 20 69 41 3b 0a 20 20 4d 65 6d 53 65  .i = iA;.  MemSe
e200: 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74 2c 20  tTypeFlag(pOut, 
e210: 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72 65 61  MEM_Int);.  brea
e220: 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
e230: 20 41 64 64 49 6d 6d 20 20 50 31 20 50 32 20 2a   AddImm  P1 P2 *
e240: 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
e250: 3a 20 72 5b 50 31 5d 3d 72 5b 50 31 5d 2b 50 32  : r[P1]=r[P1]+P2
e260: 0a 2a 2a 20 0a 2a 2a 20 41 64 64 20 74 68 65 20  .** .** Add the 
e270: 63 6f 6e 73 74 61 6e 74 20 50 32 20 74 6f 20 74  constant P2 to t
e280: 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
e290: 73 74 65 72 20 50 31 2e 0a 2a 2a 20 54 68 65 20  ster P1..** The 
e2a0: 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61 79 73  result is always
e2b0: 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a   an integer..**.
e2c0: 2a 2a 20 54 6f 20 66 6f 72 63 65 20 61 6e 79 20  ** To force any 
e2d0: 72 65 67 69 73 74 65 72 20 74 6f 20 62 65 20 61  register to be a
e2e0: 6e 20 69 6e 74 65 67 65 72 2c 20 6a 75 73 74 20  n integer, just 
e2f0: 61 64 64 20 30 2e 0a 2a 2f 0a 63 61 73 65 20 4f  add 0..*/.case O
e300: 50 5f 41 64 64 49 6d 6d 3a 20 7b 20 20 20 20 20  P_AddImm: {     
e310: 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f         /* in1 */
e320: 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
e330: 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41  pOp->p1];.  memA
e340: 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20  boutToChange(p, 
e350: 70 49 6e 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  pIn1);.  sqlite3
e360: 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
e370: 79 28 70 49 6e 31 29 3b 0a 20 20 70 49 6e 31 2d  y(pIn1);.  pIn1-
e380: 3e 75 2e 69 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b  >u.i += pOp->p2;
e390: 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
e3a0: 4f 70 63 6f 64 65 3a 20 4d 75 73 74 42 65 49 6e  Opcode: MustBeIn
e3b0: 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
e3c0: 20 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 76   .** Force the v
e3d0: 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
e3e0: 20 50 31 20 74 6f 20 62 65 20 61 6e 20 69 6e 74   P1 to be an int
e3f0: 65 67 65 72 2e 20 20 49 66 20 74 68 65 20 76 61  eger.  If the va
e400: 6c 75 65 0a 2a 2a 20 69 6e 20 50 31 20 69 73 20  lue.** in P1 is 
e410: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 61  not an integer a
e420: 6e 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  nd cannot be con
e430: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 69  verted into an i
e440: 6e 74 65 67 65 72 0a 2a 2a 20 77 69 74 68 6f 75  nteger.** withou
e450: 74 20 64 61 74 61 20 6c 6f 73 73 2c 20 74 68 65  t data loss, the
e460: 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  n jump immediate
e470: 6c 79 20 74 6f 20 50 32 2c 20 6f 72 20 69 66 20  ly to P2, or if 
e480: 50 32 3d 3d 30 0a 2a 2a 20 72 61 69 73 65 20 61  P2==0.** raise a
e490: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  n SQLITE_MISMATC
e4a0: 48 20 65 78 63 65 70 74 69 6f 6e 2e 0a 2a 2f 0a  H exception..*/.
e4b0: 63 61 73 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e  case OP_MustBeIn
e4c0: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
e4d0: 2f 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a  /* jump, in1 */.
e4e0: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
e4f0: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 28  Op->p1];.  if( (
e500: 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
e510: 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Int)==0 ){.   
e520: 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70   applyAffinity(p
e530: 49 6e 31 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f  In1, SQLITE_AFF_
e540: 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69 6e  NUMERIC, encodin
e550: 67 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  g);.    VdbeBran
e560: 63 68 54 61 6b 65 6e 28 28 70 49 6e 31 2d 3e 66  chTaken((pIn1->f
e570: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 29 3d 3d 30  lags&MEM_Int)==0
e580: 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 28 70  , 2);.    if( (p
e590: 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
e5a0: 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
e5b0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30    if( pOp->p2==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e5d0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
e5e0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  ;.        goto a
e5f0: 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
e600: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
e610: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d          goto jum
e620: 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 7d  p_to_p2;.      }
e630: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 65 6d  .    }.  }.  Mem
e640: 53 65 74 54 79 70 65 46 6c 61 67 28 70 49 6e 31  SetTypeFlag(pIn1
e650: 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 62 72  , MEM_Int);.  br
e660: 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
e670: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
e680: 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 20 4f 70  TING_POINT./* Op
e690: 63 6f 64 65 3a 20 52 65 61 6c 41 66 66 69 6e 69  code: RealAffini
e6a0: 74 79 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a  ty P1 * * * *.**
e6b0: 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65 72 20  .** If register 
e6c0: 50 31 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65  P1 holds an inte
e6d0: 67 65 72 20 63 6f 6e 76 65 72 74 20 69 74 20 74  ger convert it t
e6e0: 6f 20 61 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a  o a real value..
e6f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
e700: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 65  e is used when e
e710: 78 74 72 61 63 74 69 6e 67 20 69 6e 66 6f 72 6d  xtracting inform
e720: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 63 6f 6c  ation from a col
e730: 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  umn that.** has 
e740: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2e 20 20  REAL affinity.  
e750: 53 75 63 68 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  Such column valu
e760: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
e770: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 69 6e 74  stored as.** int
e780: 65 67 65 72 73 2c 20 66 6f 72 20 73 70 61 63 65  egers, for space
e790: 20 65 66 66 69 63 69 65 6e 63 79 2c 20 62 75 74   efficiency, but
e7a0: 20 61 66 74 65 72 20 65 78 74 72 61 63 74 69 6f   after extractio
e7b0: 6e 20 77 65 20 77 61 6e 74 20 74 68 65 6d 0a 2a  n we want them.*
e7c0: 2a 20 74 6f 20 68 61 76 65 20 6f 6e 6c 79 20 61  * to have only a
e7d0: 20 72 65 61 6c 20 76 61 6c 75 65 2e 0a 2a 2f 0a   real value..*/.
e7e0: 63 61 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69  case OP_RealAffi
e7f0: 6e 69 74 79 3a 20 7b 20 20 20 20 20 20 20 20 20  nity: {         
e800: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 31 20           /* in1 
e810: 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
e820: 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66  m[pOp->p1];.  if
e830: 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20  ( pIn1->flags & 
e840: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 73  MEM_Int ){.    s
e850: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 61  qlite3VdbeMemRea
e860: 6c 69 66 79 28 70 49 6e 31 29 3b 0a 20 20 7d 0a  lify(pIn1);.  }.
e870: 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69    break;.}.#endi
e880: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
e890: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 2f 2a 20 4f  E_OMIT_CAST./* O
e8a0: 70 63 6f 64 65 3a 20 43 61 73 74 20 50 31 20 50  pcode: Cast P1 P
e8b0: 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
e8c0: 73 69 73 3a 20 61 66 66 69 6e 69 74 79 28 72 5b  sis: affinity(r[
e8d0: 50 31 5d 29 0a 2a 2a 0a 2a 2a 20 46 6f 72 63 65  P1]).**.** Force
e8e0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
e8f0: 67 69 73 74 65 72 20 50 31 20 74 6f 20 62 65 20  gister P1 to be 
e900: 74 68 65 20 74 79 70 65 20 64 65 66 69 6e 65 64  the type defined
e910: 20 62 79 20 50 32 2e 0a 2a 2a 20 0a 2a 2a 20 3c   by P2..** .** <
e920: 75 6c 3e 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  ul>.** <li value
e930: 3d 22 39 37 22 3e 20 54 45 58 54 0a 2a 2a 20 3c  ="97"> TEXT.** <
e940: 6c 69 20 76 61 6c 75 65 3d 22 39 38 22 3e 20 42  li value="98"> B
e950: 4c 4f 42 0a 2a 2a 20 3c 6c 69 20 76 61 6c 75 65  LOB.** <li value
e960: 3d 22 39 39 22 3e 20 4e 55 4d 45 52 49 43 0a 2a  ="99"> NUMERIC.*
e970: 2a 20 3c 6c 69 20 76 61 6c 75 65 3d 22 31 30 30  * <li value="100
e980: 22 3e 20 49 4e 54 45 47 45 52 0a 2a 2a 20 3c 6c  "> INTEGER.** <l
e990: 69 20 76 61 6c 75 65 3d 22 31 30 31 22 3e 20 52  i value="101"> R
e9a0: 45 41 4c 0a 2a 2a 20 3c 2f 75 6c 3e 0a 2a 2a 0a  EAL.** </ul>.**.
e9b0: 2a 2a 20 41 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ** A NULL value 
e9c0: 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 62  is not changed b
e9d0: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
e9e0: 20 49 74 20 72 65 6d 61 69 6e 73 20 4e 55 4c 4c   It remains NULL
e9f0: 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 61 73  ..*/.case OP_Cas
ea00: 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  t: {            
ea10: 20 20 20 20 20 20 2f 2a 20 69 6e 31 20 2a 2f 0a        /* in1 */.
ea20: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
ea30: 32 3e 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  2>=SQLITE_AFF_BL
ea40: 4f 42 20 26 26 20 70 4f 70 2d 3e 70 32 3c 3d 53  OB && pOp->p2<=S
ea50: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
ea60: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
ea70: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
ea80: 46 5f 54 45 58 54 20 29 3b 0a 20 20 74 65 73 74  F_TEXT );.  test
ea90: 63 61 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53  case( pOp->p2==S
eaa0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29  QLITE_AFF_BLOB )
eab0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  ;.  testcase( pO
eac0: 70 2d 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 41 46  p->p2==SQLITE_AF
ead0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 74  F_NUMERIC );.  t
eae0: 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70 32  estcase( pOp->p2
eaf0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
eb00: 45 47 45 52 20 29 3b 0a 20 20 74 65 73 74 63 61  EGER );.  testca
eb10: 73 65 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c  se( pOp->p2==SQL
eb20: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
eb30: 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70    pIn1 = &aMem[p
eb40: 4f 70 2d 3e 70 31 5d 3b 0a 20 20 6d 65 6d 41 62  Op->p1];.  memAb
eb50: 6f 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70  outToChange(p, p
eb60: 49 6e 31 29 3b 0a 20 20 72 63 20 3d 20 45 78 70  In1);.  rc = Exp
eb70: 61 6e 64 42 6c 6f 62 28 70 49 6e 31 29 3b 0a 20  andBlob(pIn1);. 
eb80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
eb90: 61 73 74 28 70 49 6e 31 2c 20 70 4f 70 2d 3e 70  ast(pIn1, pOp->p
eba0: 32 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  2, encoding);.  
ebb0: 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f 42 53  UPDATE_MAX_BLOBS
ebc0: 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 69 66 28  IZE(pIn1);.  if(
ebd0: 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
ebe0: 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
ebf0: 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
ec00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ec10: 43 41 53 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63 6f  CAST */../* Opco
ec20: 64 65 3a 20 45 71 20 50 31 20 50 32 20 50 33 20  de: Eq P1 P2 P3 
ec30: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
ec40: 73 3a 20 49 46 20 72 5b 50 33 5d 3d 3d 72 5b 50  s: IF r[P3]==r[P
ec50: 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  1].**.** Compare
ec60: 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20 72   the values in r
ec70: 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20 50  egister P1 and P
ec80: 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3d 3d  3.  If reg(P3)==
ec90: 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20  reg(P1) then.** 
eca0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
ecb0: 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20 53  P2.  Or if the S
ecc0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66 6c  QLITE_STOREP2 fl
ecd0: 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35 2c  ag is set in P5,
ece0: 20 74 68 65 6e 0a 2a 2a 20 73 74 6f 72 65 20 74   then.** store t
ecf0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
ed00: 70 61 72 69 73 6f 6e 20 69 6e 20 72 65 67 69 73  parison in regis
ed10: 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68  ter P2..**.** Th
ed20: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4d 41 53  e SQLITE_AFF_MAS
ed30: 4b 20 70 6f 72 74 69 6f 6e 20 6f 66 20 50 35 20  K portion of P5 
ed40: 6d 75 73 74 20 62 65 20 61 6e 20 61 66 66 69 6e  must be an affin
ed50: 69 74 79 20 63 68 61 72 61 63 74 65 72 20 2d 0a  ity character -.
ed60: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ** SQLITE_AFF_TE
ed70: 58 54 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  XT, SQLITE_AFF_I
ed80: 4e 54 45 47 45 52 2c 20 61 6e 64 20 73 6f 20 66  NTEGER, and so f
ed90: 6f 72 74 68 2e 20 41 6e 20 61 74 74 65 6d 70 74  orth. An attempt
eda0: 20 69 73 20 6d 61 64 65 20 0a 2a 2a 20 74 6f 20   is made .** to 
edb0: 63 6f 65 72 63 65 20 62 6f 74 68 20 69 6e 70 75  coerce both inpu
edc0: 74 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ts according to 
edd0: 74 68 69 73 20 61 66 66 69 6e 69 74 79 20 62 65  this affinity be
ede0: 66 6f 72 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  fore the.** comp
edf0: 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 2e 20  arison is made. 
ee00: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  If the SQLITE_AF
ee10: 46 5f 4d 41 53 4b 20 69 73 20 30 78 30 30 2c 20  F_MASK is 0x00, 
ee20: 74 68 65 6e 20 6e 75 6d 65 72 69 63 0a 2a 2a 20  then numeric.** 
ee30: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
ee40: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  . Note that the 
ee50: 61 66 66 69 6e 69 74 79 20 63 6f 6e 76 65 72 73  affinity convers
ee60: 69 6f 6e 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ions are stored.
ee70: 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ** back into the
ee80: 20 69 6e 70 75 74 20 72 65 67 69 73 74 65 72 73   input registers
ee90: 20 50 31 20 61 6e 64 20 50 33 2e 20 20 53 6f 20   P1 and P3.  So 
eea0: 74 68 69 73 20 6f 70 63 6f 64 65 20 63 61 6e 20  this opcode can 
eeb0: 63 61 75 73 65 0a 2a 2a 20 70 65 72 73 69 73 74  cause.** persist
eec0: 65 6e 74 20 63 68 61 6e 67 65 73 20 74 6f 20 72  ent changes to r
eed0: 65 67 69 73 74 65 72 73 20 50 31 20 61 6e 64 20  egisters P1 and 
eee0: 50 33 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  P3..**.** Once a
eef0: 6e 79 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 68  ny conversions h
ef00: 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63 65 2c  ave taken place,
ef10: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 76 61 6c   and neither val
ef20: 75 65 20 69 73 20 4e 55 4c 4c 2c 20 0a 2a 2a 20  ue is NULL, .** 
ef30: 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20 63  the values are c
ef40: 6f 6d 70 61 72 65 64 2e 20 49 66 20 62 6f 74 68  ompared. If both
ef50: 20 76 61 6c 75 65 73 20 61 72 65 20 62 6c 6f 62   values are blob
ef60: 73 20 74 68 65 6e 20 6d 65 6d 63 6d 70 28 29 20  s then memcmp() 
ef70: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 64 65  is.** used to de
ef80: 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 73 75  termine the resu
ef90: 6c 74 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  lts of the compa
efa0: 72 69 73 6f 6e 2e 20 20 49 66 20 62 6f 74 68 20  rison.  If both 
efb0: 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 74 65  values.** are te
efc0: 78 74 2c 20 74 68 65 6e 20 74 68 65 20 61 70 70  xt, then the app
efd0: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
efe0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 73 70 65 63  ng function spec
eff0: 69 66 69 65 64 20 69 6e 0a 2a 2a 20 50 34 20 69  ified in.** P4 i
f000: 73 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  s used to do the
f010: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
f020: 20 50 34 20 69 73 20 6e 6f 74 20 73 70 65 63 69   P4 is not speci
f030: 66 69 65 64 20 74 68 65 6e 0a 2a 2a 20 6d 65 6d  fied then.** mem
f040: 63 6d 70 28 29 20 69 73 20 75 73 65 64 20 74 6f  cmp() is used to
f050: 20 63 6f 6d 70 61 72 65 20 74 65 78 74 20 73 74   compare text st
f060: 72 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20 76  ring.  If both v
f070: 61 6c 75 65 73 20 61 72 65 0a 2a 2a 20 6e 75 6d  alues are.** num
f080: 65 72 69 63 2c 20 74 68 65 6e 20 61 20 6e 75 6d  eric, then a num
f090: 65 72 69 63 20 63 6f 6d 70 61 72 69 73 6f 6e 20  eric comparison 
f0a0: 69 73 20 75 73 65 64 2e 20 49 66 20 74 68 65 20  is used. If the 
f0b0: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  two values.** ar
f0c0: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 74  e of different t
f0d0: 79 70 65 73 2c 20 74 68 65 6e 20 6e 75 6d 62 65  ypes, then numbe
f0e0: 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
f0f0: 64 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 73  d less than.** s
f100: 74 72 69 6e 67 73 20 61 6e 64 20 73 74 72 69 6e  trings and strin
f110: 67 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  gs are considere
f120: 64 20 6c 65 73 73 20 74 68 61 6e 20 62 6c 6f 62  d less than blob
f130: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
f140: 54 45 5f 4e 55 4c 4c 45 51 20 69 73 20 73 65 74  TE_NULLEQ is set
f150: 20 69 6e 20 50 35 20 74 68 65 6e 20 74 68 65 20   in P5 then the 
f160: 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
f170: 69 73 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  ison is always e
f180: 69 74 68 65 72 0a 2a 2a 20 74 72 75 65 20 6f 72  ither.** true or
f190: 20 66 61 6c 73 65 20 61 6e 64 20 69 73 20 6e 65   false and is ne
f1a0: 76 65 72 20 4e 55 4c 4c 2e 20 20 49 66 20 62 6f  ver NULL.  If bo
f1b0: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
f1c0: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65  NULL then the re
f1d0: 73 75 6c 74 0a 2a 2a 20 6f 66 20 63 6f 6d 70 61  sult.** of compa
f1e0: 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 20 20  rison is true.  
f1f0: 49 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e  If either operan
f200: 64 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  d is NULL then t
f210: 68 65 20 72 65 73 75 6c 74 20 69 73 20 66 61 6c  he result is fal
f220: 73 65 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65  se..** If neithe
f230: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
f240: 4c 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  L the result is 
f250: 74 68 65 20 73 61 6d 65 20 61 73 20 69 74 20 77  the same as it w
f260: 6f 75 6c 64 20 62 65 20 69 66 0a 2a 2a 20 74 68  ould be if.** th
f270: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 20  e SQLITE_NULLEQ 
f280: 66 6c 61 67 20 77 65 72 65 20 6f 6d 69 74 74 65  flag were omitte
f290: 64 20 66 72 6f 6d 20 50 35 2e 0a 2a 2a 0a 2a 2a  d from P5..**.**
f2a0: 20 49 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f   If both SQLITE_
f2b0: 53 54 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49  STOREP2 and SQLI
f2c0: 54 45 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67  TE_KEEPNULL flag
f2d0: 73 20 61 72 65 20 73 65 74 20 74 68 65 6e 20 74  s are set then t
f2e0: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
f2f0: 20 72 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63   r[P2] is only c
f300: 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65  hanged if the ne
f310: 77 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20  w value is NULL 
f320: 6f 72 20 30 20 28 66 61 6c 73 65 29 2e 0a 2a 2a  or 0 (false)..**
f330: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f340: 20 61 20 70 72 69 6f 72 20 72 5b 50 32 5d 20 76   a prior r[P2] v
f350: 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  alue will not be
f360: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20   overwritten by 
f370: 31 20 28 74 72 75 65 29 2e 0a 2a 2f 0a 2f 2a 20  1 (true)..*/./* 
f380: 4f 70 63 6f 64 65 3a 20 4e 65 20 50 31 20 50 32  Opcode: Ne P1 P2
f390: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
f3a0: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 21  opsis: IF r[P3]!
f3b0: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
f3c0: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
f3d0: 65 20 74 68 65 20 45 71 20 6f 70 63 6f 64 65 20  e the Eq opcode 
f3e0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
f3f0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
f400: 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 6e 64 73  .** the operands
f410: 20 69 6e 20 72 65 67 69 73 74 65 72 73 20 50 31   in registers P1
f420: 20 61 6e 64 20 50 33 20 61 72 65 20 6e 6f 74 20   and P3 are not 
f430: 65 71 75 61 6c 2e 20 20 53 65 65 20 74 68 65 20  equal.  See the 
f440: 45 71 20 6f 70 63 6f 64 65 20 66 6f 72 0a 2a 2a  Eq opcode for.**
f450: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f460: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
f470: 66 20 62 6f 74 68 20 53 51 4c 49 54 45 5f 53 54  f both SQLITE_ST
f480: 4f 52 45 50 32 20 61 6e 64 20 53 51 4c 49 54 45  OREP2 and SQLITE
f490: 5f 4b 45 45 50 4e 55 4c 4c 20 66 6c 61 67 73 20  _KEEPNULL flags 
f4a0: 61 72 65 20 73 65 74 20 74 68 65 6e 20 74 68 65  are set then the
f4b0: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  .** content of r
f4c0: 5b 50 32 5d 20 69 73 20 6f 6e 6c 79 20 63 68 61  [P2] is only cha
f4d0: 6e 67 65 64 20 69 66 20 74 68 65 20 6e 65 77 20  nged if the new 
f4e0: 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 6f 72  value is NULL or
f4f0: 20 31 20 28 74 72 75 65 29 2e 0a 2a 2a 20 49 6e   1 (true)..** In
f500: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
f510: 70 72 69 6f 72 20 72 5b 50 32 5d 20 76 61 6c 75  prior r[P2] valu
f520: 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6f 76  e will not be ov
f530: 65 72 77 72 69 74 74 65 6e 20 62 79 20 30 20 28  erwritten by 0 (
f540: 66 61 6c 73 65 29 2e 0a 2a 2f 0a 2f 2a 20 4f 70  false)..*/./* Op
f550: 63 6f 64 65 3a 20 4c 74 20 50 31 20 50 32 20 50  code: Lt P1 P2 P
f560: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
f570: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c 72 5b  sis: IF r[P3]<r[
f580: 50 31 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72  P1].**.** Compar
f590: 65 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  e the values in 
f5a0: 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
f5b0: 50 33 2e 20 20 49 66 20 72 65 67 28 50 33 29 3c  P3.  If reg(P3)<
f5c0: 72 65 67 28 50 31 29 20 74 68 65 6e 0a 2a 2a 20  reg(P1) then.** 
f5d0: 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73 20  jump to address 
f5e0: 50 32 2e 20 20 4f 72 20 69 66 20 74 68 65 20 53  P2.  Or if the S
f5f0: 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 66 6c  QLITE_STOREP2 fl
f600: 61 67 20 69 73 20 73 65 74 20 69 6e 20 50 35 20  ag is set in P5 
f610: 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20 72 65 73  store.** the res
f620: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
f630: 6e 20 28 30 20 6f 72 20 31 20 6f 72 20 4e 55 4c  n (0 or 1 or NUL
f640: 4c 29 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  L) into register
f650: 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   P2..**.** If th
f660: 65 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  e SQLITE_JUMPIFN
f670: 55 4c 4c 20 62 69 74 20 6f 66 20 50 35 20 69 73  ULL bit of P5 is
f680: 20 73 65 74 20 61 6e 64 20 65 69 74 68 65 72 20   set and either 
f690: 72 65 67 28 50 31 29 20 6f 72 0a 2a 2a 20 72 65  reg(P1) or.** re
f6a0: 67 28 50 33 29 20 69 73 20 4e 55 4c 4c 20 74 68  g(P3) is NULL th
f6b0: 65 6e 20 74 68 65 20 74 61 6b 65 20 74 68 65 20  en the take the 
f6c0: 6a 75 6d 70 2e 20 20 49 66 20 74 68 65 20 53 51  jump.  If the SQ
f6d0: 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
f6e0: 0a 2a 2a 20 62 69 74 20 69 73 20 63 6c 65 61 72  .** bit is clear
f6f0: 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
f700: 67 68 20 69 66 20 65 69 74 68 65 72 20 6f 70 65  gh if either ope
f710: 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  rand is NULL..**
f720: 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 41  .** The SQLITE_A
f730: 46 46 5f 4d 41 53 4b 20 70 6f 72 74 69 6f 6e 20  FF_MASK portion 
f740: 6f 66 20 50 35 20 6d 75 73 74 20 62 65 20 61 6e  of P5 must be an
f750: 20 61 66 66 69 6e 69 74 79 20 63 68 61 72 61 63   affinity charac
f760: 74 65 72 20 2d 0a 2a 2a 20 53 51 4c 49 54 45 5f  ter -.** SQLITE_
f770: 41 46 46 5f 54 45 58 54 2c 20 53 51 4c 49 54 45  AFF_TEXT, SQLITE
f780: 5f 41 46 46 5f 49 4e 54 45 47 45 52 2c 20 61 6e  _AFF_INTEGER, an
f790: 64 20 73 6f 20 66 6f 72 74 68 2e 20 41 6e 20 61  d so forth. An a
f7a0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 0a  ttempt is made .
f7b0: 2a 2a 20 74 6f 20 63 6f 65 72 63 65 20 62 6f 74  ** to coerce bot
f7c0: 68 20 69 6e 70 75 74 73 20 61 63 63 6f 72 64 69  h inputs accordi
f7d0: 6e 67 20 74 6f 20 74 68 69 73 20 61 66 66 69 6e  ng to this affin
f7e0: 69 74 79 20 62 65 66 6f 72 65 20 74 68 65 0a 2a  ity before the.*
f7f0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  * comparison is 
f800: 6d 61 64 65 2e 20 49 66 20 74 68 65 20 53 51 4c  made. If the SQL
f810: 49 54 45 5f 41 46 46 5f 4d 41 53 4b 20 69 73 20  ITE_AFF_MASK is 
f820: 30 78 30 30 2c 20 74 68 65 6e 20 6e 75 6d 65 72  0x00, then numer
f830: 69 63 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 69  ic.** affinity i
f840: 73 20 75 73 65 64 2e 20 4e 6f 74 65 20 74 68 61  s used. Note tha
f850: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 63  t the affinity c
f860: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20 73  onversions are s
f870: 74 6f 72 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  tored.** back in
f880: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 72 65 67  to the input reg
f890: 69 73 74 65 72 73 20 50 31 20 61 6e 64 20 50 33  isters P1 and P3
f8a0: 2e 20 20 53 6f 20 74 68 69 73 20 6f 70 63 6f 64  .  So this opcod
f8b0: 65 20 63 61 6e 20 63 61 75 73 65 0a 2a 2a 20 70  e can cause.** p
f8c0: 65 72 73 69 73 74 65 6e 74 20 63 68 61 6e 67 65  ersistent change
f8d0: 73 20 74 6f 20 72 65 67 69 73 74 65 72 73 20 50  s to registers P
f8e0: 31 20 61 6e 64 20 50 33 2e 0a 2a 2a 0a 2a 2a 20  1 and P3..**.** 
f8f0: 4f 6e 63 65 20 61 6e 79 20 63 6f 6e 76 65 72 73  Once any convers
f900: 69 6f 6e 73 20 68 61 76 65 20 74 61 6b 65 6e 20  ions have taken 
f910: 70 6c 61 63 65 2c 20 61 6e 64 20 6e 65 69 74 68  place, and neith
f920: 65 72 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  er value is NULL
f930: 2c 20 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  , .** the values
f940: 20 61 72 65 20 63 6f 6d 70 61 72 65 64 2e 20 49   are compared. I
f950: 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
f960: 65 20 62 6c 6f 62 73 20 74 68 65 6e 20 6d 65 6d  e blobs then mem
f970: 63 6d 70 28 29 20 69 73 0a 2a 2a 20 75 73 65 64  cmp() is.** used
f980: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
f990: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
f9a0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 49 66   comparison.  If
f9b0: 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 2a 2a 20   both values.** 
f9c0: 61 72 65 20 74 65 78 74 2c 20 74 68 65 6e 20 74  are text, then t
f9d0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
f9e0: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
f9f0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 2a  n specified in.*
fa00: 2a 20 50 34 20 69 73 20 20 75 73 65 64 20 74 6f  * P4 is  used to
fa10: 20 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   do the comparis
fa20: 6f 6e 2e 20 20 49 66 20 50 34 20 69 73 20 6e 6f  on.  If P4 is no
fa30: 74 20 73 70 65 63 69 66 69 65 64 20 74 68 65 6e  t specified then
fa40: 0a 2a 2a 20 6d 65 6d 63 6d 70 28 29 20 69 73 20  .** memcmp() is 
fa50: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
fa60: 74 65 78 74 20 73 74 72 69 6e 67 2e 20 20 49 66  text string.  If
fa70: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
fa80: 0a 2a 2a 20 6e 75 6d 65 72 69 63 2c 20 74 68 65  .** numeric, the
fa90: 6e 20 61 20 6e 75 6d 65 72 69 63 20 63 6f 6d 70  n a numeric comp
faa0: 61 72 69 73 6f 6e 20 69 73 20 75 73 65 64 2e 20  arison is used. 
fab0: 49 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65  If the two value
fac0: 73 0a 2a 2a 20 61 72 65 20 6f 66 20 64 69 66 66  s.** are of diff
fad0: 65 72 65 6e 74 20 74 79 70 65 73 2c 20 74 68 65  erent types, the
fae0: 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 63 6f  n numbers are co
faf0: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
fb00: 61 6e 0a 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e  an.** strings an
fb10: 64 20 73 74 72 69 6e 67 73 20 61 72 65 20 63 6f  d strings are co
fb20: 6e 73 69 64 65 72 65 64 20 6c 65 73 73 20 74 68  nsidered less th
fb30: 61 6e 20 62 6c 6f 62 73 2e 0a 2a 2f 0a 2f 2a 20  an blobs..*/./* 
fb40: 4f 70 63 6f 64 65 3a 20 4c 65 20 50 31 20 50 32  Opcode: Le P1 P2
fb50: 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e   P3 P4 P5.** Syn
fb60: 6f 70 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3c  opsis: IF r[P3]<
fb70: 3d 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69  =r[P1].**.** Thi
fb80: 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
fb90: 65 20 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20  e the Lt opcode 
fba0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
fbb0: 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66  jump is taken if
fbc0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
fbd0: 6f 66 20 72 65 67 69 73 74 65 72 20 50 33 20 69  of register P3 i
fbe0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
fbf0: 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e 74  qual to the cont
fc00: 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74  ent of.** regist
fc10: 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65 20  er P1.  See the 
fc20: 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64  Lt opcode for ad
fc30: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
fc40: 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  tion..*/./* Opco
fc50: 64 65 3a 20 47 74 20 50 31 20 50 32 20 50 33 20  de: Gt P1 P2 P3 
fc60: 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
fc70: 73 3a 20 49 46 20 72 5b 50 33 5d 3e 72 5b 50 31  s: IF r[P3]>r[P1
fc80: 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ].**.** This wor
fc90: 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ks just like the
fca0: 20 4c 74 20 6f 70 63 6f 64 65 20 65 78 63 65 70   Lt opcode excep
fcb0: 74 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  t that the jump 
fcc0: 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a 2a 20 74  is taken if.** t
fcd0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72 65  he content of re
fce0: 67 69 73 74 65 72 20 50 33 20 69 73 20 67 72 65  gister P3 is gre
fcf0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 6f  ater than the co
fd00: 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69  ntent of.** regi
fd10: 73 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68  ster P1.  See th
fd20: 65 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20  e Lt opcode for 
fd30: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fd40: 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70  mation..*/./* Op
fd50: 63 6f 64 65 3a 20 47 65 20 50 31 20 50 32 20 50  code: Ge P1 P2 P
fd60: 33 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70  3 P4 P5.** Synop
fd70: 73 69 73 3a 20 49 46 20 72 5b 50 33 5d 3e 3d 72  sis: IF r[P3]>=r
fd80: 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  [P1].**.** This 
fd90: 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
fda0: 74 68 65 20 4c 74 20 6f 70 63 6f 64 65 20 65 78  the Lt opcode ex
fdb0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6a 75  cept that the ju
fdc0: 6d 70 20 69 73 20 74 61 6b 65 6e 20 69 66 0a 2a  mp is taken if.*
fdd0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
fde0: 20 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20   register P3 is 
fdf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
fe00: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 63 6f 6e  equal to the con
fe10: 74 65 6e 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  tent of.** regis
fe20: 74 65 72 20 50 31 2e 20 20 53 65 65 20 74 68 65  ter P1.  See the
fe30: 20 4c 74 20 6f 70 63 6f 64 65 20 66 6f 72 20 61   Lt opcode for a
fe40: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
fe50: 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  ation..*/.case O
fe60: 50 5f 45 71 3a 20 20 20 20 20 20 20 20 20 20 20  P_Eq:           
fe70: 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54      /* same as T
fe80: 4b 5f 45 51 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c  K_EQ, jump, in1,
fe90: 20 69 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f   in3 */.case OP_
fea0: 4e 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  Ne:             
feb0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
fec0: 4e 45 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69  NE, jump, in1, i
fed0: 6e 33 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 74  n3 */.case OP_Lt
fee0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
fef0: 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 54  /* same as TK_LT
ff00: 2c 20 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33  , jump, in1, in3
ff10: 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 65 3a 20   */.case OP_Le: 
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff30: 20 73 61 6d 65 20 61 73 20 54 4b 5f 4c 45 2c 20   same as TK_LE, 
ff40: 6a 75 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a  jump, in1, in3 *
ff50: 2f 0a 63 61 73 65 20 4f 50 5f 47 74 3a 20 20 20  /.case OP_Gt:   
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
ff70: 61 6d 65 20 61 73 20 54 4b 5f 47 54 2c 20 6a 75  ame as TK_GT, ju
ff80: 6d 70 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a  mp, in1, in3 */.
ff90: 63 61 73 65 20 4f 50 5f 47 65 3a 20 7b 20 20 20  case OP_Ge: {   
ffa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d            /* sam
ffb0: 65 20 61 73 20 54 4b 5f 47 45 2c 20 6a 75 6d 70  e as TK_GE, jump
ffc0: 2c 20 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20  , in1, in3 */.  
ffd0: 69 6e 74 20 72 65 73 2c 20 72 65 73 32 3b 20 20  int res, res2;  
ffe0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
fff0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
10000 6f 66 20 70 49 6e 31 20 61 67 61 69 6e 73 74 20  of pIn1 against 
10010 70 49 6e 33 20 2a 2f 0a 20 20 63 68 61 72 20 61  pIn3 */.  char a
10020 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 2f 2a  ffinity;      /*
10030 20 41 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65   Affinity to use
10040 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 20   for comparison 
10050 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 31 3b  */.  u16 flags1;
10060 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
10070 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c 75   of initial valu
10080 65 20 6f 66 20 70 49 6e 31 2d 3e 66 6c 61 67 73  e of pIn1->flags
10090 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 33   */.  u16 flags3
100a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;         /* Cop
100b0 79 20 6f 66 20 69 6e 69 74 69 61 6c 20 76 61 6c  y of initial val
100c0 75 65 20 6f 66 20 70 49 6e 33 2d 3e 66 6c 61 67  ue of pIn3->flag
100d0 73 20 2a 2f 0a 0a 20 20 70 49 6e 31 20 3d 20 26  s */..  pIn1 = &
100e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
100f0 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn3 = &aMem[pO
10100 70 2d 3e 70 33 5d 3b 0a 20 20 66 6c 61 67 73 31  p->p3];.  flags1
10110 20 3d 20 70 49 6e 31 2d 3e 66 6c 61 67 73 3b 0a   = pIn1->flags;.
10120 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e 33 2d    flags3 = pIn3-
10130 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 66  >flags;.  if( (f
10140 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29 26  lags1 | flags3)&
10150 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
10160 2f 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  /* One or both o
10170 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
10180 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d   */.    if( pOp-
10190 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c  >p5 & SQLITE_NUL
101a0 4c 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LEQ ){.      /* 
101b0 49 66 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  If SQLITE_NULLEQ
101c0 20 69 73 20 73 65 74 20 28 77 68 69 63 68 20 77   is set (which w
101d0 69 6c 6c 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  ill only happen 
101e0 69 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  if the operator 
101f0 69 73 0a 20 20 20 20 20 20 2a 2a 20 4f 50 5f 45  is.      ** OP_E
10200 71 20 6f 72 20 4f 50 5f 4e 65 29 20 74 68 65 6e  q or OP_Ne) then
10210 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 6f   take the jump o
10220 72 20 6e 6f 74 20 64 65 70 65 6e 64 69 6e 67 20  r not depending 
10230 6f 6e 20 77 68 65 74 68 65 72 0a 20 20 20 20 20  on whether.     
10240 20 2a 2a 20 6f 72 20 6e 6f 74 20 62 6f 74 68 20   ** or not both 
10250 6f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 75 6c  operands are nul
10260 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
10270 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
10280 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20 7c 7c 20  pcode==OP_Eq || 
10290 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
102a0 4e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ne );.      asse
102b0 72 74 28 20 28 66 6c 61 67 73 31 20 26 20 4d 45  rt( (flags1 & ME
102c0 4d 5f 43 6c 65 61 72 65 64 29 3d 3d 30 20 29 3b  M_Cleared)==0 );
102d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
102e0 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
102f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3d 3d 30 20  _JUMPIFNULL)==0 
10300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  );.      if( (fl
10310 61 67 73 31 26 66 6c 61 67 73 33 26 4d 45 4d 5f  ags1&flags3&MEM_
10320 4e 75 6c 6c 29 21 3d 30 0a 20 20 20 20 20 20 20  Null)!=0.       
10330 26 26 20 28 66 6c 61 67 73 33 26 4d 45 4d 5f 43  && (flags3&MEM_C
10340 6c 65 61 72 65 64 29 3d 3d 30 0a 20 20 20 20 20  leared)==0.     
10350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
10360 3d 20 30 3b 20 20 2f 2a 20 4f 70 65 72 61 6e 64  = 0;  /* Operand
10370 73 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 20  s are equal */. 
10380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10390 20 20 20 20 72 65 73 20 3d 20 31 3b 20 20 2f 2a      res = 1;  /*
103a0 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20 6e 6f   Operands are no
103b0 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20 20 20  t equal */.     
103c0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
103d0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 55      /* SQLITE_NU
103e0 4c 4c 45 51 20 69 73 20 63 6c 65 61 72 20 61 6e  LLEQ is clear an
103f0 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  d at least one o
10400 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2c 0a  perand is NULL,.
10410 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
10420 65 20 72 65 73 75 6c 74 20 69 73 20 61 6c 77 61  e result is alwa
10430 79 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a  ys NULL..      *
10440 2a 20 54 68 65 20 6a 75 6d 70 20 69 73 20 74 61  * The jump is ta
10450 6b 65 6e 20 69 66 20 74 68 65 20 53 51 4c 49 54  ken if the SQLIT
10460 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 62 69 74  E_JUMPIFNULL bit
10470 20 69 73 20 73 65 74 2e 0a 20 20 20 20 20 20 2a   is set..      *
10480 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
10490 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f  >p5 & SQLITE_STO
104a0 52 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20  REP2 ){.        
104b0 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
104c0 2d 3e 70 32 5d 3b 0a 20 20 20 20 20 20 20 20 69  ->p2];.        i
104d0 43 6f 6d 70 61 72 65 20 3d 20 31 3b 20 20 20 20  Compare = 1;    
104e0 2f 2a 20 4f 70 65 72 61 6e 64 73 20 61 72 65 20  /* Operands are 
104f0 6e 6f 74 20 65 71 75 61 6c 20 2a 2f 0a 20 20 20  not equal */.   
10500 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43       memAboutToC
10510 68 61 6e 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a  hange(p, pOut);.
10520 20 20 20 20 20 20 20 20 4d 65 6d 53 65 74 54 79          MemSetTy
10530 70 65 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d  peFlag(pOut, MEM
10540 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  _Null);.        
10550 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28 70  REGISTER_TRACE(p
10560 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a 20  Op->p2, pOut);. 
10570 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10580 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
10590 6b 65 6e 28 32 2c 33 29 3b 0a 20 20 20 20 20 20  ken(2,3);.      
105a0 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20    if( pOp->p5 & 
105b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
105c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  L ){.          g
105d0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
105e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105f0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10600 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10610 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 6f 70 65    /* Neither ope
10620 72 61 6e 64 20 69 73 20 4e 55 4c 4c 2e 20 20 44  rand is NULL.  D
10630 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  o a comparison. 
10640 2a 2f 0a 20 20 20 20 61 66 66 69 6e 69 74 79 20  */.    affinity 
10650 3d 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  = pOp->p5 & SQLI
10660 54 45 5f 41 46 46 5f 4d 41 53 4b 3b 0a 20 20 20  TE_AFF_MASK;.   
10670 20 69 66 28 20 61 66 66 69 6e 69 74 79 3e 3d 53   if( affinity>=S
10680 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
10690 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  C ){.      if( (
106a0 66 6c 61 67 73 31 20 7c 20 66 6c 61 67 73 33 29  flags1 | flags3)
106b0 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
106c0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 31 20      if( (flags1 
106d0 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  & (MEM_Int|MEM_R
106e0 65 61 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d  eal|MEM_Str))==M
106f0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
10700 20 20 20 20 61 70 70 6c 79 4e 75 6d 65 72 69 63      applyNumeric
10710 41 66 66 69 6e 69 74 79 28 70 49 6e 31 2c 30 29  Affinity(pIn1,0)
10720 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
10730 63 61 73 65 28 20 66 6c 61 67 73 33 21 3d 70 49  case( flags3!=pI
10740 6e 33 2d 3e 66 6c 61 67 73 20 29 3b 20 2f 2a 20  n3->flags ); /* 
10750 50 6f 73 73 69 62 6c 65 20 69 66 20 70 49 6e 31  Possible if pIn1
10760 3d 3d 70 49 6e 33 20 2a 2f 0a 20 20 20 20 20 20  ==pIn3 */.      
10770 20 20 20 20 66 6c 61 67 73 33 20 3d 20 70 49 6e      flags3 = pIn
10780 33 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  3->flags;.      
10790 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
107a0 28 66 6c 61 67 73 33 20 26 20 28 4d 45 4d 5f 49  (flags3 & (MEM_I
107b0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  nt|MEM_Real|MEM_
107c0 53 74 72 29 29 3d 3d 4d 45 4d 5f 53 74 72 20 29  Str))==MEM_Str )
107d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 6c  {.          appl
107e0 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  yNumericAffinity
107f0 28 70 49 6e 33 2c 30 29 3b 0a 20 20 20 20 20 20  (pIn3,0);.      
10800 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10810 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 65 20    /* Handle the 
10820 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 69  common case of i
10830 6e 74 65 67 65 72 20 63 6f 6d 70 61 72 69 73 6f  nteger compariso
10840 6e 20 68 65 72 65 2c 20 61 73 20 61 6e 0a 20 20  n here, as an.  
10850 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
10860 69 6f 6e 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ion, to avoid a 
10870 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4d  call to sqlite3M
10880 65 6d 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20  emCompare() */. 
10890 20 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e       if( (pIn1->
108a0 66 6c 61 67 73 20 26 20 70 49 6e 33 2d 3e 66 6c  flags & pIn3->fl
108b0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
108c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
108d0 20 70 49 6e 33 2d 3e 75 2e 69 20 3e 20 70 49 6e   pIn3->u.i > pIn
108e0 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20 3d 20  1->u.i ){ res = 
108f0 2b 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65  +1; goto compare
10900 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  _op; }.        i
10910 66 28 20 70 49 6e 33 2d 3e 75 2e 69 20 3c 20 70  f( pIn3->u.i < p
10920 49 6e 31 2d 3e 75 2e 69 20 29 7b 20 72 65 73 20  In1->u.i ){ res 
10930 3d 20 2d 31 3b 20 67 6f 74 6f 20 63 6f 6d 70 61  = -1; goto compa
10940 72 65 5f 6f 70 3b 20 7d 0a 20 20 20 20 20 20 20  re_op; }.       
10950 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
10960 20 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 5f 6f    goto compare_o
10970 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
10980 65 6c 73 65 20 69 66 28 20 61 66 66 69 6e 69 74  else if( affinit
10990 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
109a0 58 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  XT ){.      if( 
109b0 28 66 6c 61 67 73 31 20 26 20 4d 45 4d 5f 53 74  (flags1 & MEM_St
109c0 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 31  r)==0 && (flags1
109d0 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f   & (MEM_Int|MEM_
109e0 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20 20  Real))!=0 ){.   
109f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10a00 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In1->flags & MEM
10a10 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20  _Int );.        
10a20 74 65 73 74 63 61 73 65 28 20 70 49 6e 31 2d 3e  testcase( pIn1->
10a30 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
10a40 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10a50 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e 67  te3VdbeMemString
10a60 69 66 79 28 70 49 6e 31 2c 20 65 6e 63 6f 64 69  ify(pIn1, encodi
10a70 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ng, 1);.        
10a80 74 65 73 74 63 61 73 65 28 20 28 66 6c 61 67 73  testcase( (flags
10a90 31 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28 70  1&MEM_Dyn) != (p
10aa0 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  In1->flags&MEM_D
10ab0 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20 66  yn) );.        f
10ac0 6c 61 67 73 31 20 3d 20 28 70 49 6e 31 2d 3e 66  lags1 = (pIn1->f
10ad0 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70 65  lags & ~MEM_Type
10ae0 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 31 20  Mask) | (flags1 
10af0 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29 3b  & MEM_TypeMask);
10b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10b10 20 70 49 6e 31 21 3d 70 49 6e 33 20 29 3b 0a 20   pIn1!=pIn3 );. 
10b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10b30 20 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 53   (flags3 & MEM_S
10b40 74 72 29 3d 3d 30 20 26 26 20 28 66 6c 61 67 73  tr)==0 && (flags
10b50 33 20 26 20 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  3 & (MEM_Int|MEM
10b60 5f 52 65 61 6c 29 29 21 3d 30 20 29 7b 0a 20 20  _Real))!=0 ){.  
10b70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10b80 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn3->flags & ME
10b90 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
10ba0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 33 2d   testcase( pIn3-
10bb0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
10bc0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
10bd0 69 74 65 33 56 64 62 65 4d 65 6d 53 74 72 69 6e  ite3VdbeMemStrin
10be0 67 69 66 79 28 70 49 6e 33 2c 20 65 6e 63 6f 64  gify(pIn3, encod
10bf0 69 6e 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ing, 1);.       
10c00 20 74 65 73 74 63 61 73 65 28 20 28 66 6c 61 67   testcase( (flag
10c10 73 33 26 4d 45 4d 5f 44 79 6e 29 20 21 3d 20 28  s3&MEM_Dyn) != (
10c20 70 49 6e 33 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pIn3->flags&MEM_
10c30 44 79 6e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Dyn) );.        
10c40 66 6c 61 67 73 33 20 3d 20 28 70 49 6e 33 2d 3e  flags3 = (pIn3->
10c50 66 6c 61 67 73 20 26 20 7e 4d 45 4d 5f 54 79 70  flags & ~MEM_Typ
10c60 65 4d 61 73 6b 29 20 7c 20 28 66 6c 61 67 73 33  eMask) | (flags3
10c70 20 26 20 4d 45 4d 5f 54 79 70 65 4d 61 73 6b 29   & MEM_TypeMask)
10c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10c90 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
10ca0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 43 4f 4c 4c  >p4type==P4_COLL
10cb0 53 45 51 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e 70  SEQ || pOp->p4.p
10cc0 43 6f 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Coll==0 );.    r
10cd0 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
10ce0 6f 6d 70 61 72 65 28 70 49 6e 33 2c 20 70 49 6e  ompare(pIn3, pIn
10cf0 31 2c 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c  1, pOp->p4.pColl
10d00 29 3b 0a 20 20 7d 0a 63 6f 6d 70 61 72 65 5f 6f  );.  }.compare_o
10d10 70 3a 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  p:.  switch( pOp
10d20 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ->opcode ){.    
10d30 63 61 73 65 20 4f 50 5f 45 71 3a 20 20 20 20 72  case OP_Eq:    r
10d40 65 73 32 20 3d 20 72 65 73 3d 3d 30 3b 20 20 20  es2 = res==0;   
10d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10d60 65 20 4f 50 5f 4e 65 3a 20 20 20 20 72 65 73 32  e OP_Ne:    res2
10d70 20 3d 20 72 65 73 3b 20 20 20 20 20 20 20 20 62   = res;        b
10d80 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f  reak;.    case O
10d90 50 5f 4c 74 3a 20 20 20 20 72 65 73 32 20 3d 20  P_Lt:    res2 = 
10da0 72 65 73 3c 30 3b 20 20 20 20 20 20 62 72 65 61  res<0;      brea
10db0 6b 3b 0a 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  k;.    case OP_L
10dc0 65 3a 20 20 20 20 72 65 73 32 20 3d 20 72 65 73  e:    res2 = res
10dd0 3c 3d 30 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  <=0;     break;.
10de0 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20      case OP_Gt: 
10df0 20 20 20 72 65 73 32 20 3d 20 72 65 73 3e 30 3b     res2 = res>0;
10e00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10e10 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
10e20 72 65 73 32 20 3d 20 72 65 73 3e 3d 30 3b 20 20  res2 = res>=0;  
10e30 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
10e40 20 2f 2a 20 55 6e 64 6f 20 61 6e 79 20 63 68 61   /* Undo any cha
10e50 6e 67 65 73 20 6d 61 64 65 20 62 79 20 61 70 70  nges made by app
10e60 6c 79 41 66 66 69 6e 69 74 79 28 29 20 74 6f 20  lyAffinity() to 
10e70 74 68 65 20 69 6e 70 75 74 20 72 65 67 69 73 74  the input regist
10e80 65 72 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ers. */.  assert
10e90 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  ( (pIn1->flags &
10ea0 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20 28 66 6c   MEM_Dyn) == (fl
10eb0 61 67 73 31 20 26 20 4d 45 4d 5f 44 79 6e 29 20  ags1 & MEM_Dyn) 
10ec0 29 3b 0a 20 20 70 49 6e 31 2d 3e 66 6c 61 67 73  );.  pIn1->flags
10ed0 20 3d 20 66 6c 61 67 73 31 3b 0a 20 20 61 73 73   = flags1;.  ass
10ee0 65 72 74 28 20 28 70 49 6e 33 2d 3e 66 6c 61 67  ert( (pIn3->flag
10ef0 73 20 26 20 4d 45 4d 5f 44 79 6e 29 20 3d 3d 20  s & MEM_Dyn) == 
10f00 28 66 6c 61 67 73 33 20 26 20 4d 45 4d 5f 44 79  (flags3 & MEM_Dy
10f10 6e 29 20 29 3b 0a 20 20 70 49 6e 33 2d 3e 66 6c  n) );.  pIn3->fl
10f20 61 67 73 20 3d 20 66 6c 61 67 73 33 3b 0a 0a 20  ags = flags3;.. 
10f30 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53   if( pOp->p5 & S
10f40 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b  QLITE_STOREP2 ){
10f50 0a 20 20 20 20 70 4f 75 74 20 3d 20 26 61 4d 65  .    pOut = &aMe
10f60 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  m[pOp->p2];.    
10f70 69 43 6f 6d 70 61 72 65 20 3d 20 72 65 73 3b 0a  iCompare = res;.
10f80 20 20 20 20 72 65 73 32 20 3d 20 72 65 73 32 21      res2 = res2!
10f90 3d 30 3b 20 20 2f 2a 20 46 6f 72 20 74 68 69 73  =0;  /* For this
10fa0 20 70 61 74 68 20 72 65 73 32 20 6d 75 73 74 20   path res2 must 
10fb0 62 65 20 65 78 61 63 74 6c 79 20 30 20 6f 72 20  be exactly 0 or 
10fc0 31 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4f  1 */.    if( (pO
10fd0 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45 5f 4b  p->p5 & SQLITE_K
10fe0 45 45 50 4e 55 4c 4c 29 21 3d 30 20 29 7b 0a 20  EEPNULL)!=0 ){. 
10ff0 20 20 20 20 20 2f 2a 20 54 68 65 20 4b 45 45 50       /* The KEEP
11000 4e 55 4c 4c 20 66 6c 61 67 20 70 72 65 76 65 6e  NULL flag preven
11010 74 73 20 4f 50 5f 45 71 20 66 72 6f 6d 20 6f 76  ts OP_Eq from ov
11020 65 72 77 72 69 74 69 6e 67 20 61 20 4e 55 4c 4c  erwriting a NULL
11030 20 77 69 74 68 20 31 0a 20 20 20 20 20 20 2a 2a   with 1.      **
11040 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 4f 50   and prevents OP
11050 5f 4e 65 20 66 72 6f 6d 20 6f 76 65 72 77 72 69  _Ne from overwri
11060 74 69 6e 67 20 4e 55 4c 4c 20 77 69 74 68 20 30  ting NULL with 0
11070 2e 20 20 54 68 69 73 20 66 6c 61 67 0a 20 20 20  .  This flag.   
11080 20 20 20 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73     ** is only us
11090 65 64 20 69 6e 20 63 6f 6e 74 65 78 74 73 20 77  ed in contexts w
110a0 68 65 72 65 20 65 69 74 68 65 72 3a 0a 20 20 20  here either:.   
110b0 20 20 20 2a 2a 20 20 20 28 31 29 20 6f 70 3d 3d     **   (1) op==
110c0 4f 50 5f 45 71 20 26 26 20 28 72 5b 50 32 5d 3d  OP_Eq && (r[P2]=
110d0 3d 4e 55 4c 4c 20 7c 7c 20 72 5b 50 32 5d 3d 3d  =NULL || r[P2]==
110e0 30 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 32  0).      **   (2
110f0 29 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 28  ) op==OP_Ne && (
11100 72 5b 50 32 5d 3d 3d 4e 55 4c 4c 20 7c 7c 20 72  r[P2]==NULL || r
11110 5b 50 32 5d 3d 3d 31 29 0a 20 20 20 20 20 20 2a  [P2]==1).      *
11120 2a 20 54 68 65 72 65 66 6f 72 65 20 69 74 20 69  * Therefore it i
11130 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
11140 74 6f 20 63 68 65 63 6b 20 74 68 65 20 63 6f 6e  to check the con
11150 74 65 6e 74 20 6f 66 20 72 5b 50 32 5d 20 66 6f  tent of r[P2] fo
11160 72 0a 20 20 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e  r.      ** NULL.
11170 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
11180 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
11190 50 5f 4e 65 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63  P_Ne || pOp->opc
111a0 6f 64 65 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  ode==OP_Eq );.  
111b0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 32      assert( res2
111c0 3d 3d 30 20 7c 7c 20 72 65 73 32 3d 3d 31 20 29  ==0 || res2==1 )
111d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
111e0 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70 4f 70  ( res2==0 && pOp
111f0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71 20  ->opcode==OP_Eq 
11200 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
11210 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20 70 4f  e( res2==1 && pO
11220 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 71  p->opcode==OP_Eq
11230 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11240 73 65 28 20 72 65 73 32 3d 3d 30 20 26 26 20 70  se( res2==0 && p
11250 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e  Op->opcode==OP_N
11260 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
11270 61 73 65 28 20 72 65 73 32 3d 3d 31 20 26 26 20  ase( res2==1 && 
11280 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
11290 4e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Ne );.      if( 
112a0 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
112b0 5f 45 71 29 3d 3d 72 65 73 32 20 29 20 62 72 65  _Eq)==res2 ) bre
112c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ak;.    }.    me
112d0 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
112e0 2c 20 70 4f 75 74 29 3b 0a 20 20 20 20 4d 65 6d  , pOut);.    Mem
112f0 53 65 74 54 79 70 65 46 6c 61 67 28 70 4f 75 74  SetTypeFlag(pOut
11300 2c 20 4d 45 4d 5f 49 6e 74 29 3b 0a 20 20 20 20  , MEM_Int);.    
11310 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 72 65 73 32  pOut->u.i = res2
11320 3b 0a 20 20 20 20 52 45 47 49 53 54 45 52 5f 54  ;.    REGISTER_T
11330 52 41 43 45 28 70 4f 70 2d 3e 70 32 2c 20 70 4f  RACE(pOp->p2, pO
11340 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
11350 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
11360 6e 28 72 65 73 21 3d 30 2c 20 28 70 4f 70 2d 3e  n(res!=0, (pOp->
11370 70 35 20 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  p5 & SQLITE_NULL
11380 45 51 29 3f 32 3a 33 29 3b 0a 20 20 20 20 69 66  EQ)?2:3);.    if
11390 28 20 72 65 73 32 20 29 7b 0a 20 20 20 20 20 20  ( res2 ){.      
113a0 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
113b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 72 65  .    }.  }.  bre
113c0 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
113d0 3a 20 45 6c 73 65 4e 6f 74 45 71 20 2a 20 50 32  : ElseNotEq * P2
113e0 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69   * * *.**.** Thi
113f0 73 20 6f 70 63 6f 64 65 20 6d 75 73 74 20 69 6d  s opcode must im
11400 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
11410 20 61 6e 20 4f 50 5f 4c 74 20 6f 72 20 4f 50 5f   an OP_Lt or OP_
11420 47 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Gt comparison op
11430 65 72 61 74 6f 72 2e 0a 2a 2a 20 49 66 20 72 65  erator..** If re
11440 73 75 6c 74 20 6f 66 20 61 6e 20 4f 50 5f 45 71  sult of an OP_Eq
11450 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 6e 20 74   comparison on t
11460 68 65 20 73 61 6d 65 20 74 77 6f 20 6f 70 65 72  he same two oper
11470 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  ands.** would ha
11480 76 65 20 62 65 20 4e 55 4c 4c 20 6f 72 20 66 61  ve be NULL or fa
11490 6c 73 65 20 28 30 29 2c 20 74 68 65 6e 20 74 68  lse (0), then th
114a0 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 20 0a  en jump to P2. .
114b0 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  ** If the result
114c0 20 6f 66 20 61 6e 20 4f 50 5f 45 71 20 63 6f 6d   of an OP_Eq com
114d0 70 61 72 69 73 6f 6e 20 6f 6e 20 74 68 65 20 74  parison on the t
114e0 77 6f 20 70 72 65 76 69 6f 75 73 20 6f 70 65 72  wo previous oper
114f0 61 6e 64 73 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  ands.** would ha
11500 76 65 20 62 65 65 6e 20 74 72 75 65 20 28 31 29  ve been true (1)
11510 2c 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  , then fall thro
11520 75 67 68 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ugh..*/.case OP_
11530 45 6c 73 65 4e 6f 74 45 71 3a 20 7b 20 20 20 20  ElseNotEq: {    
11540 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b     /* same as TK
11550 5f 45 53 43 41 50 45 2c 20 6a 75 6d 70 20 2a 2f  _ESCAPE, jump */
11560 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 3e 61  .  assert( pOp>a
11570 4f 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Op );.  assert( 
11580 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
11590 4f 50 5f 4c 74 20 7c 7c 20 70 4f 70 5b 2d 31 5d  OP_Lt || pOp[-1]
115a0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 47 74 20 29  .opcode==OP_Gt )
115b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b  ;.  assert( pOp[
115c0 2d 31 5d 2e 70 35 20 26 20 53 51 4c 49 54 45 5f  -1].p5 & SQLITE_
115d0 53 54 4f 52 45 50 32 20 29 3b 0a 20 20 56 64 62  STOREP2 );.  Vdb
115e0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 69 43 6f  eBranchTaken(iCo
115f0 6d 70 61 72 65 21 3d 30 2c 20 32 29 3b 0a 20 20  mpare!=0, 2);.  
11600 69 66 28 20 69 43 6f 6d 70 61 72 65 21 3d 30 20  if( iCompare!=0 
11610 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
11620 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a  2;.  break;.}...
11630 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 65 72 6d 75  /* Opcode: Permu
11640 74 61 74 69 6f 6e 20 2a 20 2a 20 2a 20 50 34 20  tation * * * P4 
11650 2a 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  *.**.** Set the 
11660 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
11670 20 62 79 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61   by the OP_Compa
11680 72 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  re operator to b
11690 65 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f  e the array.** o
116a0 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20 50 34  f integers in P4
116b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 6d  ..**.** The perm
116c0 75 74 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  utation is only 
116d0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
116e0 6e 65 78 74 20 4f 50 5f 43 6f 6d 70 61 72 65 20  next OP_Compare 
116f0 74 68 61 74 20 68 61 73 0a 2a 2a 20 74 68 65 20  that has.** the 
11700 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
11710 69 74 20 73 65 74 20 69 6e 20 50 35 2e 20 54 79  it set in P5. Ty
11720 70 69 63 61 6c 6c 79 20 74 68 65 20 4f 50 5f 50  pically the OP_P
11730 65 72 6d 75 74 61 74 69 6f 6e 20 73 68 6f 75 6c  ermutation shoul
11740 64 20 0a 2a 2a 20 6f 63 63 75 72 20 69 6d 6d 65  d .** occur imme
11750 64 69 61 74 65 6c 79 20 70 72 69 6f 72 20 74 6f  diately prior to
11760 20 74 68 65 20 4f 50 5f 43 6f 6d 70 61 72 65 2e   the OP_Compare.
11770 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
11780 20 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20   integer in the 
11790 50 34 20 69 6e 74 65 67 65 72 20 61 72 72 61 79  P4 integer array
117a0 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f   is the length o
117b0 66 20 74 68 65 20 61 72 72 61 79 0a 2a 2a 20 61  f the array.** a
117c0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 6f  nd does not beco
117d0 6d 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  me part of the p
117e0 65 72 6d 75 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  ermutation..*/.c
117f0 61 73 65 20 4f 50 5f 50 65 72 6d 75 74 61 74 69  ase OP_Permutati
11800 6f 6e 3a 20 7b 0a 20 20 61 73 73 65 72 74 28 20  on: {.  assert( 
11810 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
11820 49 4e 54 41 52 52 41 59 20 29 3b 0a 20 20 61 73  INTARRAY );.  as
11830 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 2e 61 69  sert( pOp->p4.ai
11840 20 29 3b 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   );.  aPermute =
11850 20 70 4f 70 2d 3e 70 34 2e 61 69 20 2b 20 31 3b   pOp->p4.ai + 1;
11860 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
11870 4f 70 63 6f 64 65 3a 20 43 6f 6d 70 61 72 65 20  Opcode: Compare 
11880 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a  P1 P2 P3 P4 P5.*
11890 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31  * Synopsis: r[P1
118a0 40 50 33 5d 20 3c 2d 3e 20 72 5b 50 32 40 50 33  @P3] <-> r[P2@P3
118b0 5d 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ].**.** Compare 
118c0 74 77 6f 20 76 65 63 74 6f 72 73 20 6f 66 20 72  two vectors of r
118d0 65 67 69 73 74 65 72 73 20 69 6e 20 72 65 67 28  egisters in reg(
118e0 50 31 29 2e 2e 72 65 67 28 50 31 2b 50 33 2d 31  P1)..reg(P1+P3-1
118f0 29 20 28 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  ) (call this.** 
11900 76 65 63 74 6f 72 20 22 41 22 29 20 61 6e 64 20  vector "A") and 
11910 69 6e 20 72 65 67 28 50 32 29 2e 2e 72 65 67 28  in reg(P2)..reg(
11920 50 32 2b 50 33 2d 31 29 20 28 22 42 22 29 2e 20  P2+P3-1) ("B"). 
11930 20 53 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   Save the result
11940 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61   of.** the compa
11950 72 69 73 6f 6e 20 66 6f 72 20 75 73 65 20 62 79  rison for use by
11960 20 74 68 65 20 6e 65 78 74 20 4f 50 5f 4a 75 6d   the next OP_Jum
11970 70 20 69 6e 73 74 72 75 63 74 2e 0a 2a 2a 0a 2a  p instruct..**.*
11980 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
11990 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 20 62  OPFLAG_PERMUTE b
119a0 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
119b0 20 6f 72 64 65 72 20 6f 66 20 63 6f 6d 70 61 72   order of compar
119c0 69 73 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 72  ison is.** deter
119d0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6d 6f 73  mined by the mos
119e0 74 20 72 65 63 65 6e 74 20 4f 50 5f 50 65 72 6d  t recent OP_Perm
119f0 75 74 61 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  utation operator
11a00 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 4f 50 46  .  If the.** OPF
11a10 4c 41 47 5f 50 45 52 4d 55 54 45 20 62 69 74 20  LAG_PERMUTE bit 
11a20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 72  is clear, then r
11a30 65 67 69 73 74 65 72 20 61 72 65 20 63 6f 6d 70  egister are comp
11a40 61 72 65 64 20 69 6e 20 73 65 71 75 65 6e 74 69  ared in sequenti
11a50 61 6c 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2a 0a  al.** order..**.
11a60 2a 2a 20 50 34 20 69 73 20 61 20 4b 65 79 49 6e  ** P4 is a KeyIn
11a70 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
11a80 74 20 64 65 66 69 6e 65 73 20 63 6f 6c 6c 61 74  t defines collat
11a90 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 61 6e  ing sequences an
11aa0 64 20 73 6f 72 74 0a 2a 2a 20 6f 72 64 65 72 73  d sort.** orders
11ab0 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
11ac0 73 6f 6e 2e 20 20 54 68 65 20 70 65 72 6d 75 74  son.  The permut
11ad0 61 74 69 6f 6e 20 61 70 70 6c 69 65 73 20 74 6f  ation applies to
11ae0 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 6f 6e   registers.** on
11af0 6c 79 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ly.  The KeyInfo
11b00 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 75 73   elements are us
11b10 65 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 2e  ed sequentially.
11b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61  .**.** The compa
11b30 72 69 73 6f 6e 20 69 73 20 61 20 73 6f 72 74 20  rison is a sort 
11b40 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 73 6f 20 4e  comparison, so N
11b50 55 4c 4c 73 20 63 6f 6d 70 61 72 65 20 65 71 75  ULLs compare equ
11b60 61 6c 2c 0a 2a 2a 20 4e 55 4c 4c 73 20 61 72 65  al,.** NULLs are
11b70 20 6c 65 73 73 20 74 68 61 6e 20 6e 75 6d 62 65   less than numbe
11b80 72 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20  rs, numbers are 
11b90 6c 65 73 73 20 74 68 61 6e 20 73 74 72 69 6e 67  less than string
11ba0 73 2c 0a 2a 2a 20 61 6e 64 20 73 74 72 69 6e 67  s,.** and string
11bb0 73 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  s are less than 
11bc0 62 6c 6f 62 73 2e 0a 2a 2f 0a 63 61 73 65 20 4f  blobs..*/.case O
11bd0 50 5f 43 6f 6d 70 61 72 65 3a 20 7b 0a 20 20 69  P_Compare: {.  i
11be0 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt n;.  int i;. 
11bf0 20 69 6e 74 20 70 31 3b 0a 20 20 69 6e 74 20 70   int p1;.  int p
11c00 32 3b 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  2;.  const KeyIn
11c10 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
11c20 69 6e 74 20 69 64 78 3b 0a 20 20 43 6f 6c 6c 53  int idx;.  CollS
11c30 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
11c40 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
11c50 6e 63 65 20 74 6f 20 75 73 65 20 6f 6e 20 74 68  nce to use on th
11c60 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  is term */.  int
11c70 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
11c80 2f 2a 20 54 72 75 65 20 66 6f 72 20 44 45 53 43  /* True for DESC
11c90 45 4e 44 49 4e 47 20 73 6f 72 74 20 6f 72 64 65  ENDING sort orde
11ca0 72 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 4f 70  r */..  if( (pOp
11cb0 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 45  ->p5 & OPFLAG_PE
11cc0 52 4d 55 54 45 29 3d 3d 30 20 29 20 61 50 65 72  RMUTE)==0 ) aPer
11cd0 6d 75 74 65 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  mute = 0;.  n = 
11ce0 70 4f 70 2d 3e 70 33 3b 0a 20 20 70 4b 65 79 49  pOp->p3;.  pKeyI
11cf0 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
11d00 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74  eyInfo;.  assert
11d10 28 20 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ( n>0 );.  asser
11d20 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
11d30 3b 0a 20 20 70 31 20 3d 20 70 4f 70 2d 3e 70 31  ;.  p1 = pOp->p1
11d40 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70 32  ;.  p2 = pOp->p2
11d50 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ;.#if SQLITE_DEB
11d60 55 47 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  UG.  if( aPermut
11d70 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 2c 20  e ){.    int k, 
11d80 6d 78 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  mx = 0;.    for(
11d90 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 20 69  k=0; k<n; k++) i
11da0 66 28 20 61 50 65 72 6d 75 74 65 5b 6b 5d 3e 6d  f( aPermute[k]>m
11db0 78 20 29 20 6d 78 20 3d 20 61 50 65 72 6d 75 74  x ) mx = aPermut
11dc0 65 5b 6b 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e[k];.    assert
11dd0 28 20 70 31 3e 30 20 26 26 20 70 31 2b 6d 78 3c  ( p1>0 && p1+mx<
11de0 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d  =(p->nMem+1 - p-
11df0 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20  >nCursor)+1 );. 
11e00 20 20 20 61 73 73 65 72 74 28 20 70 32 3e 30 20     assert( p2>0 
11e10 26 26 20 70 32 2b 6d 78 3c 3d 28 70 2d 3e 6e 4d  && p2+mx<=(p->nM
11e20 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f  em+1 - p->nCurso
11e30 72 29 2b 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  r)+1 );.  }else{
11e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e  .    assert( p1>
11e50 30 20 26 26 20 70 31 2b 6e 3c 3d 28 70 2d 3e 6e  0 && p1+n<=(p->n
11e60 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
11e70 6f 72 29 2b 31 20 29 3b 0a 20 20 20 20 61 73 73  or)+1 );.    ass
11e80 65 72 74 28 20 70 32 3e 30 20 26 26 20 70 32 2b  ert( p2>0 && p2+
11e90 6e 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20  n<=(p->nMem+1 - 
11ea0 70 2d 3e 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b  p->nCursor)+1 );
11eb0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
11ec0 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 20  QLITE_DEBUG */. 
11ed0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
11ee0 2b 2b 29 7b 0a 20 20 20 20 69 64 78 20 3d 20 61  ++){.    idx = a
11ef0 50 65 72 6d 75 74 65 20 3f 20 61 50 65 72 6d 75  Permute ? aPermu
11f00 74 65 5b 69 5d 20 3a 20 69 3b 0a 20 20 20 20 61  te[i] : i;.    a
11f10 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
11f20 64 28 26 61 4d 65 6d 5b 70 31 2b 69 64 78 5d 29  d(&aMem[p1+idx])
11f30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11f40 6d 65 6d 49 73 56 61 6c 69 64 28 26 61 4d 65 6d  memIsValid(&aMem
11f50 5b 70 32 2b 69 64 78 5d 29 20 29 3b 0a 20 20 20  [p2+idx]) );.   
11f60 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
11f70 70 31 2b 69 64 78 2c 20 26 61 4d 65 6d 5b 70 31  p1+idx, &aMem[p1
11f80 2b 69 64 78 5d 29 3b 0a 20 20 20 20 52 45 47 49  +idx]);.    REGI
11f90 53 54 45 52 5f 54 52 41 43 45 28 70 32 2b 69 64  STER_TRACE(p2+id
11fa0 78 2c 20 26 61 4d 65 6d 5b 70 32 2b 69 64 78 5d  x, &aMem[p2+idx]
11fb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
11fc0 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  <pKeyInfo->nFiel
11fd0 64 20 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  d );.    pColl =
11fe0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
11ff0 5b 69 5d 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  [i];.    bRev = 
12000 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
12010 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 69 43 6f  rder[i];.    iCo
12020 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 4d  mpare = sqlite3M
12030 65 6d 43 6f 6d 70 61 72 65 28 26 61 4d 65 6d 5b  emCompare(&aMem[
12040 70 31 2b 69 64 78 5d 2c 20 26 61 4d 65 6d 5b 70  p1+idx], &aMem[p
12050 32 2b 69 64 78 5d 2c 20 70 43 6f 6c 6c 29 3b 0a  2+idx], pColl);.
12060 20 20 20 20 69 66 28 20 69 43 6f 6d 70 61 72 65      if( iCompare
12070 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 52   ){.      if( bR
12080 65 76 20 29 20 69 43 6f 6d 70 61 72 65 20 3d 20  ev ) iCompare = 
12090 2d 69 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  -iCompare;.     
120a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
120b0 7d 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 30  }.  aPermute = 0
120c0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
120d0 20 4f 70 63 6f 64 65 3a 20 4a 75 6d 70 20 50 31   Opcode: Jump P1
120e0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
120f0 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 69 6e 73   Jump to the ins
12100 74 72 75 63 74 69 6f 6e 20 61 74 20 61 64 64 72  truction at addr
12110 65 73 73 20 50 31 2c 20 50 32 2c 20 6f 72 20 50  ess P1, P2, or P
12120 33 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  3 depending on w
12130 68 65 74 68 65 72 0a 2a 2a 20 69 6e 20 74 68 65  hether.** in the
12140 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 4f 50 5f   most recent OP_
12150 43 6f 6d 70 61 72 65 20 69 6e 73 74 72 75 63 74  Compare instruct
12160 69 6f 6e 20 74 68 65 20 50 31 20 76 65 63 74 6f  ion the P1 vecto
12170 72 20 77 61 73 20 6c 65 73 73 20 74 68 61 6e 0a  r was less than.
12180 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
12190 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
121a0 20 50 32 20 76 65 63 74 6f 72 2c 20 72 65 73 70   P2 vector, resp
121b0 65 63 74 69 76 65 6c 79 2e 0a 2a 2f 0a 63 61 73  ectively..*/.cas
121c0 65 20 4f 50 5f 4a 75 6d 70 3a 20 7b 20 20 20 20  e OP_Jump: {    
121d0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
121e0 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6d 70 61   */.  if( iCompa
121f0 72 65 3c 30 20 29 7b 0a 20 20 20 20 56 64 62 65  re<0 ){.    Vdbe
12200 42 72 61 6e 63 68 54 61 6b 65 6e 28 30 2c 33 29  BranchTaken(0,3)
12210 3b 20 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70  ; pOp = &aOp[pOp
12220 2d 3e 70 31 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c  ->p1 - 1];.  }el
12230 73 65 20 69 66 28 20 69 43 6f 6d 70 61 72 65 3d  se if( iCompare=
12240 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 42 72  =0 ){.    VdbeBr
12250 61 6e 63 68 54 61 6b 65 6e 28 31 2c 33 29 3b 20  anchTaken(1,3); 
12260 70 4f 70 20 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e  pOp = &aOp[pOp->
12270 70 32 20 2d 20 31 5d 3b 0a 20 20 7d 65 6c 73 65  p2 - 1];.  }else
12280 7b 0a 20 20 20 20 56 64 62 65 42 72 61 6e 63 68  {.    VdbeBranch
12290 54 61 6b 65 6e 28 32 2c 33 29 3b 20 70 4f 70 20  Taken(2,3); pOp 
122a0 3d 20 26 61 4f 70 5b 70 4f 70 2d 3e 70 33 20 2d  = &aOp[pOp->p3 -
122b0 20 31 5d 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b   1];.  }.  break
122c0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
122d0 41 6e 64 20 50 31 20 50 32 20 50 33 20 2a 20 2a  And P1 P2 P3 * *
122e0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
122f0 50 33 5d 3d 28 72 5b 50 31 5d 20 26 26 20 72 5b  P3]=(r[P1] && r[
12300 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
12310 74 68 65 20 6c 6f 67 69 63 61 6c 20 41 4e 44 20  the logical AND 
12320 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  of the values in
12330 20 72 65 67 69 73 74 65 72 73 20 50 31 20 61 6e   registers P1 an
12340 64 20 50 32 20 61 6e 64 0a 2a 2a 20 77 72 69 74  d P2 and.** writ
12350 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74  e the result int
12360 6f 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a 2a  o register P3..*
12370 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 50  *.** If either P
12380 31 20 6f 72 20 50 32 20 69 73 20 30 20 28 66 61  1 or P2 is 0 (fa
12390 6c 73 65 29 20 74 68 65 6e 20 74 68 65 20 72 65  lse) then the re
123a0 73 75 6c 74 20 69 73 20 30 20 65 76 65 6e 20 69  sult is 0 even i
123b0 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 69  f.** the other i
123c0 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 20 20 41  nput is NULL.  A
123d0 20 4e 55 4c 4c 20 61 6e 64 20 74 72 75 65 20 6f   NULL and true o
123e0 72 20 74 77 6f 20 4e 55 4c 4c 73 20 67 69 76 65  r two NULLs give
123f0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 6f 75 74 70 75  .** a NULL outpu
12400 74 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  t..*/./* Opcode:
12410 20 4f 72 20 50 31 20 50 32 20 50 33 20 2a 20 2a   Or P1 P2 P3 * *
12420 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b  .** Synopsis: r[
12430 50 33 5d 3d 28 72 5b 50 31 5d 20 7c 7c 20 72 5b  P3]=(r[P1] || r[
12440 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 54 61 6b 65 20  P2]).**.** Take 
12450 74 68 65 20 6c 6f 67 69 63 61 6c 20 4f 52 20 6f  the logical OR o
12460 66 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  f the values in 
12470 72 65 67 69 73 74 65 72 20 50 31 20 61 6e 64 20  register P1 and 
12480 50 32 20 61 6e 64 0a 2a 2a 20 73 74 6f 72 65 20  P2 and.** store 
12490 74 68 65 20 61 6e 73 77 65 72 20 69 6e 20 72 65  the answer in re
124a0 67 69 73 74 65 72 20 50 33 2e 0a 2a 2a 0a 2a 2a  gister P3..**.**
124b0 20 49 66 20 65 69 74 68 65 72 20 50 31 20 6f 72   If either P1 or
124c0 20 50 32 20 69 73 20 6e 6f 6e 7a 65 72 6f 20 28   P2 is nonzero (
124d0 74 72 75 65 29 20 74 68 65 6e 20 74 68 65 20 72  true) then the r
124e0 65 73 75 6c 74 20 69 73 20 31 20 28 74 72 75 65  esult is 1 (true
124f0 29 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ).** even if the
12500 20 6f 74 68 65 72 20 69 6e 70 75 74 20 69 73 20   other input is 
12510 4e 55 4c 4c 2e 20 20 41 20 4e 55 4c 4c 20 61 6e  NULL.  A NULL an
12520 64 20 66 61 6c 73 65 20 6f 72 20 74 77 6f 20 4e  d false or two N
12530 55 4c 4c 73 0a 2a 2a 20 67 69 76 65 20 61 20 4e  ULLs.** give a N
12540 55 4c 4c 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 63  ULL output..*/.c
12550 61 73 65 20 4f 50 5f 41 6e 64 3a 20 20 20 20 20  ase OP_And:     
12560 20 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65           /* same
12570 20 61 73 20 54 4b 5f 41 4e 44 2c 20 69 6e 31 2c   as TK_AND, in1,
12580 20 69 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 63 61   in2, out3 */.ca
12590 73 65 20 4f 50 5f 4f 72 3a 20 7b 20 20 20 20 20  se OP_Or: {     
125a0 20 20 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20          /* same 
125b0 61 73 20 54 4b 5f 4f 52 2c 20 69 6e 31 2c 20 69  as TK_OR, in1, i
125c0 6e 32 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69 6e  n2, out3 */.  in
125d0 74 20 76 31 3b 20 20 20 20 2f 2a 20 4c 65 66 74  t v1;    /* Left
125e0 20 6f 70 65 72 61 6e 64 3a 20 20 30 3d 3d 46 41   operand:  0==FA
125f0 4c 53 45 2c 20 31 3d 3d 54 52 55 45 2c 20 32 3d  LSE, 1==TRUE, 2=
12600 3d 55 4e 4b 4e 4f 57 4e 20 6f 72 20 4e 55 4c 4c  =UNKNOWN or NULL
12610 20 2a 2f 0a 20 20 69 6e 74 20 76 32 3b 20 20 20   */.  int v2;   
12620 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61 6e   /* Right operan
12630 64 3a 20 30 3d 3d 46 41 4c 53 45 2c 20 31 3d 3d  d: 0==FALSE, 1==
12640 54 52 55 45 2c 20 32 3d 3d 55 4e 4b 4e 4f 57 4e  TRUE, 2==UNKNOWN
12650 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 70   or NULL */..  p
12660 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
12670 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70 49 6e 31  >p1];.  if( pIn1
12680 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
12690 6c 6c 20 29 7b 0a 20 20 20 20 76 31 20 3d 20 32  ll ){.    v1 = 2
126a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
126b0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49  1 = sqlite3VdbeI
126c0 6e 74 56 61 6c 75 65 28 70 49 6e 31 29 21 3d 30  ntValue(pIn1)!=0
126d0 3b 0a 20 20 7d 0a 20 20 70 49 6e 32 20 3d 20 26  ;.  }.  pIn2 = &
126e0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
126f0 20 69 66 28 20 70 49 6e 32 2d 3e 66 6c 61 67 73   if( pIn2->flags
12700 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
12710 20 20 20 76 32 20 3d 20 32 3b 0a 20 20 7d 65 6c     v2 = 2;.  }el
12720 73 65 7b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c  se{.    v2 = sql
12730 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75 65  ite3VdbeIntValue
12740 28 70 49 6e 32 29 21 3d 30 3b 0a 20 20 7d 0a 20  (pIn2)!=0;.  }. 
12750 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
12760 3d 3d 4f 50 5f 41 6e 64 20 29 7b 0a 20 20 20 20  ==OP_And ){.    
12770 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
12780 69 67 6e 65 64 20 63 68 61 72 20 61 6e 64 5f 6c  igned char and_l
12790 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 30 2c  ogic[] = { 0, 0,
127a0 20 30 2c 20 30 2c 20 31 2c 20 32 2c 20 30 2c 20   0, 0, 1, 2, 0, 
127b0 32 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20 3d  2, 2 };.    v1 =
127c0 20 61 6e 64 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b   and_logic[v1*3+
127d0 76 32 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  v2];.  }else{.  
127e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
127f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 72 5f  nsigned char or_
12800 6c 6f 67 69 63 5b 5d 20 3d 20 7b 20 30 2c 20 31  logic[] = { 0, 1
12810 2c 20 32 2c 20 31 2c 20 31 2c 20 31 2c 20 32 2c  , 2, 1, 1, 1, 2,
12820 20 31 2c 20 32 20 7d 3b 0a 20 20 20 20 76 31 20   1, 2 };.    v1 
12830 3d 20 6f 72 5f 6c 6f 67 69 63 5b 76 31 2a 33 2b  = or_logic[v1*3+
12840 76 32 5d 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 20  v2];.  }.  pOut 
12850 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
12860 3b 0a 20 20 69 66 28 20 76 31 3d 3d 32 20 29 7b  ;.  if( v1==2 ){
12870 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
12880 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 4e 75  lag(pOut, MEM_Nu
12890 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
128a0 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 76 31    pOut->u.i = v1
128b0 3b 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  ;.    MemSetType
128c0 46 6c 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 49  Flag(pOut, MEM_I
128d0 6e 74 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  nt);.  }.  break
128e0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
128f0 4e 6f 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Not P1 P2 * * *.
12900 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50  ** Synopsis: r[P
12910 32 5d 3d 20 21 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a  2]= !r[P1].**.**
12920 20 49 6e 74 65 72 70 72 65 74 20 74 68 65 20 76   Interpret the v
12930 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74 65 72  alue in register
12940 20 50 31 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e   P1 as a boolean
12950 20 76 61 6c 75 65 2e 20 20 53 74 6f 72 65 20 74   value.  Store t
12960 68 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 63 6f  he.** boolean co
12970 6d 70 6c 65 6d 65 6e 74 20 69 6e 20 72 65 67 69  mplement in regi
12980 73 74 65 72 20 50 32 2e 20 20 49 66 20 74 68 65  ster P2.  If the
12990 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69 73 74   value in regist
129a0 65 72 20 50 31 20 69 73 20 0a 2a 2a 20 4e 55 4c  er P1 is .** NUL
129b0 4c 2c 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 69  L, then a NULL i
129c0 73 20 73 74 6f 72 65 64 20 69 6e 20 50 32 2e 0a  s stored in P2..
129d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 3a 20  */.case OP_Not: 
129e0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
129f0 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e   /* same as TK_N
12a00 4f 54 2c 20 69 6e 31 2c 20 6f 75 74 32 20 2a 2f  OT, in1, out2 */
12a10 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
12a20 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 4f 75 74  pOp->p1];.  pOut
12a30 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
12a40 5d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ];.  sqlite3Vdbe
12a50 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 4f 75 74 29  MemSetNull(pOut)
12a60 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
12a70 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
12a80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ==0 ){.    pOut-
12a90 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
12aa0 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  ;.    pOut->u.i 
12ab0 3d 20 21 73 71 6c 69 74 65 33 56 64 62 65 49 6e  = !sqlite3VdbeIn
12ac0 74 56 61 6c 75 65 28 70 49 6e 31 29 3b 0a 20 20  tValue(pIn1);.  
12ad0 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
12ae0 20 4f 70 63 6f 64 65 3a 20 42 69 74 4e 6f 74 20   Opcode: BitNot 
12af0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
12b00 79 6e 6f 70 73 69 73 3a 20 72 5b 50 31 5d 3d 20  ynopsis: r[P1]= 
12b10 7e 72 5b 50 31 5d 0a 2a 2a 0a 2a 2a 20 49 6e 74  ~r[P1].**.** Int
12b20 65 72 70 72 65 74 20 74 68 65 20 63 6f 6e 74 65  erpret the conte
12b30 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
12b40 31 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  1 as an integer.
12b50 20 20 53 74 6f 72 65 20 74 68 65 0a 2a 2a 20 6f    Store the.** o
12b60 6e 65 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f  nes-complement o
12b70 66 20 74 68 65 20 50 31 20 76 61 6c 75 65 20 69  f the P1 value i
12b80 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e  nto register P2.
12b90 20 20 49 66 20 50 31 20 68 6f 6c 64 73 0a 2a 2a    If P1 holds.**
12ba0 20 61 20 4e 55 4c 4c 20 74 68 65 6e 20 73 74 6f   a NULL then sto
12bb0 72 65 20 61 20 4e 55 4c 4c 20 69 6e 20 50 32 2e  re a NULL in P2.
12bc0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 42 69 74 4e  .*/.case OP_BitN
12bd0 6f 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ot: {           
12be0 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f    /* same as TK_
12bf0 42 49 54 4e 4f 54 2c 20 69 6e 31 2c 20 6f 75 74  BITNOT, in1, out
12c00 32 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61  2 */.  pIn1 = &a
12c10 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Mem[pOp->p1];.  
12c20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pOut = &aMem[pOp
12c30 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2];.  sqlite3
12c40 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70  VdbeMemSetNull(p
12c50 4f 75 74 29 3b 0a 20 20 69 66 28 20 28 70 49 6e  Out);.  if( (pIn
12c60 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  1->flags & MEM_N
12c70 75 6c 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ull)==0 ){.    p
12c80 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Out->flags = MEM
12c90 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  _Int;.    pOut->
12ca0 75 2e 69 20 3d 20 7e 73 71 6c 69 74 65 33 56 64  u.i = ~sqlite3Vd
12cb0 62 65 49 6e 74 56 61 6c 75 65 28 70 49 6e 31 29  beIntValue(pIn1)
12cc0 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
12cd0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 6e 63  ../* Opcode: Onc
12ce0 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
12cf0 0a 2a 2a 20 49 66 20 74 68 65 20 50 31 20 76 61  .** If the P1 va
12d00 6c 75 65 20 69 73 20 65 71 75 61 6c 20 74 6f 20  lue is equal to 
12d10 74 68 65 20 50 31 20 76 61 6c 75 65 20 6f 6e 20  the P1 value on 
12d20 74 68 65 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f  the OP_Init opco
12d30 64 65 20 61 74 0a 2a 2a 20 69 6e 73 74 72 75 63  de at.** instruc
12d40 74 69 6f 6e 20 30 2c 20 74 68 65 6e 20 6a 75 6d  tion 0, then jum
12d50 70 20 74 6f 20 50 32 2e 20 20 49 66 20 74 68 65  p to P2.  If the
12d60 20 74 77 6f 20 50 31 20 76 61 6c 75 65 73 20 64   two P1 values d
12d70 69 66 66 65 72 2c 20 74 68 65 6e 0a 2a 2a 20 73  iffer, then.** s
12d80 65 74 20 74 68 65 20 50 31 20 76 61 6c 75 65 20  et the P1 value 
12d90 6f 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74  on this opcode t
12da0 6f 20 65 71 75 61 6c 20 74 68 65 20 50 31 20 76  o equal the P1 v
12db0 61 6c 75 65 20 6f 6e 20 74 68 65 20 4f 50 5f 49  alue on the OP_I
12dc0 6e 69 74 0a 2a 2a 20 61 6e 64 20 66 61 6c 6c 20  nit.** and fall 
12dd0 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 63 61 73 65  through..*/.case
12de0 20 4f 50 5f 4f 6e 63 65 3a 20 7b 20 20 20 20 20   OP_Once: {     
12df0 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20          /* jump 
12e00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
12e10 61 4f 70 5b 30 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  aOp[0].opcode==O
12e20 50 5f 49 6e 69 74 20 29 3b 0a 20 20 56 64 62 65  P_Init );.  Vdbe
12e30 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e 61  BranchTaken(p->a
12e40 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e 70  Op[0].p1==pOp->p
12e50 31 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 2d 3e  1, 2);.  if( p->
12e60 61 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 2d 3e  aOp[0].p1==pOp->
12e70 70 31 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a  p1 ){.    goto j
12e80 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c  ump_to_p2;.  }el
12e90 73 65 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 31 20  se{.    pOp->p1 
12ea0 3d 20 70 2d 3e 61 4f 70 5b 30 5d 2e 70 31 3b 0a  = p->aOp[0].p1;.
12eb0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
12ec0 2f 2a 20 4f 70 63 6f 64 65 3a 20 49 66 20 50 31  /* Opcode: If P1
12ed0 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a   P2 P3 * *.**.**
12ee0 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20 74   Jump to P2 if t
12ef0 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  he value in regi
12f00 73 74 65 72 20 50 31 20 69 73 20 74 72 75 65 2e  ster P1 is true.
12f10 20 20 54 68 65 20 76 61 6c 75 65 0a 2a 2a 20 69    The value.** i
12f20 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 72 75  s considered tru
12f30 65 20 69 66 20 69 74 20 69 73 20 6e 75 6d 65 72  e if it is numer
12f40 69 63 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 2e  ic and non-zero.
12f50 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a    If the value.*
12f60 2a 20 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20  * in P1 is NULL 
12f70 74 68 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75  then take the ju
12f80 6d 70 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  mp if and only i
12f90 66 20 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f P3 is non-zero
12fa0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
12fb0 49 66 4e 6f 74 20 50 31 20 50 32 20 50 33 20 2a  IfNot P1 P2 P3 *
12fc0 20 2a 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f   *.**.** Jump to
12fd0 20 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65   P2 if the value
12fe0 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20   in register P1 
12ff0 69 73 20 46 61 6c 73 65 2e 20 20 54 68 65 20 76  is False.  The v
13000 61 6c 75 65 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  alue.** is consi
13010 64 65 72 65 64 20 66 61 6c 73 65 20 69 66 20 69  dered false if i
13020 74 20 68 61 73 20 61 20 6e 75 6d 65 72 69 63 20  t has a numeric 
13030 76 61 6c 75 65 20 6f 66 20 7a 65 72 6f 2e 20 20  value of zero.  
13040 49 66 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  If the value.** 
13050 69 6e 20 50 31 20 69 73 20 4e 55 4c 4c 20 74 68  in P1 is NULL th
13060 65 6e 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  en take the jump
13070 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
13080 50 33 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  P3 is non-zero..
13090 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 66 3a 20 20  */.case OP_If:  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
130b0 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 63  * jump, in1 */.c
130c0 61 73 65 20 4f 50 5f 49 66 4e 6f 74 3a 20 7b 20  ase OP_IfNot: { 
130d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75             /* ju
130e0 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 69 6e 74  mp, in1 */.  int
130f0 20 63 3b 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d   c;.  pIn1 = &aM
13100 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69  em[pOp->p1];.  i
13110 66 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26  f( pIn1->flags &
13120 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
13130 20 63 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20   c = pOp->p3;.  
13140 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
13150 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
13160 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 20 3d  NG_POINT.    c =
13170 20 73 71 6c 69 74 65 33 56 64 62 65 49 6e 74 56   sqlite3VdbeIntV
13180 61 6c 75 65 28 70 49 6e 31 29 21 3d 30 3b 0a 23  alue(pIn1)!=0;.#
13190 65 6c 73 65 0a 20 20 20 20 63 20 3d 20 73 71 6c  else.    c = sql
131a0 69 74 65 33 56 64 62 65 52 65 61 6c 56 61 6c 75  ite3VdbeRealValu
131b0 65 28 70 49 6e 31 29 21 3d 30 2e 30 3b 0a 23 65  e(pIn1)!=0.0;.#e
131c0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4f 70  ndif.    if( pOp
131d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66 4e  ->opcode==OP_IfN
131e0 6f 74 20 29 20 63 20 3d 20 21 63 3b 0a 20 20 7d  ot ) c = !c;.  }
131f0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13200 65 6e 28 63 21 3d 30 2c 20 32 29 3b 0a 20 20 69  en(c!=0, 2);.  i
13210 66 28 20 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  f( c ){.    goto
13220 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d   jump_to_p2;.  }
13230 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
13240 4f 70 63 6f 64 65 3a 20 49 73 4e 75 6c 6c 20 50  Opcode: IsNull P
13250 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
13260 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b 50 31 5d  nopsis: if r[P1]
13270 3d 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50 32 0a 2a  ==NULL goto P2.*
13280 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20  *.** Jump to P2 
13290 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  if the value in 
132a0 72 65 67 69 73 74 65 72 20 50 31 20 69 73 20 4e  register P1 is N
132b0 55 4c 4c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ULL..*/.case OP_
132c0 49 73 4e 75 6c 6c 3a 20 7b 20 20 20 20 20 20 20  IsNull: {       
132d0 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20       /* same as 
132e0 54 4b 5f 49 53 4e 55 4c 4c 2c 20 6a 75 6d 70 2c  TK_ISNULL, jump,
132f0 20 69 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d   in1 */.  pIn1 =
13300 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b   &aMem[pOp->p1];
13310 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
13320 65 6e 28 20 28 70 49 6e 31 2d 3e 66 6c 61 67 73  en( (pIn1->flags
13330 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 21 3d 30 2c   & MEM_Null)!=0,
13340 20 32 29 3b 0a 20 20 69 66 28 20 28 70 49 6e 31   2);.  if( (pIn1
13350 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
13360 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ll)!=0 ){.    go
13370 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
13380 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
13390 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 74 4e 75 6c  * Opcode: NotNul
133a0 6c 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  l P1 P2 * * *.**
133b0 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 72 5b   Synopsis: if r[
133c0 50 31 5d 21 3d 4e 55 4c 4c 20 67 6f 74 6f 20 50  P1]!=NULL goto P
133d0 32 0a 2a 2a 0a 2a 2a 20 4a 75 6d 70 20 74 6f 20  2.**.** Jump to 
133e0 50 32 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  P2 if the value 
133f0 69 6e 20 72 65 67 69 73 74 65 72 20 50 31 20 69  in register P1 i
13400 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 0a 2a 2f  s not NULL.  .*/
13410 0a 63 61 73 65 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  .case OP_NotNull
13420 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f  : {            /
13430 2a 20 73 61 6d 65 20 61 73 20 54 4b 5f 4e 4f 54  * same as TK_NOT
13440 4e 55 4c 4c 2c 20 6a 75 6d 70 2c 20 69 6e 31 20  NULL, jump, in1 
13450 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65  */.  pIn1 = &aMe
13460 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 56 64  m[pOp->p1];.  Vd
13470 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 20 28  beBranchTaken( (
13480 70 49 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pIn1->flags & ME
13490 4d 5f 4e 75 6c 6c 29 3d 3d 30 2c 20 32 29 3b 0a  M_Null)==0, 2);.
134a0 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66 6c 61    if( (pIn1->fla
134b0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
134c0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  0 ){.    goto ju
134d0 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20  mp_to_p2;.  }.  
134e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
134f0 6f 64 65 3a 20 43 6f 6c 75 6d 6e 20 50 31 20 50  ode: Column P1 P
13500 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
13510 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 50 58  nopsis: r[P3]=PX
13520 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  .**.** Interpret
13530 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 63   the data that c
13540 75 72 73 6f 72 20 50 31 20 70 6f 69 6e 74 73 20  ursor P1 points 
13550 74 6f 20 61 73 20 61 20 73 74 72 75 63 74 75 72  to as a structur
13560 65 20 62 75 69 6c 74 20 75 73 69 6e 67 0a 2a 2a  e built using.**
13570 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72 64 20   the MakeRecord 
13580 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 28 53  instruction.  (S
13590 65 65 20 74 68 65 20 4d 61 6b 65 52 65 63 6f 72  ee the MakeRecor
135a0 64 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 64 64  d opcode for add
135b0 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f 72  itional.** infor
135c0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
135d0 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 64   format of the d
135e0 61 74 61 2e 29 20 20 45 78 74 72 61 63 74 20 74  ata.)  Extract t
135f0 68 65 20 50 32 2d 74 68 20 63 6f 6c 75 6d 6e 0a  he P2-th column.
13600 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 72 65 63  ** from this rec
13610 6f 72 64 2e 20 20 49 66 20 74 68 65 72 65 20 61  ord.  If there a
13620 72 65 20 6c 65 73 73 20 74 68 61 74 20 28 50 32  re less that (P2
13630 2b 31 29 20 0a 2a 2a 20 76 61 6c 75 65 73 20 69  +1) .** values i
13640 6e 20 74 68 65 20 72 65 63 6f 72 64 2c 20 65 78  n the record, ex
13650 74 72 61 63 74 20 61 20 4e 55 4c 4c 2e 0a 2a 2a  tract a NULL..**
13660 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 65 78  .** The value ex
13670 74 72 61 63 74 65 64 20 69 73 20 73 74 6f 72 65  tracted is store
13680 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 33  d in register P3
13690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
136a0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 66  olumn contains f
136b0 65 77 65 72 20 74 68 61 6e 20 50 32 20 66 69 65  ewer than P2 fie
136c0 6c 64 73 2c 20 74 68 65 6e 20 65 78 74 72 61 63  lds, then extrac
136d0 74 20 61 20 4e 55 4c 4c 2e 20 20 4f 72 2c 0a 2a  t a NULL.  Or,.*
136e0 2a 20 69 66 20 74 68 65 20 50 34 20 61 72 67 75  * if the P4 argu
136f0 6d 65 6e 74 20 69 73 20 61 20 50 34 5f 4d 45 4d  ment is a P4_MEM
13700 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20 6f   use the value o
13710 66 20 74 68 65 20 50 34 20 61 72 67 75 6d 65 6e  f the P4 argumen
13720 74 20 61 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  t as.** the resu
13730 6c 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  lt..**.** If the
13740 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
13750 48 45 20 62 69 74 20 69 73 20 73 65 74 20 6f 6e  HE bit is set on
13760 20 50 35 20 61 6e 64 20 50 31 20 69 73 20 61 20   P5 and P1 is a 
13770 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72  pseudo-table cur
13780 73 6f 72 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  sor,.** then the
13790 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
137a0 72 73 6f 72 20 69 73 20 72 65 73 65 74 20 70 72  rsor is reset pr
137b0 69 6f 72 20 74 6f 20 65 78 74 72 61 63 74 69 6e  ior to extractin
137c0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  g the column..**
137d0 20 54 68 65 20 66 69 72 73 74 20 4f 50 5f 43 6f   The first OP_Co
137e0 6c 75 6d 6e 20 61 67 61 69 6e 73 74 20 61 20 70  lumn against a p
137f0 73 65 75 64 6f 2d 74 61 62 6c 65 20 61 66 74 65  seudo-table afte
13800 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  r the value of t
13810 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 72 65  he content.** re
13820 67 69 73 74 65 72 20 68 61 73 20 63 68 61 6e 67  gister has chang
13830 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  ed should have t
13840 68 69 73 20 62 69 74 20 73 65 74 2e 0a 2a 2a 0a  his bit set..**.
13850 2a 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47  ** If the OPFLAG
13860 5f 4c 45 4e 47 54 48 41 52 47 20 61 6e 64 20 4f  _LENGTHARG and O
13870 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
13880 62 69 74 73 20 61 72 65 20 73 65 74 20 6f 6e 20  bits are set on 
13890 50 35 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 72  P5 when.** the r
138a0 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
138b0 65 65 64 20 74 6f 20 6f 6e 6c 79 20 62 65 20 75  eed to only be u
138c0 73 65 64 20 61 73 20 74 68 65 20 61 72 67 75 6d  sed as the argum
138d0 65 6e 74 20 6f 66 20 61 20 6c 65 6e 67 74 68 28  ent of a length(
138e0 29 0a 2a 2a 20 6f 72 20 74 79 70 65 6f 66 28 29  ).** or typeof()
138f0 20 66 75 6e 63 74 69 6f 6e 2c 20 72 65 73 70 65   function, respe
13900 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 6c 6f  ctively.  The lo
13910 61 64 69 6e 67 20 6f 66 20 6c 61 72 67 65 20 62  ading of large b
13920 6c 6f 62 73 20 63 61 6e 20 62 65 0a 2a 2a 20 73  lobs can be.** s
13930 6b 69 70 70 65 64 20 66 6f 72 20 6c 65 6e 67 74  kipped for lengt
13940 68 28 29 20 61 6e 64 20 61 6c 6c 20 63 6f 6e 74  h() and all cont
13950 65 6e 74 20 6c 6f 61 64 69 6e 67 20 63 61 6e 20  ent loading can 
13960 62 65 20 73 6b 69 70 70 65 64 20 66 6f 72 20 74  be skipped for t
13970 79 70 65 6f 66 28 29 2e 0a 2a 2f 0a 63 61 73 65  ypeof()..*/.case
13980 20 4f 50 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20   OP_Column: {.  
13990 69 6e 74 20 70 32 3b 20 20 20 20 20 20 20 20 20  int p2;         
139a0 20 20 20 2f 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d     /* column num
139b0 62 65 72 20 74 6f 20 72 65 74 72 69 65 76 65 20  ber to retrieve 
139c0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
139d0 2a 70 43 3b 20 20 20 20 2f 2a 20 54 68 65 20 56  *pC;    /* The V
139e0 44 42 45 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  DBE cursor */.  
139f0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
13a00 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
13a10 63 75 72 73 6f 72 20 2a 2f 0a 20 20 75 33 32 20  cursor */.  u32 
13a20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  *aOffset;      /
13a30 2a 20 61 4f 66 66 73 65 74 5b 69 5d 20 69 73 20  * aOffset[i] is 
13a40 6f 66 66 73 65 74 20 74 6f 20 73 74 61 72 74 20  offset to start 
13a50 6f 66 20 64 61 74 61 20 66 6f 72 20 69 2d 74 68  of data for i-th
13a60 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
13a70 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
13a80 2f 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  /* The length of
13a90 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
13aa0 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 6f 6c  data for the col
13ab0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  umn */.  int i; 
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13ad0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
13ae0 20 4d 65 6d 20 2a 70 44 65 73 74 3b 20 20 20 20   Mem *pDest;    
13af0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13b00 77 72 69 74 65 20 74 68 65 20 65 78 74 72 61 63  write the extrac
13b10 74 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  ted value */.  M
13b20 65 6d 20 73 4d 65 6d 3b 20 20 20 20 20 20 20 20  em sMem;        
13b30 20 20 2f 2a 20 46 6f 72 20 73 74 6f 72 69 6e 67    /* For storing
13b40 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 69 6e   the record bein
13b50 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 63  g decoded */.  c
13b60 6f 6e 73 74 20 75 38 20 2a 7a 44 61 74 61 3b 20  onst u8 *zData; 
13b70 20 20 2f 2a 20 50 61 72 74 20 6f 66 20 74 68 65    /* Part of the
13b80 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
13b90 63 6f 64 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  coded */.  const
13ba0 20 75 38 20 2a 7a 48 64 72 3b 20 20 20 20 2f 2a   u8 *zHdr;    /*
13bb0 20 4e 65 78 74 20 75 6e 70 61 72 73 65 64 20 62   Next unparsed b
13bc0 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
13bd0 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  r */.  const u8 
13be0 2a 7a 45 6e 64 48 64 72 3b 20 2f 2a 20 50 6f 69  *zEndHdr; /* Poi
13bf0 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 62 79  nter to first by
13c00 74 65 20 61 66 74 65 72 20 74 68 65 20 68 65 61  te after the hea
13c10 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66  der */.  u32 off
13c20 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
13c30 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64  ffset into the d
13c40 61 74 61 20 2a 2f 0a 20 20 75 36 34 20 6f 66 66  ata */.  u64 off
13c50 73 65 74 36 34 3b 20 20 20 20 20 20 2f 2a 20 36  set64;      /* 6
13c60 34 2d 62 69 74 20 6f 66 66 73 65 74 20 2a 2f 0a  4-bit offset */.
13c70 20 20 75 33 32 20 61 76 61 69 6c 3b 20 20 20 20    u32 avail;    
13c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13c90 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
13ca0 61 62 6c 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  able data */.  u
13cb0 33 32 20 74 3b 20 20 20 20 20 20 20 20 20 20 20  32 t;           
13cc0 20 20 2f 2a 20 41 20 74 79 70 65 20 63 6f 64 65    /* A type code
13cd0 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
13ce0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d   header */.  Mem
13cf0 20 2a 70 52 65 67 3b 20 20 20 20 20 20 20 20 20   *pReg;         
13d00 2f 2a 20 50 73 65 75 64 6f 54 61 62 6c 65 20 69  /* PseudoTable i
13d10 6e 70 75 74 20 72 65 67 69 73 74 65 72 20 2a 2f  nput register */
13d20 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ..  pC = p->apCs
13d30 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 70 32  r[pOp->p1];.  p2
13d40 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 0a 20 20 2f   = pOp->p2;..  /
13d50 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
13d60 63 61 63 68 65 20 69 73 20 73 74 61 6c 65 2c 20  cache is stale, 
13d70 62 72 69 6e 67 20 69 74 20 75 70 2d 74 6f 2d 64  bring it up-to-d
13d80 61 74 65 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ate */.  rc = sq
13d90 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
13da0 6f 76 65 74 6f 28 26 70 43 2c 20 26 70 32 29 3b  oveto(&pC, &p2);
13db0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
13dc0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
13dd0 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ror;..  assert( 
13de0 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70 4f 70  pOp->p3>0 && pOp
13df0 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31  ->p3<=(p->nMem+1
13e00 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29   - p->nCursor) )
13e10 3b 0a 20 20 70 44 65 73 74 20 3d 20 26 61 4d 65  ;.  pDest = &aMe
13e20 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65  m[pOp->p3];.  me
13e30 6d 41 62 6f 75 74 54 6f 43 68 61 6e 67 65 28 70  mAboutToChange(p
13e40 2c 20 70 44 65 73 74 29 3b 0a 20 20 61 73 73 65  , pDest);.  asse
13e50 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
13e60 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
13e70 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
13e80 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
13e90 65 72 74 28 20 70 32 3c 70 43 2d 3e 6e 46 69 65  ert( p2<pC->nFie
13ea0 6c 64 20 29 3b 0a 20 20 61 4f 66 66 73 65 74 20  ld );.  aOffset 
13eb0 3d 20 70 43 2d 3e 61 4f 66 66 73 65 74 3b 0a 20  = pC->aOffset;. 
13ec0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
13ed0 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 56  rType!=CURTYPE_V
13ee0 54 41 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TAB );.  assert(
13ef0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43   pC->eCurType!=C
13f00 55 52 54 59 50 45 5f 50 53 45 55 44 4f 20 7c 7c  URTYPE_PSEUDO ||
13f10 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 3b 0a   pC->nullRow );.
13f20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
13f30 75 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f  urType!=CURTYPE_
13f40 53 4f 52 54 45 52 20 29 3b 0a 0a 20 20 69 66 28  SORTER );..  if(
13f50 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
13f60 21 3d 70 2d 3e 63 61 63 68 65 43 74 72 20 29 7b  !=p->cacheCtr ){
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f80 2f 2a 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49  /*OPTIMIZATION-I
13f90 46 2d 46 41 4c 53 45 2a 2f 0a 20 20 20 20 69 66  F-FALSE*/.    if
13fa0 28 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b  ( pC->nullRow ){
13fb0 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 65  .      if( pC->e
13fc0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
13fd0 5f 50 53 45 55 44 4f 20 29 7b 0a 20 20 20 20 20  _PSEUDO ){.     
13fe0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75     assert( pC->u
13ff0 63 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  c.pseudoTableReg
14000 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  >0 );.        pR
14010 65 67 20 3d 20 26 61 4d 65 6d 5b 70 43 2d 3e 75  eg = &aMem[pC->u
14020 63 2e 70 73 65 75 64 6f 54 61 62 6c 65 52 65 67  c.pseudoTableReg
14030 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
14040 74 28 20 70 52 65 67 2d 3e 66 6c 61 67 73 20 26  t( pReg->flags &
14050 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
14060 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
14070 49 73 56 61 6c 69 64 28 70 52 65 67 29 20 29 3b  IsValid(pReg) );
14080 0a 20 20 20 20 20 20 20 20 70 43 2d 3e 70 61 79  .        pC->pay
14090 6c 6f 61 64 53 69 7a 65 20 3d 20 70 43 2d 3e 73  loadSize = pC->s
140a0 7a 52 6f 77 20 3d 20 61 76 61 69 6c 20 3d 20 70  zRow = avail = p
140b0 52 65 67 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Reg->n;.        
140c0 70 43 2d 3e 61 52 6f 77 20 3d 20 28 75 38 2a 29  pC->aRow = (u8*)
140d0 70 52 65 67 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pReg->z;.      }
140e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
140f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e  lite3VdbeMemSetN
14100 75 6c 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ull(pDest);.    
14110 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
14120 6d 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  mn_out;.      }.
14130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14140 20 70 43 72 73 72 20 3d 20 70 43 2d 3e 75 63 2e   pCrsr = pC->uc.
14150 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 61  pCursor;.      a
14160 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
14170 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
14180 45 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EE );.      asse
14190 72 74 28 20 70 43 72 73 72 20 29 3b 0a 20 20 20  rt( pCrsr );.   
141a0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
141b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
141c0 61 6c 69 64 28 70 43 72 73 72 29 20 29 3b 0a 20  alid(pCrsr) );. 
141d0 20 20 20 20 20 70 43 2d 3e 70 61 79 6c 6f 61 64       pC->payload
141e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 42 74  Size = sqlite3Bt
141f0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
14200 43 72 73 72 29 3b 0a 20 20 20 20 20 20 70 43 2d  Crsr);.      pC-
14210 3e 61 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 42  >aRow = sqlite3B
14220 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
14230 28 70 43 72 73 72 2c 20 26 61 76 61 69 6c 29 3b  (pCrsr, &avail);
14240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
14250 76 61 69 6c 3c 3d 36 35 35 33 36 20 29 3b 20 20  vail<=65536 );  
14260 2f 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65 20  /* Maximum page 
14270 73 69 7a 65 20 69 73 20 36 34 4b 69 42 20 2a 2f  size is 64KiB */
14280 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d 3e 70  .      if( pC->p
14290 61 79 6c 6f 61 64 53 69 7a 65 20 3c 3d 20 28 75  ayloadSize <= (u
142a0 33 32 29 61 76 61 69 6c 20 29 7b 0a 20 20 20 20  32)avail ){.    
142b0 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20 3d 20      pC->szRow = 
142c0 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 3b  pC->payloadSize;
142d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
142e0 20 70 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65   pC->payloadSize
142f0 20 3e 20 28 75 33 32 29 64 62 2d 3e 61 4c 69 6d   > (u32)db->aLim
14300 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14310 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 20  LENGTH] ){.     
14320 20 20 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b     goto too_big;
14330 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14340 20 20 20 20 20 20 70 43 2d 3e 73 7a 52 6f 77 20        pC->szRow 
14350 3d 20 61 76 61 69 6c 3b 0a 20 20 20 20 20 20 7d  = avail;.      }
14360 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 2d 3e 63  .    }.    pC->c
14370 61 63 68 65 53 74 61 74 75 73 20 3d 20 70 2d 3e  acheStatus = p->
14380 63 61 63 68 65 43 74 72 3b 0a 20 20 20 20 70 43  cacheCtr;.    pC
14390 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 67  ->iHdrOffset = g
143a0 65 74 56 61 72 69 6e 74 33 32 28 70 43 2d 3e 61  etVarint32(pC->a
143b0 52 6f 77 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  Row, offset);.  
143c0 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64    pC->nHdrParsed
143d0 20 3d 20 30 3b 0a 20 20 20 20 61 4f 66 66 73 65   = 0;.    aOffse
143e0 74 5b 30 5d 20 3d 20 6f 66 66 73 65 74 3b 0a 0a  t[0] = offset;..
143f0 0a 20 20 20 20 69 66 28 20 61 76 61 69 6c 3c 6f  .    if( avail<o
14400 66 66 73 65 74 20 29 7b 20 20 20 20 20 20 2f 2a  ffset ){      /*
14410 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 2d 49 46 2d  OPTIMIZATION-IF-
14420 46 41 4c 53 45 2a 2f 0a 20 20 20 20 20 20 2f 2a  FALSE*/.      /*
14430 20 70 43 2d 3e 61 52 6f 77 20 64 6f 65 73 20 6e   pC->aRow does n
14440 6f 74 20 68 61 76 65 20 74 6f 20 68 6f 6c 64 20  ot have to hold 
14450 74 68 65 20 65 6e 74 69 72 65 20 72 6f 77 2c 20  the entire row, 
14460 62 75 74 20 69 74 20 64 6f 65 73 20 61 74 20 6c  but it does at l
14470 65 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  east.      ** ne
14480 65 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65 20  ed to cover the 
14490 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 72 65  header of the re
144a0 63 6f 72 64 2e 20 20 49 66 20 70 43 2d 3e 61 52  cord.  If pC->aR
144b0 6f 77 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ow does not cont
144c0 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ain.      ** the
144d0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
144e0 2c 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f  , then set it to
144f0 20 7a 65 72 6f 2c 20 66 6f 72 63 69 6e 67 20 74   zero, forcing t
14500 68 65 20 68 65 61 64 65 72 20 74 6f 20 62 65 0a  he header to be.
14510 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63        ** dynamic
14520 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ally allocated. 
14530 2a 2f 0a 20 20 20 20 20 20 70 43 2d 3e 61 52 6f  */.      pC->aRo
14540 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 2d  w = 0;.      pC-
14550 3e 73 7a 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  >szRow = 0;..   
14560 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
14570 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
14580 73 65 20 68 61 73 20 6e 6f 74 20 67 69 76 65 6e  se has not given
14590 20 75 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 20   us an oversize 
145a0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a  header..      **
145b0 20 44 6f 20 74 68 69 73 20 6e 6f 77 20 74 6f 20   Do this now to 
145c0 61 76 6f 69 64 20 61 6e 20 6f 76 65 72 73 69 7a  avoid an oversiz
145d0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
145e0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ion..      **.  
145f0 20 20 20 20 2a 2a 20 54 79 70 65 20 65 6e 74 72      ** Type entr
14600 69 65 73 20 63 61 6e 20 62 65 20 62 65 74 77 65  ies can be betwe
14610 65 6e 20 31 20 61 6e 64 20 35 20 62 79 74 65 73  en 1 and 5 bytes
14620 20 65 61 63 68 2e 20 20 42 75 74 20 34 20 61 6e   each.  But 4 an
14630 64 20 35 20 62 79 74 65 0a 20 20 20 20 20 20 2a  d 5 byte.      *
14640 2a 20 74 79 70 65 73 20 75 73 65 20 73 6f 20 6d  * types use so m
14650 75 63 68 20 64 61 74 61 20 73 70 61 63 65 20 74  uch data space t
14660 68 61 74 20 74 68 65 72 65 20 63 61 6e 20 6f 6e  hat there can on
14670 6c 79 20 62 65 20 34 30 39 36 20 61 6e 64 20 33  ly be 4096 and 3
14680 32 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  2 of.      ** th
14690 65 6d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  em, respectively
146a0 2e 20 20 53 6f 20 74 68 65 20 6d 61 78 69 6d 75  .  So the maximu
146b0 6d 20 68 65 61 64 65 72 20 6c 65 6e 67 74 68 20  m header length 
146c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 0a 20  results from a. 
146d0 20 20 20 20 20 2a 2a 20 33 2d 62 79 74 65 20 74       ** 3-byte t
146e0 79 70 65 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ype for each of 
146f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 33  the maximum of 3
14700 32 37 36 38 20 63 6f 6c 75 6d 6e 73 20 70 6c 75  2768 columns plu
14710 73 20 74 68 72 65 65 0a 20 20 20 20 20 20 2a 2a  s three.      **
14720 20 65 78 74 72 61 20 62 79 74 65 73 20 66 6f 72   extra bytes for
14730 20 74 68 65 20 68 65 61 64 65 72 20 6c 65 6e 67   the header leng
14740 74 68 20 69 74 73 65 6c 66 2e 20 20 33 32 37 36  th itself.  3276
14750 38 2a 33 20 2b 20 33 20 3d 20 39 38 33 30 37 2e  8*3 + 3 = 98307.
14760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14770 69 66 28 20 6f 66 66 73 65 74 20 3e 20 39 38 33  if( offset > 983
14780 30 37 20 7c 7c 20 6f 66 66 73 65 74 20 3e 20 70  07 || offset > p
14790 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 20 29  C->payloadSize )
147a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
147b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
147c0 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
147d0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
147e0 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ror;.      }.   
147f0 20 7d 65 6c 73 65 20 69 66 28 20 6f 66 66 73 65   }else if( offse
14800 74 3e 30 20 29 7b 20 2f 2a 4f 50 54 49 4d 49 5a  t>0 ){ /*OPTIMIZ
14810 41 54 49 4f 4e 2d 49 46 2d 54 52 55 45 2a 2f 0a  ATION-IF-TRUE*/.
14820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
14830 6c 6f 77 69 6e 67 20 67 6f 74 6f 20 69 73 20 61  lowing goto is a
14840 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
14850 20 49 74 20 63 61 6e 20 62 65 20 6f 6d 69 74 74   It can be omitt
14860 65 64 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ed and.      ** 
14870 65 76 65 72 79 74 68 69 6e 67 20 77 69 6c 6c 20  everything will 
14880 73 74 69 6c 6c 20 77 6f 72 6b 2e 20 20 42 75 74  still work.  But
14890 20 4f 50 5f 43 6f 6c 75 6d 6e 20 69 73 20 6d 65   OP_Column is me
148a0 61 73 75 72 61 62 6c 79 20 66 61 73 74 65 72 0a  asurably faster.
148b0 20 20 20 20 20 20 2a 2a 20 62 79 20 73 6b 69 70        ** by skip
148c0 70 69 6e 67 20 74 68 65 20 73 75 62 73 65 71 75  ping the subsequ
148d0 65 6e 74 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 2c  ent conditional,
148e0 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
148f0 20 74 72 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   true..      */.
14900 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43        zData = pC
14910 2d 3e 61 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ->aRow;.      as
14920 73 65 72 74 28 20 70 43 2d 3e 6e 48 64 72 50 61  sert( pC->nHdrPa
14930 72 73 65 64 3c 3d 70 32 20 29 3b 20 20 20 20 20  rsed<=p2 );     
14940 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
14950 61 6c 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  al skipped */.  
14960 20 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75      goto op_colu
14970 6d 6e 5f 72 65 61 64 5f 68 65 61 64 65 72 3b 0a  mn_read_header;.
14980 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14990 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65 61  Make sure at lea
149a0 73 74 20 74 68 65 20 66 69 72 73 74 20 70 32 2b  st the first p2+
149b0 31 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  1 entries of the
149c0 20 68 65 61 64 65 72 20 68 61 76 65 20 62 65 65   header have bee
149d0 6e 0a 20 20 2a 2a 20 70 61 72 73 65 64 20 61 6e  n.  ** parsed an
149e0 64 20 76 61 6c 69 64 20 69 6e 66 6f 72 6d 61 74  d valid informat
149f0 69 6f 6e 20 69 73 20 69 6e 20 61 4f 66 66 73 65  ion is in aOffse
14a00 74 5b 5d 20 61 6e 64 20 70 43 2d 3e 61 54 79 70  t[] and pC->aTyp
14a10 65 5b 5d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e[]..  */.  if( 
14a20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64 3c 3d  pC->nHdrParsed<=
14a30 70 32 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  p2 ){.    /* If 
14a40 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 68 65  there is more he
14a50 61 64 65 72 20 61 76 61 69 6c 61 62 6c 65 20 66  ader available f
14a60 6f 72 20 70 61 72 73 69 6e 67 20 69 6e 20 74 68  or parsing in th
14a70 65 20 72 65 63 6f 72 64 2c 20 74 72 79 0a 20 20  e record, try.  
14a80 20 20 2a 2a 20 74 6f 20 65 78 74 72 61 63 74 20    ** to extract 
14a90 61 64 64 69 74 69 6f 6e 61 6c 20 66 69 65 6c 64  additional field
14aa0 73 20 75 70 20 74 68 72 6f 75 67 68 20 74 68 65  s up through the
14ab0 20 70 32 2b 31 2d 74 68 20 66 69 65 6c 64 20 0a   p2+1-th field .
14ac0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14ad0 43 2d 3e 69 48 64 72 4f 66 66 73 65 74 3c 61 4f  C->iHdrOffset<aO
14ae0 66 66 73 65 74 5b 30 5d 20 29 7b 0a 20 20 20 20  ffset[0] ){.    
14af0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 7a    /* Make sure z
14b00 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 65  Data points to e
14b10 6e 6f 75 67 68 20 6f 66 20 74 68 65 20 72 65 63  nough of the rec
14b20 6f 72 64 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ord to cover the
14b30 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
14b40 20 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d    if( pC->aRow==
14b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
14b60 73 65 74 28 26 73 4d 65 6d 2c 20 30 2c 20 73 69  set(&sMem, 0, si
14b70 7a 65 6f 66 28 73 4d 65 6d 29 29 3b 0a 20 20 20  zeof(sMem));.   
14b80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14b90 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
14ba0 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  e(pC->uc.pCursor
14bb0 2c 20 30 2c 20 61 4f 66 66 73 65 74 5b 30 5d 2c  , 0, aOffset[0],
14bc0 20 26 73 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20   &sMem);.       
14bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14be0 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  OK ) goto abort_
14bf0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
14c00 20 20 20 20 20 20 7a 44 61 74 61 20 3d 20 28 75        zData = (u
14c10 38 2a 29 73 4d 65 6d 2e 7a 3b 0a 20 20 20 20 20  8*)sMem.z;.     
14c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14c30 7a 44 61 74 61 20 3d 20 70 43 2d 3e 61 52 6f 77  zData = pC->aRow
14c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
14c50 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 43     /* Fill in pC
14c60 2d 3e 61 54 79 70 65 5b 69 5d 20 61 6e 64 20 61  ->aType[i] and a
14c70 4f 66 66 73 65 74 5b 69 5d 20 76 61 6c 75 65 73  Offset[i] values
14c80 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 32 2d   through the p2-
14c90 74 68 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  th field. */.   
14ca0 20 6f 70 5f 63 6f 6c 75 6d 6e 5f 72 65 61 64 5f   op_column_read_
14cb0 68 65 61 64 65 72 3a 0a 20 20 20 20 20 20 69 20  header:.      i 
14cc0 3d 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  = pC->nHdrParsed
14cd0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 36 34  ;.      offset64
14ce0 20 3d 20 61 4f 66 66 73 65 74 5b 69 5d 3b 0a 20   = aOffset[i];. 
14cf0 20 20 20 20 20 7a 48 64 72 20 3d 20 7a 44 61 74       zHdr = zDat
14d00 61 20 2b 20 70 43 2d 3e 69 48 64 72 4f 66 66 73  a + pC->iHdrOffs
14d10 65 74 3b 0a 20 20 20 20 20 20 7a 45 6e 64 48 64  et;.      zEndHd
14d20 72 20 3d 20 7a 44 61 74 61 20 2b 20 61 4f 66 66  r = zData + aOff
14d30 73 65 74 5b 30 5d 3b 0a 20 20 20 20 20 20 64 6f  set[0];.      do
14d40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 74  {.        if( (t
14d50 20 3d 20 7a 48 64 72 5b 30 5d 29 3c 30 78 38 30   = zHdr[0])<0x80
14d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 48   ){.          zH
14d70 64 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  dr++;.          
14d80 6f 66 66 73 65 74 36 34 20 2b 3d 20 73 71 6c 69  offset64 += sqli
14d90 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65  te3VdbeOneByteSe
14da0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 3b 0a  rialTypeLen(t);.
14db0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14dc0 20 20 20 20 20 20 20 20 20 7a 48 64 72 20 2b 3d           zHdr +=
14dd0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
14de0 74 33 32 28 7a 48 64 72 2c 20 26 74 29 3b 0a 20  t32(zHdr, &t);. 
14df0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 36           offset6
14e00 34 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  4 += sqlite3Vdbe
14e10 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29  SerialTypeLen(t)
14e20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14e30 20 20 20 20 70 43 2d 3e 61 54 79 70 65 5b 69 2b      pC->aType[i+
14e40 2b 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 20 20  +] = t;.        
14e50 61 4f 66 66 73 65 74 5b 69 5d 20 3d 20 28 75 33  aOffset[i] = (u3
14e60 32 29 28 6f 66 66 73 65 74 36 34 20 26 20 30 78  2)(offset64 & 0x
14e70 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
14e80 20 7d 77 68 69 6c 65 28 20 69 3c 3d 70 32 20 26   }while( i<=p2 &
14e90 26 20 7a 48 64 72 3c 7a 45 6e 64 48 64 72 20 29  & zHdr<zEndHdr )
14ea0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
14eb0 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
14ec0 74 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  t if any of the 
14ed0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
14ee0 75 65 3a 0a 20 20 20 20 20 20 2a 2a 20 28 31 29  ue:.      ** (1)
14ef0 20 74 68 65 20 62 79 74 65 73 20 6f 66 20 74 68   the bytes of th
14f00 65 20 68 65 61 64 65 72 20 65 78 74 65 6e 64 20  e header extend 
14f10 70 61 73 74 20 74 68 65 20 64 65 63 6c 61 72 65  past the declare
14f20 64 20 68 65 61 64 65 72 20 73 69 7a 65 0a 20 20  d header size.  
14f30 20 20 20 20 2a 2a 20 28 32 29 20 74 68 65 20 65      ** (2) the e
14f40 6e 74 69 72 65 20 68 65 61 64 65 72 20 77 61 73  ntire header was
14f50 20 75 73 65 64 20 62 75 74 20 6e 6f 74 20 61 6c   used but not al
14f60 6c 20 64 61 74 61 20 77 61 73 20 75 73 65 64 0a  l data was used.
14f70 20 20 20 20 20 20 2a 2a 20 28 33 29 20 74 68 65        ** (3) the
14f80 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
14f90 20 65 78 74 65 6e 64 73 20 62 65 79 6f 6e 64 20   extends beyond 
14fa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
14fb0 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ecord..      */.
14fc0 20 20 20 20 20 20 69 66 28 20 28 7a 48 64 72 3e        if( (zHdr>
14fd0 3d 7a 45 6e 64 48 64 72 20 26 26 20 28 7a 48 64  =zEndHdr && (zHd
14fe0 72 3e 7a 45 6e 64 48 64 72 20 7c 7c 20 6f 66 66  r>zEndHdr || off
14ff0 73 65 74 36 34 21 3d 70 43 2d 3e 70 61 79 6c 6f  set64!=pC->paylo
15000 61 64 53 69 7a 65 29 29 0a 20 20 20 20 20 20 20  adSize)).       
15010 7c 7c 20 28 6f 66 66 73 65 74 36 34 20 3e 20 70  || (offset64 > p
15020 43 2d 3e 70 61 79 6c 6f 61 64 53 69 7a 65 29 0a  C->payloadSize).
15030 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15040 20 69 66 28 20 70 43 2d 3e 61 52 6f 77 3d 3d 30   if( pC->aRow==0
15050 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
15060 6d 52 65 6c 65 61 73 65 28 26 73 4d 65 6d 29 3b  mRelease(&sMem);
15070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
15080 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15090 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
150a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
150b0 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  or;.      }..   
150c0 20 20 20 70 43 2d 3e 6e 48 64 72 50 61 72 73 65     pC->nHdrParse
150d0 64 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 43 2d  d = i;.      pC-
150e0 3e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 28 75  >iHdrOffset = (u
150f0 33 32 29 28 7a 48 64 72 20 2d 20 7a 44 61 74 61  32)(zHdr - zData
15100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 2d  );.      if( pC-
15110 3e 61 52 6f 77 3d 3d 30 20 29 20 73 71 6c 69 74  >aRow==0 ) sqlit
15120 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
15130 28 26 73 4d 65 6d 29 3b 0a 20 20 20 20 7d 65 6c  (&sMem);.    }el
15140 73 65 7b 0a 20 20 20 20 20 20 74 20 3d 20 30 3b  se{.      t = 0;
15150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15160 66 20 61 66 74 65 72 20 74 72 79 69 6e 67 20 74  f after trying t
15170 6f 20 65 78 74 72 61 63 74 20 6e 65 77 20 65 6e  o extract new en
15180 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 68  tries from the h
15190 65 61 64 65 72 2c 20 6e 48 64 72 50 61 72 73 65  eader, nHdrParse
151a0 64 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  d is.    ** stil
151b0 6c 20 6e 6f 74 20 75 70 20 74 6f 20 70 32 2c 20  l not up to p2, 
151c0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
151d0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 66  the record has f
151e0 65 77 65 72 20 74 68 61 6e 20 70 32 0a 20 20 20  ewer than p2.   
151f0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 2e 20 20 53 6f   ** columns.  So
15200 20 74 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c   the result will
15210 20 62 65 20 65 69 74 68 65 72 20 74 68 65 20 64   be either the d
15220 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 72 20  efault value or 
15230 61 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  a NULL..    */. 
15240 20 20 20 69 66 28 20 70 43 2d 3e 6e 48 64 72 50     if( pC->nHdrP
15250 61 72 73 65 64 3c 3d 70 32 20 29 7b 0a 20 20 20  arsed<=p2 ){.   
15260 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
15270 70 65 3d 3d 50 34 5f 4d 45 4d 20 29 7b 0a 20 20  pe==P4_MEM ){.  
15280 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15290 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
152a0 70 44 65 73 74 2c 20 70 4f 70 2d 3e 70 34 2e 70  pDest, pOp->p4.p
152b0 4d 65 6d 2c 20 4d 45 4d 5f 53 74 61 74 69 63 29  Mem, MEM_Static)
152c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
152d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
152e0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65  beMemSetNull(pDe
152f0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
15300 20 20 20 67 6f 74 6f 20 6f 70 5f 63 6f 6c 75 6d     goto op_colum
15310 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  n_out;.    }.  }
15320 65 6c 73 65 7b 0a 20 20 20 20 74 20 3d 20 70 43  else{.    t = pC
15330 2d 3e 61 54 79 70 65 5b 70 32 5d 3b 0a 20 20 7d  ->aType[p2];.  }
15340 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
15350 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  he content for t
15360 68 65 20 70 32 2b 31 2d 74 68 20 63 6f 6c 75 6d  he p2+1-th colum
15370 6e 2e 20 20 43 6f 6e 74 72 6f 6c 20 63 61 6e 20  n.  Control can 
15380 6f 6e 6c 79 0a 20 20 2a 2a 20 72 65 61 63 68 20  only.  ** reach 
15390 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 61 4f  this point if aO
153a0 66 66 73 65 74 5b 70 32 5d 2c 20 61 4f 66 66 73  ffset[p2], aOffs
153b0 65 74 5b 70 32 2b 31 5d 2c 20 61 6e 64 20 70 43  et[p2+1], and pC
153c0 2d 3e 61 54 79 70 65 5b 70 32 5d 20 61 72 65 0a  ->aType[p2] are.
153d0 20 20 2a 2a 20 61 6c 6c 20 76 61 6c 69 64 2e 0a    ** all valid..
153e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
153f0 32 3c 70 43 2d 3e 6e 48 64 72 50 61 72 73 65 64  2<pC->nHdrParsed
15400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
15410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15420 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15430 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
15440 72 69 61 6e 74 73 28 70 44 65 73 74 29 20 29 3b  riants(pDest) );
15450 0a 20 20 69 66 28 20 56 64 62 65 4d 65 6d 44 79  .  if( VdbeMemDy
15460 6e 61 6d 69 63 28 70 44 65 73 74 29 20 29 7b 0a  namic(pDest) ){.
15470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
15480 65 6d 53 65 74 4e 75 6c 6c 28 70 44 65 73 74 29  emSetNull(pDest)
15490 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
154a0 74 3d 3d 70 43 2d 3e 61 54 79 70 65 5b 70 32 5d  t==pC->aType[p2]
154b0 20 29 3b 0a 20 20 69 66 28 20 70 43 2d 3e 73 7a   );.  if( pC->sz
154c0 52 6f 77 3e 3d 61 4f 66 66 73 65 74 5b 70 32 2b  Row>=aOffset[p2+
154d0 31 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  1] ){.    /* Thi
154e0 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
154f0 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 64  case where the d
15500 65 73 69 72 65 64 20 63 6f 6e 74 65 6e 74 20 66  esired content f
15510 69 74 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69  its on the origi
15520 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  nal.    ** page 
15530 2d 20 77 68 65 72 65 20 74 68 65 20 63 6f 6e 74  - where the cont
15540 65 6e 74 20 69 73 20 6e 6f 74 20 6f 6e 20 61 6e  ent is not on an
15550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a   overflow page *
15560 2f 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 70 43  /.    zData = pC
15570 2d 3e 61 52 6f 77 20 2b 20 61 4f 66 66 73 65 74  ->aRow + aOffset
15580 5b 70 32 5d 3b 0a 20 20 20 20 69 66 28 20 74 3c  [p2];.    if( t<
15590 31 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  12 ){.      sqli
155a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
155b0 28 7a 44 61 74 61 2c 20 74 2c 20 70 44 65 73 74  (zData, t, pDest
155c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
155d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
155e0 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 61 20  lumn value is a 
155f0 73 74 72 69 6e 67 2c 20 77 65 20 6e 65 65 64 20  string, we need 
15600 61 20 70 65 72 73 69 73 74 65 6e 74 20 76 61 6c  a persistent val
15610 75 65 2c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ue, not.      **
15620 20 61 20 4d 45 4d 5f 45 70 68 65 6d 20 76 61 6c   a MEM_Ephem val
15630 75 65 2e 20 20 54 68 69 73 20 62 72 61 6e 63 68  ue.  This branch
15640 20 69 73 20 61 20 66 61 73 74 20 73 68 6f 72 74   is a fast short
15650 2d 63 75 74 20 74 68 61 74 20 69 73 20 65 71 75  -cut that is equ
15660 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a  ivalent.      **
15670 20 74 6f 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   to calling sqli
15680 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
15690 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  () and sqlite3Vd
156a0 62 65 44 65 65 70 68 65 6d 65 72 61 6c 69 7a 65  beDeephemeralize
156b0 28 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ()..      */.   
156c0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
156d0 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
156e0 4d 45 4d 5f 42 6c 6f 62 2c 20 4d 45 4d 5f 53 74  MEM_Blob, MEM_St
156f0 72 7c 4d 45 4d 5f 54 65 72 6d 20 7d 3b 0a 20 20  r|MEM_Term };.  
15700 20 20 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 6c      pDest->n = l
15710 65 6e 20 3d 20 28 74 2d 31 32 29 2f 32 3b 0a 20  en = (t-12)/2;. 
15720 20 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20       pDest->enc 
15730 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  = encoding;.    
15740 20 20 69 66 28 20 70 44 65 73 74 2d 3e 73 7a 4d    if( pDest->szM
15750 61 6c 6c 6f 63 20 3c 20 6c 65 6e 2b 32 20 29 7b  alloc < len+2 ){
15760 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
15770 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
15780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
15790 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
157a0 28 70 44 65 73 74 2c 20 6c 65 6e 2b 32 2c 20 30  (pDest, len+2, 0
157b0 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b  ) ) goto no_mem;
157c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
157d0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 20 3d        pDest->z =
157e0 20 70 44 65 73 74 2d 3e 7a 4d 61 6c 6c 6f 63 3b   pDest->zMalloc;
157f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
15800 65 6d 63 70 79 28 70 44 65 73 74 2d 3e 7a 2c 20  emcpy(pDest->z, 
15810 7a 44 61 74 61 2c 20 6c 65 6e 29 3b 0a 20 20 20  zData, len);.   
15820 20 20 20 70 44 65 73 74 2d 3e 7a 5b 6c 65 6e 5d     pDest->z[len]
15830 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 65 73   = 0;.      pDes
15840 74 2d 3e 7a 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b  t->z[len+1] = 0;
15850 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 66 6c  .      pDest->fl
15860 61 67 73 20 3d 20 61 46 6c 61 67 5b 74 26 31 5d  ags = aFlag[t&1]
15870 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15880 0a 20 20 20 20 70 44 65 73 74 2d 3e 65 6e 63 20  .    pDest->enc 
15890 3d 20 65 6e 63 6f 64 69 6e 67 3b 0a 20 20 20 20  = encoding;.    
158a0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 68  /* This branch h
158b0 61 70 70 65 6e 73 20 6f 6e 6c 79 20 77 68 65 6e  appens only when
158c0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 6e 20 6f   content is on o
158d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
158e0 0a 20 20 20 20 69 66 28 20 28 28 70 4f 70 2d 3e  .    if( ((pOp->
158f0 70 35 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  p5 & (OPFLAG_LEN
15900 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
15910 50 45 4f 46 41 52 47 29 29 21 3d 30 0a 20 20 20  PEOFARG))!=0.   
15920 20 20 20 20 20 20 20 26 26 20 28 28 74 3e 3d 31         && ((t>=1
15930 32 20 26 26 20 28 74 26 31 29 3d 3d 30 29 20 7c  2 && (t&1)==0) |
15940 7c 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46  | (pOp->p5 & OPF
15950 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 21 3d  LAG_TYPEOFARG)!=
15960 30 29 29 0a 20 20 20 20 20 7c 7c 20 28 6c 65 6e  0)).     || (len
15970 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
15980 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 29 29 3d  rialTypeLen(t))=
15990 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
159a0 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20 69 72  /* Content is ir
159b0 72 65 6c 65 76 61 6e 74 20 66 6f 72 0a 20 20 20  relevant for.   
159c0 20 20 20 2a 2a 20 20 20 20 31 2e 20 74 68 65 20     **    1. the 
159d0 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
159e0 6e 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 32  n,.      **    2
159f0 2e 20 74 68 65 20 6c 65 6e 67 74 68 28 58 29 20  . the length(X) 
15a00 66 75 6e 63 74 69 6f 6e 20 69 66 20 58 20 69 73  function if X is
15a10 20 61 20 62 6c 6f 62 2c 20 61 6e 64 0a 20 20 20   a blob, and.   
15a20 20 20 20 2a 2a 20 20 20 20 33 2e 20 69 66 20 74     **    3. if t
15a30 68 65 20 63 6f 6e 74 65 6e 74 20 6c 65 6e 67 74  he content lengt
15a40 68 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 20  h is zero..     
15a50 20 2a 2a 20 53 6f 20 77 65 20 6d 69 67 68 74 20   ** So we might 
15a60 61 73 20 77 65 6c 6c 20 75 73 65 20 62 6f 67 75  as well use bogu
15a70 73 20 63 6f 6e 74 65 6e 74 20 72 61 74 68 65 72  s content rather
15a80 20 74 68 61 6e 20 72 65 61 64 69 6e 67 0a 20 20   than reading.  
15a90 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
15aa0 72 6f 6d 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20  rom disk. */.   
15ab0 20 20 20 73 74 61 74 69 63 20 75 38 20 61 5a 65     static u8 aZe
15ac0 72 6f 5b 38 5d 3b 20 20 2f 2a 20 54 68 69 73 20  ro[8];  /* This 
15ad0 69 73 20 74 68 65 20 62 6f 67 75 73 20 63 6f 6e  is the bogus con
15ae0 74 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  tent */.      sq
15af0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15b00 65 74 28 61 5a 65 72 6f 2c 20 74 2c 20 70 44 65  et(aZero, t, pDe
15b10 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
15b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15b30 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
15b40 65 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ee(pC->uc.pCurso
15b50 72 2c 20 61 4f 66 66 73 65 74 5b 70 32 5d 2c 20  r, aOffset[p2], 
15b60 6c 65 6e 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  len, pDest);.   
15b70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15b80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72  E_OK ) goto abor
15b90 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
15ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15bb0 65 53 65 72 69 61 6c 47 65 74 28 28 63 6f 6e 73  eSerialGet((cons
15bc0 74 20 75 38 2a 29 70 44 65 73 74 2d 3e 7a 2c 20  t u8*)pDest->z, 
15bd0 74 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 20  t, pDest);.     
15be0 20 70 44 65 73 74 2d 3e 66 6c 61 67 73 20 26 3d   pDest->flags &=
15bf0 20 7e 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20   ~MEM_Ephem;.   
15c00 20 7d 0a 20 20 7d 0a 0a 6f 70 5f 63 6f 6c 75 6d   }.  }..op_colum
15c10 6e 5f 6f 75 74 3a 0a 20 20 55 50 44 41 54 45 5f  n_out:.  UPDATE_
15c20 4d 41 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65  MAX_BLOBSIZE(pDe
15c30 73 74 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f  st);.  REGISTER_
15c40 54 52 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70  TRACE(pOp->p3, p
15c50 44 65 73 74 29 3b 0a 20 20 62 72 65 61 6b 3b 0a  Dest);.  break;.
15c60 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 41 66  }../* Opcode: Af
15c70 66 69 6e 69 74 79 20 50 31 20 50 32 20 2a 20 50  finity P1 P2 * P
15c80 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
15c90 20 61 66 66 69 6e 69 74 79 28 72 5b 50 31 40 50   affinity(r[P1@P
15ca0 32 5d 29 0a 2a 2a 0a 2a 2a 20 41 70 70 6c 79 20  2]).**.** Apply 
15cb0 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 61 20  affinities to a 
15cc0 72 61 6e 67 65 20 6f 66 20 50 32 20 72 65 67 69  range of P2 regi
15cd0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
15ce0 69 74 68 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 50 34  ith P1..**.** P4
15cf0 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
15d00 74 20 69 73 20 50 32 20 63 68 61 72 61 63 74 65  t is P2 characte
15d10 72 73 20 6c 6f 6e 67 2e 20 54 68 65 20 6e 74 68  rs long. The nth
15d20 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
15d30 65 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 64 69  e.** string indi
15d40 63 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  cates the column
15d50 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73   affinity that s
15d60 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
15d70 72 20 74 68 65 20 6e 74 68 0a 2a 2a 20 6d 65 6d  r the nth.** mem
15d80 6f 72 79 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ory cell in the 
15d90 72 61 6e 67 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f  range..*/.case O
15da0 50 5f 41 66 66 69 6e 69 74 79 3a 20 7b 0a 20 20  P_Affinity: {.  
15db0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66  const char *zAff
15dc0 69 6e 69 74 79 3b 20 20 20 2f 2a 20 54 68 65 20  inity;   /* The 
15dd0 61 66 66 69 6e 69 74 79 20 74 6f 20 62 65 20 61  affinity to be a
15de0 70 70 6c 69 65 64 20 2a 2f 0a 20 20 63 68 61 72  pplied */.  char
15df0 20 63 41 66 66 3b 20 20 20 20 20 20 20 20 20 20   cAff;          
15e00 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
15e10 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 66   character of af
15e20 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 7a 41 66  finity */..  zAf
15e30 66 69 6e 69 74 79 20 3d 20 70 4f 70 2d 3e 70 34  finity = pOp->p4
15e40 2e 7a 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 41  .z;.  assert( zA
15e50 66 66 69 6e 69 74 79 21 3d 30 20 29 3b 0a 20 20  ffinity!=0 );.  
15e60 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69 74  assert( zAffinit
15e70 79 5b 70 4f 70 2d 3e 70 32 5d 3d 3d 30 20 29 3b  y[pOp->p2]==0 );
15e80 0a 20 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b  .  pIn1 = &aMem[
15e90 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 77 68 69 6c  pOp->p1];.  whil
15ea0 65 28 20 28 63 41 66 66 20 3d 20 2a 28 7a 41 66  e( (cAff = *(zAf
15eb0 66 69 6e 69 74 79 2b 2b 29 29 21 3d 30 20 29 7b  finity++))!=0 ){
15ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
15ed0 31 20 3c 3d 20 26 70 2d 3e 61 4d 65 6d 5b 28 70  1 <= &p->aMem[(p
15ee0 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43  ->nMem+1 - p->nC
15ef0 75 72 73 6f 72 29 5d 20 29 3b 0a 20 20 20 20 61  ursor)] );.    a
15f00 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61 6c 69  ssert( memIsVali
15f10 64 28 70 49 6e 31 29 20 29 3b 0a 20 20 20 20 61  d(pIn1) );.    a
15f20 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 49 6e  pplyAffinity(pIn
15f30 31 2c 20 63 41 66 66 2c 20 65 6e 63 6f 64 69 6e  1, cAff, encodin
15f40 67 29 3b 0a 20 20 20 20 70 49 6e 31 2b 2b 3b 0a  g);.    pIn1++;.
15f50 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
15f60 2f 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 6b 65 52  /* Opcode: MakeR
15f70 65 63 6f 72 64 20 50 31 20 50 32 20 50 33 20 50  ecord P1 P2 P3 P
15f80 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
15f90 20 72 5b 50 33 5d 3d 6d 6b 72 65 63 28 72 5b 50   r[P3]=mkrec(r[P
15fa0 31 40 50 32 5d 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e  1@P2]).**.** Con
15fb0 76 65 72 74 20 50 32 20 72 65 67 69 73 74 65 72  vert P2 register
15fc0 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
15fd0 20 50 31 20 69 6e 74 6f 20 74 68 65 20 5b 72 65   P1 into the [re
15fe0 63 6f 72 64 20 66 6f 72 6d 61 74 5d 0a 2a 2a 20  cord format].** 
15ff0 75 73 65 20 61 73 20 61 20 64 61 74 61 20 72 65  use as a data re
16000 63 6f 72 64 20 69 6e 20 61 20 64 61 74 61 62 61  cord in a databa
16010 73 65 20 74 61 62 6c 65 20 6f 72 20 61 73 20 61  se table or as a
16020 20 6b 65 79 0a 2a 2a 20 69 6e 20 61 6e 20 69 6e   key.** in an in
16030 64 65 78 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c  dex.  The OP_Col
16040 75 6d 6e 20 6f 70 63 6f 64 65 20 63 61 6e 20 64  umn opcode can d
16050 65 63 6f 64 65 20 74 68 65 20 72 65 63 6f 72 64  ecode the record
16060 20 6c 61 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 50 34   later..**.** P4
16070 20 6d 61 79 20 62 65 20 61 20 73 74 72 69 6e 67   may be a string
16080 20 74 68 61 74 20 69 73 20 50 32 20 63 68 61 72   that is P2 char
16090 61 63 74 65 72 73 20 6c 6f 6e 67 2e 20 20 54 68  acters long.  Th
160a0 65 20 6e 74 68 20 63 68 61 72 61 63 74 65 72 20  e nth character 
160b0 6f 66 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67  of the.** string
160c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 63   indicates the c
160d0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74  olumn affinity t
160e0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
160f0 65 64 20 66 6f 72 20 74 68 65 20 6e 74 68 0a 2a  ed for the nth.*
16100 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  * field of the i
16110 6e 64 65 78 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  ndex key..**.** 
16120 54 68 65 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  The mapping from
16130 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 61 66   character to af
16140 66 69 6e 69 74 79 20 69 73 20 67 69 76 65 6e 20  finity is given 
16150 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  by the SQLITE_AF
16160 46 5f 0a 2a 2a 20 6d 61 63 72 6f 73 20 64 65 66  F_.** macros def
16170 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e  ined in sqliteIn
16180 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 34  t.h..**.** If P4
16190 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   is NULL then al
161a0 6c 20 69 6e 64 65 78 20 66 69 65 6c 64 73 20 68  l index fields h
161b0 61 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79  ave the affinity
161c0 20 42 4c 4f 42 2e 0a 2a 2f 0a 63 61 73 65 20 4f   BLOB..*/.case O
161d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 3a 20 7b 0a  P_MakeRecord: {.
161e0 20 20 75 38 20 2a 7a 4e 65 77 52 65 63 6f 72 64    u8 *zNewRecord
161f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75  ;        /* A bu
16200 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
16210 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65   data for the ne
16220 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 4d 65  w record */.  Me
16230 6d 20 2a 70 52 65 63 3b 20 20 20 20 20 20 20 20  m *pRec;        
16240 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
16250 72 65 63 6f 72 64 20 2a 2f 0a 20 20 75 36 34 20  record */.  u64 
16260 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  nData;          
16270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16280 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 73 70  bytes of data sp
16290 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64  ace */.  int nHd
162a0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
162b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
162c0 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70 61  es of header spa
162d0 63 65 20 2a 2f 0a 20 20 69 36 34 20 6e 42 79 74  ce */.  i64 nByt
162e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
162f0 2a 20 44 61 74 61 20 73 70 61 63 65 20 72 65 71  * Data space req
16300 75 69 72 65 64 20 66 6f 72 20 74 68 69 73 20 72  uired for this r
16310 65 63 6f 72 64 20 2a 2f 0a 20 20 69 36 34 20 6e  ecord */.  i64 n
16320 5a 65 72 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Zero;           
16330 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 7a    /* Number of z
16340 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
16350 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 63 6f   end of the reco
16360 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  rd */.  int nVar
16370 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  int;           /
16380 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
16390 73 20 69 6e 20 61 20 76 61 72 69 6e 74 20 2a 2f  s in a varint */
163a0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
163b0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 79 70  pe;       /* Typ
163c0 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 4d 65 6d  e field */.  Mem
163d0 20 2a 70 44 61 74 61 30 3b 20 20 20 20 20 20 20   *pData0;       
163e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 69 65      /* First fie
163f0 6c 64 20 74 6f 20 62 65 20 63 6f 6d 62 69 6e 65  ld to be combine
16400 64 20 69 6e 74 6f 20 74 68 65 20 72 65 63 6f 72  d into the recor
16410 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4c 61 73  d */.  Mem *pLas
16420 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
16430 20 4c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   Last field of t
16440 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
16450 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
16460 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16470 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  of fields in the
16480 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
16490 72 20 2a 7a 41 66 66 69 6e 69 74 79 3b 20 20 20  r *zAffinity;   
164a0 20 20 20 20 2f 2a 20 54 68 65 20 61 66 66 69 6e      /* The affin
164b0 69 74 79 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ity string for t
164c0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  he record */.  i
164d0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3b 20  nt file_format; 
164e0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 6f        /* File fo
164f0 72 6d 61 74 20 74 6f 20 75 73 65 20 66 6f 72 20  rmat to use for 
16500 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
16510 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
16520 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73       /* Space us
16530 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72 64  ed in zNewRecord
16540 5b 5d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  [] header */.  i
16550 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
16560 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 75        /* Space u
16570 73 65 64 20 69 6e 20 7a 4e 65 77 52 65 63 6f 72  sed in zNewRecor
16580 64 5b 5d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  d[] content */. 
16590 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
165a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
165b0 68 20 6f 66 20 61 20 66 69 65 6c 64 20 2a 2f 0a  h of a field */.
165c0 0a 20 20 2f 2a 20 41 73 73 75 6d 69 6e 67 20 74  .  /* Assuming t
165d0 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 61 69  he record contai
165e0 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 74 68 65  ns N fields, the
165f0 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 6c   record format l
16600 6f 6f 6b 73 0a 20 20 2a 2a 20 6c 69 6b 65 20 74  ooks.  ** like t
16610 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 2d  his:.  **.  ** -
16620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16660 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 7c 20 68  -------.  ** | h
16670 64 72 2d 73 69 7a 65 20 7c 20 74 79 70 65 20 30  dr-size | type 0
16680 20 7c 20 74 79 70 65 20 31 20 7c 20 2e 2e 2e 20   | type 1 | ... 
16690 7c 20 74 79 70 65 20 4e 2d 31 20 7c 20 64 61 74  | type N-1 | dat
166a0 61 30 20 7c 20 2e 2e 2e 20 7c 20 64 61 74 61 20  a0 | ... | data 
166b0 4e 2d 31 20 7c 20 0a 20 20 2a 2a 20 2d 2d 2d 2d  N-1 | .  ** ----
166c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16700 2d 2d 2d 2d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44  ----.  **.  ** D
16710 61 74 61 28 30 29 20 69 73 20 74 61 6b 65 6e 20  ata(0) is taken 
16720 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50 31  from register P1
16730 2e 20 20 44 61 74 61 28 31 29 20 63 6f 6d 65 73  .  Data(1) comes
16740 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 20 50   from register P
16750 31 2b 31 0a 20 20 2a 2a 20 61 6e 64 20 73 6f 20  1+1.  ** and so 
16760 66 6f 72 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  forth..  **.  **
16770 20 45 61 63 68 20 74 79 70 65 20 66 69 65 6c 64   Each type field
16780 20 69 73 20 61 20 76 61 72 69 6e 74 20 72 65 70   is a varint rep
16790 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 73 65  resenting the se
167a0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
167b0 20 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e   .  ** correspon
167c0 64 69 6e 67 20 64 61 74 61 20 65 6c 65 6d 65 6e  ding data elemen
167d0 74 20 28 73 65 65 20 73 71 6c 69 74 65 33 56 64  t (see sqlite3Vd
167e0 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 29 2e  beSerialType()).
167f0 20 54 68 65 0a 20 20 2a 2a 20 68 64 72 2d 73 69   The.  ** hdr-si
16800 7a 65 20 66 69 65 6c 64 20 69 73 20 61 6c 73 6f  ze field is also
16810 20 61 20 76 61 72 69 6e 74 20 77 68 69 63 68 20   a varint which 
16820 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 66 72  is the offset fr
16830 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
16840 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 72 65 63  .  ** of the rec
16850 6f 72 64 20 74 6f 20 64 61 74 61 30 2e 0a 20 20  ord to data0..  
16860 2a 2f 0a 20 20 6e 44 61 74 61 20 3d 20 30 3b 20  */.  nData = 0; 
16870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16880 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
16890 74 61 20 73 70 61 63 65 20 2a 2f 0a 20 20 6e 48  ta space */.  nH
168a0 64 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dr = 0;         
168b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
168c0 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 70  tes of header sp
168d0 61 63 65 20 2a 2f 0a 20 20 6e 5a 65 72 6f 20 3d  ace */.  nZero =
168e0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
168f0 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79  umber of zero by
16900 74 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tes at the end o
16910 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
16920 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f 70 2d 3e    nField = pOp->
16930 70 31 3b 0a 20 20 7a 41 66 66 69 6e 69 74 79 20  p1;.  zAffinity 
16940 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 61  = pOp->p4.z;.  a
16950 73 73 65 72 74 28 20 6e 46 69 65 6c 64 3e 30 20  ssert( nField>0 
16960 26 26 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20  && pOp->p2>0 && 
16970 70 4f 70 2d 3e 70 32 2b 6e 46 69 65 6c 64 3c 3d  pOp->p2+nField<=
16980 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
16990 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
169a0 70 44 61 74 61 30 20 3d 20 26 61 4d 65 6d 5b 6e  pData0 = &aMem[n
169b0 46 69 65 6c 64 5d 3b 0a 20 20 6e 46 69 65 6c 64  Field];.  nField
169c0 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 70 4c   = pOp->p2;.  pL
169d0 61 73 74 20 3d 20 26 70 44 61 74 61 30 5b 6e 46  ast = &pData0[nF
169e0 69 65 6c 64 2d 31 5d 3b 0a 20 20 66 69 6c 65 5f  ield-1];.  file_
169f0 66 6f 72 6d 61 74 20 3d 20 70 2d 3e 6d 69 6e 57  format = p->minW
16a00 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 3b 0a  riteFileFormat;.
16a10 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 74  .  /* Identify t
16a20 68 65 20 6f 75 74 70 75 74 20 72 65 67 69 73 74  he output regist
16a30 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
16a40 70 4f 70 2d 3e 70 33 3c 70 4f 70 2d 3e 70 31 20  pOp->p3<pOp->p1 
16a50 7c 7c 20 70 4f 70 2d 3e 70 33 3e 3d 70 4f 70 2d  || pOp->p3>=pOp-
16a60 3e 70 31 2b 70 4f 70 2d 3e 70 32 20 29 3b 0a 20  >p1+pOp->p2 );. 
16a70 20 70 4f 75 74 20 3d 20 26 61 4d 65 6d 5b 70 4f   pOut = &aMem[pO
16a80 70 2d 3e 70 33 5d 3b 0a 20 20 6d 65 6d 41 62 6f  p->p3];.  memAbo
16a90 75 74 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4f  utToChange(p, pO
16aa0 75 74 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 6c 79  ut);..  /* Apply
16ab0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 61   the requested a
16ac0 66 66 69 6e 69 74 79 20 74 6f 20 61 6c 6c 20 69  ffinity to all i
16ad0 6e 70 75 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  nputs.  */.  ass
16ae0 65 72 74 28 20 70 44 61 74 61 30 3c 3d 70 4c 61  ert( pData0<=pLa
16af0 73 74 20 29 3b 0a 20 20 69 66 28 20 7a 41 66 66  st );.  if( zAff
16b00 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 70 52 65  inity ){.    pRe
16b10 63 20 3d 20 70 44 61 74 61 30 3b 0a 20 20 20 20  c = pData0;.    
16b20 64 6f 7b 0a 20 20 20 20 20 20 61 70 70 6c 79 41  do{.      applyA
16b30 66 66 69 6e 69 74 79 28 70 52 65 63 2b 2b 2c 20  ffinity(pRec++, 
16b40 2a 28 7a 41 66 66 69 6e 69 74 79 2b 2b 29 2c 20  *(zAffinity++), 
16b50 65 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 20  encoding);.     
16b60 20 61 73 73 65 72 74 28 20 7a 41 66 66 69 6e 69   assert( zAffini
16b70 74 79 5b 30 5d 3d 3d 30 20 7c 7c 20 70 52 65 63  ty[0]==0 || pRec
16b80 3c 3d 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 7d  <=pLast );.    }
16b90 77 68 69 6c 65 28 20 7a 41 66 66 69 6e 69 74 79  while( zAffinity
16ba0 5b 30 5d 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  [0] );.  }..  /*
16bb0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
16bc0 65 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  e elements that 
16bd0 77 69 6c 6c 20 6d 61 6b 65 20 75 70 20 74 68 65  will make up the
16be0 20 72 65 63 6f 72 64 20 74 6f 20 66 69 67 75 72   record to figur
16bf0 65 0a 20 20 2a 2a 20 6f 75 74 20 68 6f 77 20 6d  e.  ** out how m
16c00 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
16c10 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 6e 65  uired for the ne
16c20 77 20 72 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  w record..  */. 
16c30 20 70 52 65 63 20 3d 20 70 4c 61 73 74 3b 0a 20   pRec = pLast;. 
16c40 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28   do{.    assert(
16c50 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 52 65 63   memIsValid(pRec
16c60 29 20 29 3b 0a 20 20 20 20 70 52 65 63 2d 3e 75  ) );.    pRec->u
16c70 54 65 6d 70 20 3d 20 73 65 72 69 61 6c 5f 74 79  Temp = serial_ty
16c80 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
16c90 53 65 72 69 61 6c 54 79 70 65 28 70 52 65 63 2c  SerialType(pRec,
16ca0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 26 6c   file_format, &l
16cb0 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  en);.    if( pRe
16cc0 63 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  c->flags & MEM_Z
16cd0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ero ){.      if(
16ce0 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   nData ){.      
16cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
16d00 65 4d 65 6d 45 78 70 61 6e 64 42 6c 6f 62 28 70  eMemExpandBlob(p
16d10 52 65 63 29 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  Rec) ) goto no_m
16d20 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
16d30 0a 20 20 20 20 20 20 20 20 6e 5a 65 72 6f 20 2b  .        nZero +
16d40 3d 20 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pRec->u.nZero;
16d50 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2d 3d 20  .        len -= 
16d60 70 52 65 63 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pRec->u.nZero;. 
16d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16d80 20 6e 44 61 74 61 20 2b 3d 20 6c 65 6e 3b 0a 20   nData += len;. 
16d90 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
16da0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 37 20 29 3b  ial_type==127 );
16db0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
16dc0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 38 20  erial_type==128 
16dd0 29 3b 0a 20 20 20 20 6e 48 64 72 20 2b 3d 20 73  );.    nHdr += s
16de0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 31 32 37 20  erial_type<=127 
16df0 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 56 61 72  ? 1 : sqlite3Var
16e00 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
16e10 70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65  pe);.    if( pRe
16e20 63 3d 3d 70 44 61 74 61 30 20 29 20 62 72 65 61  c==pData0 ) brea
16e30 6b 3b 0a 20 20 20 20 70 52 65 63 2d 2d 3b 0a 20  k;.    pRec--;. 
16e40 20 7d 77 68 69 6c 65 28 31 29 3b 0a 0a 20 20 2f   }while(1);..  /
16e50 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16e60 2d 32 32 35 36 34 2d 31 31 36 34 37 20 54 68 65  -22564-11647 The
16e70 20 68 65 61 64 65 72 20 62 65 67 69 6e 73 20 77   header begins w
16e80 69 74 68 20 61 20 73 69 6e 67 6c 65 20 76 61 72  ith a single var
16e90 69 6e 74 0a 20 20 2a 2a 20 77 68 69 63 68 20 64  int.  ** which d
16ea0 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 6f  etermines the to
16eb0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
16ec0 74 65 73 20 69 6e 20 74 68 65 20 68 65 61 64 65  tes in the heade
16ed0 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a 20 20  r. The varint.  
16ee0 2a 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  ** value is the 
16ef0 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
16f00 65 72 20 69 6e 20 62 79 74 65 73 20 69 6e 63 6c  er in bytes incl
16f10 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 76  uding the size v
16f20 61 72 69 6e 74 0a 20 20 2a 2a 20 69 74 73 65 6c  arint.  ** itsel
16f30 66 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  f. */.  testcase
16f40 28 20 6e 48 64 72 3d 3d 31 32 36 20 29 3b 0a 20  ( nHdr==126 );. 
16f50 20 74 65 73 74 63 61 73 65 28 20 6e 48 64 72 3d   testcase( nHdr=
16f60 3d 31 32 37 20 29 3b 0a 20 20 69 66 28 20 6e 48  =127 );.  if( nH
16f70 64 72 3c 3d 31 32 36 20 29 7b 0a 20 20 20 20 2f  dr<=126 ){.    /
16f80 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
16f90 65 20 2a 2f 0a 20 20 20 20 6e 48 64 72 20 2b 3d  e */.    nHdr +=
16fa0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
16fb0 20 2f 2a 20 52 61 72 65 20 63 61 73 65 20 6f 66   /* Rare case of
16fc0 20 61 20 72 65 61 6c 6c 79 20 6c 61 72 67 65 20   a really large 
16fd0 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 6e 56  header */.    nV
16fe0 61 72 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  arint = sqlite3V
16ff0 61 72 69 6e 74 4c 65 6e 28 6e 48 64 72 29 3b 0a  arintLen(nHdr);.
17000 20 20 20 20 6e 48 64 72 20 2b 3d 20 6e 56 61 72      nHdr += nVar
17010 69 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 56 61  int;.    if( nVa
17020 72 69 6e 74 3c 73 71 6c 69 74 65 33 56 61 72 69  rint<sqlite3Vari
17030 6e 74 4c 65 6e 28 6e 48 64 72 29 20 29 20 6e 48  ntLen(nHdr) ) nH
17040 64 72 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  dr++;.  }.  nByt
17050 65 20 3d 20 6e 48 64 72 2b 6e 44 61 74 61 3b 0a  e = nHdr+nData;.
17060 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 5a 65 72    if( nByte+nZer
17070 6f 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  o>db->aLimit[SQL
17080 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
17090 5d 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 6f  ] ){.    goto to
170a0 6f 5f 62 69 67 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  o_big;.  }..  /*
170b0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
170c0 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 68  utput register h
170d0 61 73 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  as a buffer larg
170e0 65 20 65 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72  e enough to stor
170f0 65 20 0a 20 20 2a 2a 20 74 68 65 20 6e 65 77 20  e .  ** the new 
17100 72 65 63 6f 72 64 2e 20 54 68 65 20 6f 75 74 70  record. The outp
17110 75 74 20 72 65 67 69 73 74 65 72 20 28 70 4f 70  ut register (pOp
17120 2d 3e 70 33 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ->p3) is not all
17130 6f 77 65 64 20 74 6f 0a 20 20 2a 2a 20 62 65 20  owed to.  ** be 
17140 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  one of the input
17150 20 72 65 67 69 73 74 65 72 73 20 28 62 65 63 61   registers (beca
17160 75 73 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  use the followin
17170 67 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 73  g call to.  ** s
17180 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
17190 61 72 41 6e 64 52 65 73 69 7a 65 28 29 20 63 6f  arAndResize() co
171a0 75 6c 64 20 63 6c 6f 62 62 65 72 20 74 68 65 20  uld clobber the 
171b0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 69 74 20  value before it 
171c0 69 73 20 75 73 65 64 29 2e 0a 20 20 2a 2f 0a 20  is used)..  */. 
171d0 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
171e0 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
171f0 65 28 70 4f 75 74 2c 20 28 69 6e 74 29 6e 42 79  e(pOut, (int)nBy
17200 74 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  te) ){.    goto 
17210 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 7a 4e  no_mem;.  }.  zN
17220 65 77 52 65 63 6f 72 64 20 3d 20 28 75 38 20 2a  ewRecord = (u8 *
17230 29 70 4f 75 74 2d 3e 7a 3b 0a 0a 20 20 2f 2a 20  )pOut->z;..  /* 
17240 57 72 69 74 65 20 74 68 65 20 72 65 63 6f 72 64  Write the record
17250 20 2a 2f 0a 20 20 69 20 3d 20 70 75 74 56 61 72   */.  i = putVar
17260 69 6e 74 33 32 28 7a 4e 65 77 52 65 63 6f 72 64  int32(zNewRecord
17270 2c 20 6e 48 64 72 29 3b 0a 20 20 6a 20 3d 20 6e  , nHdr);.  j = n
17280 48 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Hdr;.  assert( p
17290 44 61 74 61 30 3c 3d 70 4c 61 73 74 20 29 3b 0a  Data0<=pLast );.
172a0 20 20 70 52 65 63 20 3d 20 70 44 61 74 61 30 3b    pRec = pData0;
172b0 0a 20 20 64 6f 7b 0a 20 20 20 20 73 65 72 69 61  .  do{.    seria
172c0 6c 5f 74 79 70 65 20 3d 20 70 52 65 63 2d 3e 75  l_type = pRec->u
172d0 54 65 6d 70 3b 0a 20 20 20 20 2f 2a 20 45 56 49  Temp;.    /* EVI
172e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 35 32  DENCE-OF: R-0652
172f0 39 2d 34 37 33 36 32 20 46 6f 6c 6c 6f 77 69 6e  9-47362 Followin
17300 67 20 74 68 65 20 73 69 7a 65 20 76 61 72 69 6e  g the size varin
17310 74 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  t are one or mor
17320 65 0a 20 20 20 20 2a 2a 20 61 64 64 69 74 69 6f  e.    ** additio
17330 6e 61 6c 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65  nal varints, one
17340 20 70 65 72 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   per column. */.
17350 20 20 20 20 69 20 2b 3d 20 70 75 74 56 61 72 69      i += putVari
17360 6e 74 33 32 28 26 7a 4e 65 77 52 65 63 6f 72 64  nt32(&zNewRecord
17370 5b 69 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [i], serial_type
17380 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
17390 20 73 65 72 69 61 6c 20 74 79 70 65 20 2a 2f 0a   serial type */.
173a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
173b0 4f 46 3a 20 52 2d 36 34 35 33 36 2d 35 31 37 32  OF: R-64536-5172
173c0 38 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72  8 The values for
173d0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20   each column in 
173e0 74 68 65 20 72 65 63 6f 72 64 0a 20 20 20 20 2a  the record.    *
173f0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
17400 6c 6c 6f 77 20 74 68 65 20 68 65 61 64 65 72 2e  llow the header.
17410 20 2a 2f 0a 20 20 20 20 6a 20 2b 3d 20 73 71 6c   */.    j += sql
17420 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
17430 74 28 26 7a 4e 65 77 52 65 63 6f 72 64 5b 6a 5d  t(&zNewRecord[j]
17440 2c 20 70 52 65 63 2c 20 73 65 72 69 61 6c 5f 74  , pRec, serial_t
17450 79 70 65 29 3b 20 2f 2a 20 63 6f 6e 74 65 6e 74  ype); /* content
17460 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 28 2b   */.  }while( (+
17470 2b 70 52 65 63 29 3c 3d 70 4c 61 73 74 20 29 3b  +pRec)<=pLast );
17480 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 48  .  assert( i==nH
17490 64 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dr );.  assert( 
174a0 6a 3d 3d 6e 42 79 74 65 20 29 3b 0a 0a 20 20 61  j==nByte );..  a
174b0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
174c0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
174d0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
174e0 72 73 6f 72 29 20 29 3b 0a 20 20 70 4f 75 74 2d  rsor) );.  pOut-
174f0 3e 6e 20 3d 20 28 69 6e 74 29 6e 42 79 74 65 3b  >n = (int)nByte;
17500 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d  .  pOut->flags =
17510 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 69 66 28   MEM_Blob;.  if(
17520 20 6e 5a 65 72 6f 20 29 7b 0a 20 20 20 20 70 4f   nZero ){.    pO
17530 75 74 2d 3e 75 2e 6e 5a 65 72 6f 20 3d 20 6e 5a  ut->u.nZero = nZ
17540 65 72 6f 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 66  ero;.    pOut->f
17550 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 5a 65 72 6f  lags |= MEM_Zero
17560 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 65 6e  ;.  }.  pOut->en
17570 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
17580 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65    /* In case the
17590 20 62 6c 6f 62 20 69 73 20 65 76 65 72 20 63 6f   blob is ever co
175a0 6e 76 65 72 74 65 64 20 74 6f 20 74 65 78 74 20  nverted to text 
175b0 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  */.  REGISTER_TR
175c0 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4f 75  ACE(pOp->p3, pOu
175d0 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41 58  t);.  UPDATE_MAX
175e0 5f 42 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b  _BLOBSIZE(pOut);
175f0 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
17600 4f 70 63 6f 64 65 3a 20 43 6f 75 6e 74 20 50 31  Opcode: Count P1
17610 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
17620 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 63 6f 75  opsis: r[P2]=cou
17630 6e 74 28 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65  nt().**.** Store
17640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
17650 6e 74 72 69 65 73 20 28 61 6e 20 69 6e 74 65 67  ntries (an integ
17660 65 72 20 76 61 6c 75 65 29 20 69 6e 20 74 68 65  er value) in the
17670 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
17680 0a 2a 2a 20 6f 70 65 6e 65 64 20 62 79 20 63 75  .** opened by cu
17690 72 73 6f 72 20 50 31 20 69 6e 20 72 65 67 69 73  rsor P1 in regis
176a0 74 65 72 20 50 32 0a 2a 2f 0a 23 69 66 6e 64 65  ter P2.*/.#ifnde
176b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
176c0 52 45 45 43 4f 55 4e 54 0a 63 61 73 65 20 4f 50  REECOUNT.case OP
176d0 5f 43 6f 75 6e 74 3a 20 7b 20 20 20 20 20 20 20  _Count: {       
176e0 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69    /* out2 */.  i
176f0 36 34 20 6e 45 6e 74 72 79 3b 0a 20 20 42 74 43  64 nEntry;.  BtC
17700 75 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 0a 20  ursor *pCrsr;.. 
17710 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
17720 72 5b 70 4f 70 2d 3e 70 31 5d 2d 3e 65 43 75 72  r[pOp->p1]->eCur
17730 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17740 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20 3d  REE );.  pCrsr =
17750 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
17760 31 5d 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  1]->uc.pCursor;.
17770 20 20 61 73 73 65 72 74 28 20 70 43 72 73 72 20    assert( pCrsr 
17780 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 30 3b  );.  nEntry = 0;
17790 20 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e    /* Not needed.
177a0 20 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73    Only used to s
177b0 69 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67  ilence a warning
177c0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
177d0 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28 70 43  te3BtreeCount(pC
177e0 72 73 72 2c 20 26 6e 45 6e 74 72 79 29 3b 0a 20  rsr, &nEntry);. 
177f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
17800 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
17810 72 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  r;.  pOut = out2
17820 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
17830 70 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  p);.  pOut->u.i 
17840 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 62 72 65 61  = nEntry;.  brea
17850 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  k;.}.#endif../* 
17860 4f 70 63 6f 64 65 3a 20 53 61 76 65 70 6f 69 6e  Opcode: Savepoin
17870 74 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  t P1 * * P4 *.**
17880 0a 2a 2a 20 4f 70 65 6e 2c 20 72 65 6c 65 61 73  .** Open, releas
17890 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e or rollback th
178a0 65 20 73 61 76 65 70 6f 69 6e 74 20 6e 61 6d 65  e savepoint name
178b0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 50  d by parameter P
178c0 34 2c 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20  4, depending.** 
178d0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
178e0 50 31 2e 20 54 6f 20 6f 70 65 6e 20 61 20 6e 65  P1. To open a ne
178f0 77 20 73 61 76 65 70 6f 69 6e 74 2c 20 50 31 3d  w savepoint, P1=
17900 3d 30 2e 20 54 6f 20 72 65 6c 65 61 73 65 20 28  =0. To release (
17910 63 6f 6d 6d 69 74 29 20 61 6e 0a 2a 2a 20 65 78  commit) an.** ex
17920 69 73 74 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  isting savepoint
17930 2c 20 50 31 3d 3d 31 2c 20 6f 72 20 74 6f 20 72  , P1==1, or to r
17940 6f 6c 6c 62 61 63 6b 20 61 6e 20 65 78 69 73 74  ollback an exist
17950 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20 50 31  ing savepoint P1
17960 3d 3d 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ==2..*/.case OP_
17970 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 69  Savepoint: {.  i
17980 6e 74 20 70 31 3b 20 20 20 20 20 20 20 20 20 20  nt p1;          
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
179a0 2a 20 56 61 6c 75 65 20 6f 66 20 50 31 20 6f 70  * Value of P1 op
179b0 65 72 61 6e 64 20 2a 2f 0a 20 20 63 68 61 72 20  erand */.  char 
179c0 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
179d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
179e0 6d 65 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 20  me of savepoint 
179f0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  */.  int nName;.
17a00 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 4e 65    Savepoint *pNe
17a10 77 3b 0a 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  w;.  Savepoint *
17a20 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 53 61  pSavepoint;.  Sa
17a30 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 3b 0a 20  vepoint *pTmp;. 
17a40 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 3b   int iSavepoint;
17a50 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 70 31  .  int ii;..  p1
17a60 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 7a 4e   = pOp->p1;.  zN
17a70 61 6d 65 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  ame = pOp->p4.z;
17a80 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
17a90 61 74 20 74 68 65 20 70 31 20 70 61 72 61 6d 65  at the p1 parame
17aa0 74 65 72 20 69 73 20 76 61 6c 69 64 2e 20 41 6c  ter is valid. Al
17ab0 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 72 65  so that if there
17ac0 20 69 73 20 6e 6f 20 6f 70 65 6e 0a 20 20 2a 2a   is no open.  **
17ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
17ae0 65 6e 20 74 68 65 72 65 20 63 61 6e 6e 6f 74 20  en there cannot 
17af0 62 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  be any savepoint
17b00 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  s. .  */.  asser
17b10 74 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  t( db->pSavepoin
17b20 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  t==0 || db->auto
17b30 43 6f 6d 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 61  Commit==0 );.  a
17b40 73 73 65 72 74 28 20 70 31 3d 3d 53 41 56 45 50  ssert( p1==SAVEP
17b50 4f 49 4e 54 5f 42 45 47 49 4e 7c 7c 70 31 3d 3d  OINT_BEGIN||p1==
17b60 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
17b70 45 7c 7c 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54  E||p1==SAVEPOINT
17b80 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
17b90 73 73 65 72 74 28 20 64 62 2d 3e 70 53 61 76 65  ssert( db->pSave
17ba0 70 6f 69 6e 74 20 7c 7c 20 64 62 2d 3e 69 73 54  point || db->isT
17bb0 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
17bc0 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  int==0 );.  asse
17bd0 72 74 28 20 63 68 65 63 6b 53 61 76 65 70 6f 69  rt( checkSavepoi
17be0 6e 74 43 6f 75 6e 74 28 64 62 29 20 29 3b 0a 20  ntCount(db) );. 
17bf0 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
17c00 65 61 64 65 72 20 29 3b 0a 0a 20 20 69 66 28 20  eader );..  if( 
17c10 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 42 45  p1==SAVEPOINT_BE
17c20 47 49 4e 20 29 7b 0a 20 20 20 20 69 66 28 20 64  GIN ){.    if( d
17c30 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20  b->nVdbeWrite>0 
17c40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 65  ){.      /* A ne
17c50 77 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 6e  w savepoint cann
17c60 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 69 66  ot be created if
17c70 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
17c80 65 20 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a  e write .      *
17c90 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 28 69 2e  * statements (i.
17ca0 65 2e 20 6f 70 65 6e 20 72 65 61 64 2f 77 72 69  e. open read/wri
17cb0 74 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  te incremental b
17cc0 6c 6f 62 20 68 61 6e 64 6c 65 73 29 2e 0a 20 20  lob handles)..  
17cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
17ce0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
17cf0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 61   "cannot open sa
17d00 76 65 70 6f 69 6e 74 20 2d 20 53 51 4c 20 73 74  vepoint - SQL st
17d10 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67  atements in prog
17d20 72 65 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63  ress");.      rc
17d30 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17d50 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
17d60 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
17d70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17d80 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
17d90 4c 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  LE.      /* This
17da0 20 63 61 6c 6c 20 69 73 20 4f 6b 20 65 76 65 6e   call is Ok even
17db0 20 69 66 20 74 68 69 73 20 73 61 76 65 70 6f 69   if this savepoi
17dc0 6e 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  nt is actually a
17dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
17de0 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20     ** savepoint 
17df0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 73  (and therefore s
17e00 68 6f 75 6c 64 20 6e 6f 74 20 70 72 6f 6d 70 74  hould not prompt
17e10 20 78 53 61 76 65 70 6f 69 6e 74 28 29 29 20 63   xSavepoint()) c
17e20 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 20 20 20 20  allbacks..      
17e30 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
17e40 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
17e50 70 6f 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 6e  point being open
17e60 65 64 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  ed, it is guaran
17e70 74 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 68  teed.      ** th
17e80 61 74 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  at the db->aVTra
17e90 6e 73 5b 5d 20 61 72 72 61 79 20 69 73 20 65 6d  ns[] array is em
17ea0 70 74 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  pty.  */.      a
17eb0 73 73 65 72 74 28 20 64 62 2d 3e 61 75 74 6f 43  ssert( db->autoC
17ec0 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
17ed0 6e 56 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20 20  nVTrans==0 );.  
17ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17ef0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
17f00 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49  , SAVEPOINT_BEGI
17f10 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N,.             
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
17f40 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
17f50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
17f70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
17f80 72 72 6f 72 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rror;.#endif..  
17f90 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
17fa0 6e 65 77 20 73 61 76 65 70 6f 69 6e 74 20 73 74  new savepoint st
17fb0 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20  ructure. */.    
17fc0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
17fd0 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
17fe0 2c 20 73 69 7a 65 6f 66 28 53 61 76 65 70 6f 69  , sizeof(Savepoi
17ff0 6e 74 29 2b 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  nt)+nName+1);.  
18000 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
18010 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e          pNew->zN
18020 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 26 70  ame = (char *)&p
18030 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  New[1];.        
18040 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 4e 61  memcpy(pNew->zNa
18050 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
18060 2b 31 29 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  +1);.    .      
18070 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
18080 20 6e 6f 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   no open transac
18090 74 69 6f 6e 2c 20 74 68 65 6e 20 6d 61 72 6b 20  tion, then mark 
180a0 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
180b0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 74 72  l.        ** "tr
180c0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
180d0 69 6e 74 22 2e 20 2a 2f 0a 20 20 20 20 20 20 20  int". */.       
180e0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
180f0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mit ){.         
18100 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
18110 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
18120 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
18130 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b 0a 20  Savepoint = 1;. 
18140 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18150 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 53 61 76          db->nSav
18160 65 70 6f 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  epoint++;.      
18170 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
18180 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 73 61 76  Link the new sav
18190 65 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20  epoint into the 
181a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 27  database handle'
181b0 73 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20  s list. */.     
181c0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
181d0 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
181e0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53 61  .        db->pSa
181f0 76 65 70 6f 69 6e 74 20 3d 20 70 4e 65 77 3b 0a  vepoint = pNew;.
18200 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 44          pNew->nD
18210 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 64 62  eferredCons = db
18220 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3b  ->nDeferredCons;
18230 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
18240 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
18250 3d 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  = db->nDeferredI
18260 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 20 20 7d 0a  mmCons;.      }.
18270 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
18280 20 20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20     iSavepoint = 
18290 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  0;..    /* Find 
182a0 74 68 65 20 6e 61 6d 65 64 20 73 61 76 65 70 6f  the named savepo
182b0 69 6e 74 2e 20 49 66 20 74 68 65 72 65 20 69 73  int. If there is
182c0 20 6e 6f 20 73 75 63 68 20 73 61 76 65 70 6f 69   no such savepoi
182d0 6e 74 2c 20 74 68 65 6e 20 61 6e 0a 20 20 20 20  nt, then an.    
182e0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ** an error is r
182f0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
18300 73 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ser.  */.    for
18310 28 0a 20 20 20 20 20 20 70 53 61 76 65 70 6f 69  (.      pSavepoi
18320 6e 74 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  nt = db->pSavepo
18330 69 6e 74 3b 20 0a 20 20 20 20 20 20 70 53 61 76  int; .      pSav
18340 65 70 6f 69 6e 74 20 26 26 20 73 71 6c 69 74 65  epoint && sqlite
18350 33 53 74 72 49 43 6d 70 28 70 53 61 76 65 70 6f  3StrICmp(pSavepo
18360 69 6e 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  int->zName, zNam
18370 65 29 3b 0a 20 20 20 20 20 20 70 53 61 76 65 70  e);.      pSavep
18380 6f 69 6e 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  oint = pSavepoin
18390 74 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 7b 0a  t->pNext.    ){.
183a0 20 20 20 20 20 20 69 53 61 76 65 70 6f 69 6e 74        iSavepoint
183b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
183c0 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  ( !pSavepoint ){
183d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
183e0 62 65 45 72 72 6f 72 28 70 2c 20 22 6e 6f 20 73  beError(p, "no s
183f0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 3a 20 25  uch savepoint: %
18400 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
18410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
18420 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
18430 66 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  f( db->nVdbeWrit
18440 65 3e 30 20 26 26 20 70 31 3d 3d 53 41 56 45 50  e>0 && p1==SAVEP
18450 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a  OINT_RELEASE ){.
18460 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
18470 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  ot possible to r
18480 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
18490 61 20 73 61 76 65 70 6f 69 6e 74 20 69 66 20 74  a savepoint if t
184a0 68 65 72 65 20 61 72 65 20 0a 20 20 20 20 20 20  here are .      
184b0 2a 2a 20 61 63 74 69 76 65 20 77 72 69 74 65 20  ** active write 
184c0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
184d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
184e0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
184f0 63 61 6e 6e 6f 74 20 72 65 6c 65 61 73 65 20 73  cannot release s
18500 61 76 65 70 6f 69 6e 74 20 2d 20 22 0a 20 20 20  avepoint - ".   
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 20 20 22 53 51 4c 20 73 74 61 74         "SQL stat
18530 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
18540 73 73 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss");.      rc =
18550 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18560 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20    }else{..      
18570 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  /* Determine whe
18580 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
18590 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
185a0 6e 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20  n savepoint. If 
185b0 73 6f 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  so,.      ** and
185c0 20 74 68 69 73 20 69 73 20 61 20 52 45 4c 45 41   this is a RELEA
185d0 53 45 20 63 6f 6d 6d 61 6e 64 2c 20 74 68 65 6e  SE command, then
185e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
185f0 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  nsaction .      
18600 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  ** is committed.
18610 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
18620 20 69 6e 74 20 69 73 54 72 61 6e 73 61 63 74 69   int isTransacti
18630 6f 6e 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  on = pSavepoint-
18640 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 64 62 2d  >pNext==0 && db-
18650 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
18660 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 20 20 69  vepoint;.      i
18670 66 28 20 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  f( isTransaction
18680 20 26 26 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e   && p1==SAVEPOIN
18690 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
186a0 20 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73       if( (rc = s
186b0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
186c0 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  k(p, 1))!=SQLITE
186d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
186e0 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
186f0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
18700 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
18710 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
18720 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
18730 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45 5f  Halt(p)==SQLITE_
18740 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
18750 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28    p->pc = (int)(
18760 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20  pOp - aOp);.    
18770 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
18780 6d 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  mmit = 0;.      
18790 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d      p->rc = rc =
187a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
187b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 76 64 62          goto vdb
187c0 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  e_return;.      
187d0 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2d 3e    }.        db->
187e0 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
187f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  epoint = 0;.    
18800 20 20 20 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a      rc = p->rc;.
18810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18820 20 20 20 20 20 69 6e 74 20 69 73 53 63 68 65 6d       int isSchem
18830 61 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 20  aChange;.       
18840 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 64 62   iSavepoint = db
18850 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 69  ->nSavepoint - i
18860 53 61 76 65 70 6f 69 6e 74 20 2d 20 31 3b 0a 20  Savepoint - 1;. 
18870 20 20 20 20 20 20 20 69 66 28 20 70 31 3d 3d 53         if( p1==S
18880 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
18890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
188a0 73 53 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20  sSchemaChange = 
188b0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
188c0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
188d0 73 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  s)!=0;.         
188e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 64 62   for(ii=0; ii<db
188f0 2d 3e 6e 44 62 3b 20 69 69 2b 2b 29 7b 0a 20 20  ->nDb; ii++){.  
18900 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
18910 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18920 6c 6c 43 75 72 73 6f 72 73 28 64 62 2d 3e 61 44  llCursors(db->aD
18930 62 5b 69 69 5d 2e 70 42 74 2c 0a 20 20 20 20 20  b[ii].pBt,.     
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52    SQLITE_ABORT_R
18970 4f 4c 4c 42 41 43 4b 2c 0a 20 20 20 20 20 20 20  OLLBACK,.       
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65 3d 3d  isSchemaChange==
189b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
189c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
189d0 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64  K ) goto abort_d
189e0 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20  ue_to_error;.   
189f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18a10 20 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65    isSchemaChange
18a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
18a30 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
18a40 3b 20 69 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 69  ; ii<db->nDb; ii
18a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ++){.          r
18a60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18a70 53 61 76 65 70 6f 69 6e 74 28 64 62 2d 3e 61 44  Savepoint(db->aD
18a80 62 5b 69 69 5d 2e 70 42 74 2c 20 70 31 2c 20 69  b[ii].pBt, p1, i
18a90 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
18aa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ac0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62 6f 72         goto abor
18ad0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
18ae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18b00 28 20 69 73 53 63 68 65 6d 61 43 68 61 6e 67 65  ( isSchemaChange
18b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
18b20 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
18b30 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
18b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18b50 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
18b60 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
18b70 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
18b80 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e  b->flags = (db->
18b90 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49  flags | SQLITE_I
18ba0 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20  nternChanges);. 
18bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18bc0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 67  .  .      /* Reg
18bd0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
18be0 65 72 20 74 68 69 73 20 69 73 20 61 20 52 45 4c  er this is a REL
18bf0 45 41 53 45 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EASE or ROLLBACK
18c00 2c 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 0a 20  , destroy all . 
18c10 20 20 20 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e       ** savepoin
18c20 74 73 20 6e 65 73 74 65 64 20 69 6e 73 69 64 65  ts nested inside
18c30 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
18c40 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74 65 64  t being operated
18c50 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 77 68   on. */.      wh
18c60 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ile( db->pSavepo
18c70 69 6e 74 21 3d 70 53 61 76 65 70 6f 69 6e 74 20  int!=pSavepoint 
18c80 29 7b 0a 20 20 20 20 20 20 20 20 70 54 6d 70 20  ){.        pTmp 
18c90 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
18ca0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 70 53  ;.        db->pS
18cb0 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
18cc0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
18cd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18ce0 2c 20 70 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  , pTmp);.       
18cf0 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 2d   db->nSavepoint-
18d00 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  -;.      }..    
18d10 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 61 20    /* If it is a 
18d20 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 64 65  RELEASE, then de
18d30 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f  stroy the savepo
18d40 69 6e 74 20 62 65 69 6e 67 20 6f 70 65 72 61 74  int being operat
18d50 65 64 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20  ed on .      ** 
18d60 74 6f 6f 2e 20 49 66 20 69 74 20 69 73 20 61 20  too. If it is a 
18d70 52 4f 4c 4c 42 41 43 4b 20 54 4f 2c 20 74 68 65  ROLLBACK TO, the
18d80 6e 20 73 65 74 20 74 68 65 20 6e 75 6d 62 65 72  n set the number
18d90 20 6f 66 20 64 65 66 65 72 72 65 64 20 0a 20 20   of deferred .  
18da0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
18db0 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 70 72 65  t violations pre
18dc0 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61  sent in the data
18dd0 62 61 73 65 20 74 6f 20 74 68 65 20 76 61 6c 75  base to the valu
18de0 65 20 73 74 6f 72 65 64 0a 20 20 20 20 20 20 2a  e stored.      *
18df0 2a 20 77 68 65 6e 20 74 68 65 20 73 61 76 65 70  * when the savep
18e00 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64  oint was created
18e10 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
18e20 70 31 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  p1==SAVEPOINT_RE
18e30 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 20  LEASE ){.       
18e40 20 61 73 73 65 72 74 28 20 70 53 61 76 65 70 6f   assert( pSavepo
18e50 69 6e 74 3d 3d 64 62 2d 3e 70 53 61 76 65 70 6f  int==db->pSavepo
18e60 69 6e 74 20 29 3b 0a 20 20 20 20 20 20 20 20 64  int );.        d
18e70 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->pSavepoint = 
18e80 70 53 61 76 65 70 6f 69 6e 74 2d 3e 70 4e 65 78  pSavepoint->pNex
18e90 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
18ea0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 61  e3DbFree(db, pSa
18eb0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
18ec0 20 20 69 66 28 20 21 69 73 54 72 61 6e 73 61 63    if( !isTransac
18ed0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
18ee0 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
18ef0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
18f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18f10 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
18f20 43 6f 6e 73 20 3d 20 70 53 61 76 65 70 6f 69 6e  Cons = pSavepoin
18f30 74 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  t->nDeferredCons
18f40 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44  ;.        db->nD
18f50 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
18f60 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 44 65   pSavepoint->nDe
18f70 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20  ferredImmCons;. 
18f80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
18f90 28 20 21 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  ( !isTransaction
18fa0 20 7c 7c 20 70 31 3d 3d 53 41 56 45 50 4f 49 4e   || p1==SAVEPOIN
18fb0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
18fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18fd0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
18fe0 64 62 2c 20 70 31 2c 20 69 53 61 76 65 70 6f 69  db, p1, iSavepoi
18ff0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
19000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19010 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
19020 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  to_error;.      
19030 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
19040 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
19050 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
19060 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20  .  break;.}../* 
19070 4f 70 63 6f 64 65 3a 20 41 75 74 6f 43 6f 6d 6d  Opcode: AutoComm
19080 69 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a  it P1 P2 * * *.*
19090 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 61 74  *.** Set the dat
190a0 61 62 61 73 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  abase auto-commi
190b0 74 20 66 6c 61 67 20 74 6f 20 50 31 20 28 31 20  t flag to P1 (1 
190c0 6f 72 20 30 29 2e 20 49 66 20 50 32 20 69 73 20  or 0). If P2 is 
190d0 74 72 75 65 2c 20 72 6f 6c 6c 0a 2a 2a 20 62 61  true, roll.** ba
190e0 63 6b 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79  ck any currently
190f0 20 61 63 74 69 76 65 20 62 74 72 65 65 20 74 72   active btree tr
19100 61 6e 73 61 63 74 69 6f 6e 73 2e 20 49 66 20 74  ansactions. If t
19110 68 65 72 65 20 61 72 65 20 61 6e 79 20 61 63 74  here are any act
19120 69 76 65 0a 2a 2a 20 56 4d 73 20 28 61 70 61 72  ive.** VMs (apar
19130 74 20 66 72 6f 6d 20 74 68 69 73 20 6f 6e 65 29  t from this one)
19140 2c 20 74 68 65 6e 20 61 20 52 4f 4c 4c 42 41 43  , then a ROLLBAC
19150 4b 20 66 61 69 6c 73 2e 20 20 41 20 43 4f 4d 4d  K fails.  A COMM
19160 49 54 20 66 61 69 6c 73 20 69 66 0a 2a 2a 20 74  IT fails if.** t
19170 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
19180 77 72 69 74 69 6e 67 20 56 4d 73 20 6f 72 20 61  writing VMs or a
19190 63 74 69 76 65 20 56 4d 73 20 74 68 61 74 20 75  ctive VMs that u
191a0 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
191b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73 74  .**.** This inst
191c0 72 75 63 74 69 6f 6e 20 63 61 75 73 65 73 20 74  ruction causes t
191d0 68 65 20 56 4d 20 74 6f 20 68 61 6c 74 2e 0a 2a  he VM to halt..*
191e0 2f 0a 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f  /.case OP_AutoCo
191f0 6d 6d 69 74 3a 20 7b 0a 20 20 69 6e 74 20 64 65  mmit: {.  int de
19200 73 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3b  siredAutoCommit;
19210 0a 20 20 69 6e 74 20 69 52 6f 6c 6c 62 61 63 6b  .  int iRollback
19220 3b 0a 0a 20 20 64 65 73 69 72 65 64 41 75 74 6f  ;..  desiredAuto
19230 43 6f 6d 6d 69 74 20 3d 20 70 4f 70 2d 3e 70 31  Commit = pOp->p1
19240 3b 0a 20 20 69 52 6f 6c 6c 62 61 63 6b 20 3d 20  ;.  iRollback = 
19250 70 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72  pOp->p2;.  asser
19260 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  t( desiredAutoCo
19270 6d 6d 69 74 3d 3d 31 20 7c 7c 20 64 65 73 69 72  mmit==1 || desir
19280 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  edAutoCommit==0 
19290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 73  );.  assert( des
192a0 69 72 65 64 41 75 74 6f 43 6f 6d 6d 69 74 3d 3d  iredAutoCommit==
192b0 31 20 7c 7c 20 69 52 6f 6c 6c 62 61 63 6b 3d 3d  1 || iRollback==
192c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
192d0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
192e0 20 29 3b 20 20 2f 2a 20 41 74 20 6c 65 61 73 74   );  /* At least
192f0 20 74 68 69 73 20 6f 6e 65 20 56 4d 20 69 73 20   this one VM is 
19300 61 63 74 69 76 65 20 2a 2f 0a 20 20 61 73 73 65  active */.  asse
19310 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  rt( p->bIsReader
19320 20 29 3b 0a 0a 20 20 69 66 28 20 64 65 73 69 72   );..  if( desir
19330 65 64 41 75 74 6f 43 6f 6d 6d 69 74 21 3d 64 62  edAutoCommit!=db
19340 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
19350 20 20 20 20 69 66 28 20 69 52 6f 6c 6c 62 61 63      if( iRollbac
19360 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
19370 74 28 20 64 65 73 69 72 65 64 41 75 74 6f 43 6f  t( desiredAutoCo
19380 6d 6d 69 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  mmit==1 );.     
19390 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
193a0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
193b0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
193c0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
193d0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  mmit = 1;.    }e
193e0 6c 73 65 20 69 66 28 20 64 65 73 69 72 65 64 41  lse if( desiredA
193f0 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
19400 3e 6e 56 64 62 65 57 72 69 74 65 3e 30 20 29 7b  >nVdbeWrite>0 ){
19410 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
19420 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6d  s instruction im
19430 70 6c 65 6d 65 6e 74 73 20 61 20 43 4f 4d 4d 49  plements a COMMI
19440 54 20 61 6e 64 20 6f 74 68 65 72 20 56 4d 73 20  T and other VMs 
19450 61 72 65 20 77 72 69 74 69 6e 67 0a 20 20 20 20  are writing.    
19460 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 65    ** return an e
19470 72 72 6f 72 20 69 6e 64 69 63 61 74 69 6e 67 20  rror indicating 
19480 74 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 56  that the other V
19490 4d 73 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  Ms must complete
194a0 20 66 69 72 73 74 2e 20 0a 20 20 20 20 20 20 2a   first. .      *
194b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
194c0 64 62 65 45 72 72 6f 72 28 70 2c 20 22 63 61 6e  dbeError(p, "can
194d0 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73  not commit trans
194e0 61 63 74 69 6f 6e 20 2d 20 22 0a 20 20 20 20 20  action - ".     
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 20 22 53 51 4c 20 73 74 61 74 65 6d       "SQL statem
19510 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ents in progress
19520 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ");.      rc = S
19530 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
19540 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
19550 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
19560 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73  else if( (rc = s
19570 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
19580 6b 28 70 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  k(p, 1))!=SQLITE
19590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
195a0 6f 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20  o vdbe_return;. 
195b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
195c0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
195d0 20 28 75 38 29 64 65 73 69 72 65 64 41 75 74 6f   (u8)desiredAuto
195e0 43 6f 6d 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  Commit;.    }.  
195f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
19600 65 48 61 6c 74 28 70 29 3d 3d 53 51 4c 49 54 45  eHalt(p)==SQLITE
19610 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 70  _BUSY ){.      p
19620 2d 3e 70 63 20 3d 20 28 69 6e 74 29 28 70 4f 70  ->pc = (int)(pOp
19630 20 2d 20 61 4f 70 29 3b 0a 20 20 20 20 20 20 64   - aOp);.      d
19640 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
19650 28 75 38 29 28 31 2d 64 65 73 69 72 65 64 41 75  (u8)(1-desiredAu
19660 74 6f 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20  toCommit);.     
19670 20 70 2d 3e 72 63 20 3d 20 72 63 20 3d 20 53 51   p->rc = rc = SQ
19680 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
19690 20 67 6f 74 6f 20 76 64 62 65 5f 72 65 74 75 72   goto vdbe_retur
196a0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
196b0 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
196c0 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ent==0 );.    sq
196d0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
196e0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 69 66  ints(db);.    if
196f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
19710 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
19720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19730 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
19740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
19750 20 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20   vdbe_return;.  
19760 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
19770 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20  e3VdbeError(p,. 
19780 20 20 20 20 20 20 20 28 21 64 65 73 69 72 65 64         (!desired
19790 41 75 74 6f 43 6f 6d 6d 69 74 29 3f 22 63 61 6e  AutoCommit)?"can
197a0 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  not start a tran
197b0 73 61 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61  saction within a
197c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 3a 28 0a   transaction":(.
197d0 20 20 20 20 20 20 20 20 28 69 52 6f 6c 6c 62 61          (iRollba
197e0 63 6b 29 3f 22 63 61 6e 6e 6f 74 20 72 6f 6c 6c  ck)?"cannot roll
197f0 62 61 63 6b 20 2d 20 6e 6f 20 74 72 61 6e 73 61  back - no transa
19800 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22  ction is active"
19810 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
19820 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 6f 6d       "cannot com
19830 6d 69 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63  mit - no transac
19840 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 22 29  tion is active")
19850 29 3b 0a 20 20 20 20 20 20 20 20 20 0a 20 20 20  );.         .   
19860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
19870 4f 52 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f  OR;.    goto abo
19880 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
19890 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
198a0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 54 72 61 6e  ./* Opcode: Tran
198b0 73 61 63 74 69 6f 6e 20 50 31 20 50 32 20 50 33  saction P1 P2 P3
198c0 20 50 34 20 50 35 0a 2a 2a 0a 2a 2a 20 42 65 67   P4 P5.**.** Beg
198d0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
198e0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 50 31 20   on database P1 
198f0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
19900 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
19910 2a 2a 20 61 63 74 69 76 65 2e 0a 2a 2a 20 49 66  ** active..** If
19920 20 50 32 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   P2 is non-zero,
19930 20 74 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72   then a write-tr
19940 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19950 72 74 65 64 2c 20 6f 72 20 69 66 20 61 20 0a 2a  rted, or if a .*
19960 2a 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  * read-transacti
19970 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
19980 74 69 76 65 2c 20 69 74 20 69 73 20 75 70 67 72  tive, it is upgr
19990 61 64 65 64 20 74 6f 20 61 20 77 72 69 74 65 2d  aded to a write-
199a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
199b0 49 66 20 50 32 20 69 73 20 7a 65 72 6f 2c 20 74  If P2 is zero, t
199c0 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
199d0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
199e0 64 2e 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 74  d..**.** P1 is t
199f0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
19a00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
19a10 20 77 68 69 63 68 20 74 68 65 20 74 72 61 6e 73   which the trans
19a20 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 73 74 61  action is.** sta
19a30 72 74 65 64 2e 20 20 49 6e 64 65 78 20 30 20 69  rted.  Index 0 i
19a40 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
19a50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 64  ase file and ind
19a60 65 78 20 31 20 69 73 20 74 68 65 0a 2a 2a 20 66  ex 1 is the.** f
19a70 69 6c 65 20 75 73 65 64 20 66 6f 72 20 74 65 6d  ile used for tem
19a80 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
19a90 49 6e 64 69 63 65 73 20 6f 66 20 32 20 6f 72 20  Indices of 2 or 
19aa0 6d 6f 72 65 20 61 72 65 20 75 73 65 64 20 66 6f  more are used fo
19ab0 72 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  r.** attached da
19ac0 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  tabases..**.** I
19ad0 66 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  f a write-transa
19ae0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
19af0 20 61 6e 64 20 74 68 65 20 56 64 62 65 2e 75 73   and the Vdbe.us
19b00 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 66 6c  esStmtJournal fl
19b10 61 67 20 69 73 0a 2a 2a 20 74 72 75 65 20 28 74  ag is.** true (t
19b20 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
19b30 69 66 20 74 68 65 20 56 64 62 65 20 6d 61 79 20  if the Vdbe may 
19b40 6d 6f 64 69 66 79 20 6d 6f 72 65 20 74 68 61 6e  modify more than
19b50 20 6f 6e 65 20 72 6f 77 20 61 6e 64 20 6d 61 79   one row and may
19b60 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
19b70 52 54 20 65 78 63 65 70 74 69 6f 6e 29 2c 20 61  RT exception), a
19b80 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
19b90 61 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 20  action may also 
19ba0 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2a 20 4d 6f  be opened..** Mo
19bb0 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
19bc0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
19bd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
19be0 65 64 20 69 66 66 20 74 68 65 20 64 61 74 61 62  ed iff the datab
19bf0 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
19c00 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  n is currently n
19c10 6f 74 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  ot in autocommit
19c20 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 74 68 65   mode, or if the
19c30 72 65 20 61 72 65 20 6f 74 68 65 72 0a 2a 2a 20  re are other.** 
19c40 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
19c50 73 2e 20 41 20 73 74 61 74 65 6d 65 6e 74 20 74  s. A statement t
19c60 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 6c 6f 77  ransaction allow
19c70 73 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  s the changes ma
19c80 64 65 20 62 79 20 74 68 69 73 0a 2a 2a 20 56 44  de by this.** VD
19c90 42 45 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  BE to be rolled 
19ca0 62 61 63 6b 20 61 66 74 65 72 20 61 6e 20 65 72  back after an er
19cb0 72 6f 72 20 77 69 74 68 6f 75 74 20 68 61 76 69  ror without havi
19cc0 6e 67 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ng to roll back 
19cd0 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 74 72  the.** entire tr
19ce0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 6e 6f  ansaction. If no
19cf0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
19d00 74 65 72 65 64 2c 20 74 68 65 20 73 74 61 74 65  tered, the state
19d10 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
19d20 0a 2a 2a 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  .** will automat
19d30 69 63 61 6c 6c 79 20 63 6f 6d 6d 69 74 20 77 68  ically commit wh
19d40 65 6e 20 74 68 65 20 56 44 42 45 20 68 61 6c 74  en the VDBE halt
19d50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 21 3d  s..**.** If P5!=
19d60 30 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63 6f  0 then this opco
19d70 64 65 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74  de also checks t
19d80 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
19d90 20 61 67 61 69 6e 73 74 20 50 33 0a 2a 2a 20 61   against P3.** a
19da0 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 67 65  nd the schema ge
19db0 6e 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72  neration counter
19dc0 20 61 67 61 69 6e 73 74 20 50 34 2e 0a 2a 2a 20   against P4..** 
19dd0 54 68 65 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67  The cookie chang
19de0 65 73 20 69 74 73 20 76 61 6c 75 65 20 77 68 65  es its value whe
19df0 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
19e00 73 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  se schema change
19e10 73 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  s..** This opera
19e20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19e30 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 61 74  detect when that
19e40 20 74 68 65 20 63 6f 6f 6b 69 65 20 68 61 73 20   the cookie has 
19e50 63 68 61 6e 67 65 64 0a 2a 2a 20 61 6e 64 20 74  changed.** and t
19e60 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
19e70 70 72 6f 63 65 73 73 20 6e 65 65 64 73 20 74 6f  process needs to
19e80 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65   reread the sche
19e90 6d 61 2e 20 20 49 66 20 74 68 65 20 73 63 68 65  ma.  If the sche
19ea0 6d 61 0a 2a 2a 20 63 6f 6f 6b 69 65 20 69 6e 20  ma.** cookie in 
19eb0 50 33 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  P3 differs from 
19ec0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
19ed0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
19ee0 65 20 68 65 61 64 65 72 20 6f 72 0a 2a 2a 20 69  e header or.** i
19ef0 66 20 74 68 65 20 73 63 68 65 6d 61 20 67 65 6e  f the schema gen
19f00 65 72 61 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  eration counter 
19f10 69 6e 20 50 34 20 64 69 66 66 65 72 73 20 66 72  in P4 differs fr
19f20 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  om the current.*
19f30 2a 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 75  * generation cou
19f40 6e 74 65 72 2c 20 74 68 65 6e 20 61 6e 20 53 51  nter, then an SQ
19f50 4c 49 54 45 5f 53 43 48 45 4d 41 20 65 72 72 6f  LITE_SCHEMA erro
19f60 72 20 69 73 20 72 61 69 73 65 64 20 61 6e 64 20  r is raised and 
19f70 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 68 61 6c  execution.** hal
19f80 74 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ts.  The sqlite3
19f90 5f 73 74 65 70 28 29 20 77 72 61 70 70 65 72 20  _step() wrapper 
19fa0 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 74  function might t
19fb0 68 65 6e 20 72 65 70 72 65 70 61 72 65 20 74 68  hen reprepare th
19fc0 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 61  e.** statement a
19fd0 6e 64 20 72 65 72 75 6e 20 69 74 20 66 72 6f 6d  nd rerun it from
19fe0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a   the beginning..
19ff0 2a 2f 0a 63 61 73 65 20 4f 50 5f 54 72 61 6e 73  */.case OP_Trans
1a000 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 42 74 72 65  action: {.  Btre
1a010 65 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 69 4d  e *pBt;.  int iM
1a020 65 74 61 3b 0a 20 20 69 6e 74 20 69 47 65 6e 3b  eta;.  int iGen;
1a030 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ..  assert( p->b
1a040 49 73 52 65 61 64 65 72 20 29 3b 0a 20 20 61 73  IsReader );.  as
1a050 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f 6e 6c  sert( p->readOnl
1a060 79 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 32 3d  y==0 || pOp->p2=
1a070 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a080 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
1a090 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b  p->p1<db->nDb );
1a0a0 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
1a0b0 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61  kTest(p->btreeMa
1a0c0 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a  sk, pOp->p1) );.
1a0d0 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 20 26 26    if( pOp->p2 &&
1a0e0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1a0f0 4c 49 54 45 5f 51 75 65 72 79 4f 6e 6c 79 29 21  LITE_QueryOnly)!
1a100 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1a110 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1a120 20 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64      goto abort_d
1a130 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d  ue_to_error;.  }
1a140 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
1a150 5b 70 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 0a  [pOp->p1].pBt;..
1a160 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
1a170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1a180 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
1a190 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 20 20  , pOp->p2);.    
1a1a0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
1a1b0 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
1a1c0 4f 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  OT );.    testca
1a1d0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  se( rc==SQLITE_B
1a1e0 55 53 59 5f 52 45 43 4f 56 45 52 59 20 29 3b 0a  USY_RECOVERY );.
1a1f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a200 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1a210 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
1a220 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
1a230 20 20 20 20 20 70 2d 3e 70 63 20 3d 20 28 69 6e       p->pc = (in
1a240 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a 20  t)(pOp - aOp);. 
1a250 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
1a260 63 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  c;.        goto 
1a270 76 64 62 65 5f 72 65 74 75 72 6e 3b 0a 20 20 20  vdbe_return;.   
1a280 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1a290 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1a2a0 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  or;.    }..    i
1a2b0 66 28 20 70 4f 70 2d 3e 70 32 20 26 26 20 70 2d  f( pOp->p2 && p-
1a2c0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
1a2d0 20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 61   .     && (db->a
1a2e0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
1a2f0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 29  db->nVdbeRead>1)
1a300 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
1a310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1a320 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
1a330 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1a340 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->iStatement==0 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1a360 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
1a370 74 3e 3d 30 20 26 26 20 64 62 2d 3e 6e 53 61 76  t>=0 && db->nSav
1a380 65 70 6f 69 6e 74 3e 3d 30 20 29 3b 0a 20 20 20  epoint>=0 );.   
1a390 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
1a3a0 65 6e 74 2b 2b 3b 20 0a 20 20 20 20 20 20 20 20  ent++; .        
1a3b0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
1a3c0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 2b  db->nSavepoint +
1a3d0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3b   db->nStatement;
1a3e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a3f0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
1a400 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
1a410 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 70  VEPOINT_BEGIN, p
1a420 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 29 3b  ->iStatement-1);
1a430 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a460 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 70  BtreeBeginStmt(p
1a470 42 74 2c 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  Bt, p->iStatemen
1a480 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  t);.      }..   
1a490 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1a4a0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
1a4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1a4c0 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
1a4d0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
1a4e0 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 49 66 20 74  ** counter. If t
1a4f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
1a500 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
1a510 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1a520 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  ,.      ** the v
1a530 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 75  alue of this cou
1a540 6e 74 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  nter needs to be
1a550 20 72 65 73 74 6f 72 65 64 20 74 6f 6f 2e 20 20   restored too.  
1a560 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 6d  */.      p->nStm
1a570 74 44 65 66 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e  tDefCons = db->n
1a580 44 65 66 65 72 72 65 64 43 6f 6e 73 3b 0a 20 20  DeferredCons;.  
1a590 20 20 20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49      p->nStmtDefI
1a5a0 6d 6d 43 6f 6e 73 20 3d 20 64 62 2d 3e 6e 44 65  mmCons = db->nDe
1a5b0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3b 0a 20  ferredImmCons;. 
1a5c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 61 74     }..    /* Gat
1a5d0 68 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 76  her the schema v
1a5e0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 66 6f  ersion number fo
1a5f0 72 20 63 68 65 63 6b 69 6e 67 3a 0a 20 20 20 20  r checking:.    
1a600 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1a610 4e 2d 4f 46 3a 20 52 2d 30 33 31 38 39 2d 35 31  N-OF: R-03189-51
1a620 31 33 35 20 41 73 20 65 61 63 68 20 53 51 4c 20  135 As each SQL 
1a630 73 74 61 74 65 6d 65 6e 74 20 72 75 6e 73 2c 20  statement runs, 
1a640 74 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20 2a  the schema.    *
1a650 2a 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68 65  * version is che
1a660 63 6b 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  cked to ensure t
1a670 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 68  hat the schema h
1a680 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 73  as not changed s
1a690 69 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ince the.    ** 
1a6a0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 77 61  SQL statement wa
1a6b0 73 20 70 72 65 70 61 72 65 64 2e 0a 20 20 20 20  s prepared..    
1a6c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1a6d0 72 65 65 47 65 74 4d 65 74 61 28 70 42 74 2c 20  reeGetMeta(pBt, 
1a6e0 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
1a6f0 53 49 4f 4e 2c 20 28 75 33 32 20 2a 29 26 69 4d  SION, (u32 *)&iM
1a700 65 74 61 29 3b 0a 20 20 20 20 69 47 65 6e 20 3d  eta);.    iGen =
1a710 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31   db->aDb[pOp->p1
1a720 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1a730 72 61 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b  ration;.  }else{
1a740 0a 20 20 20 20 69 47 65 6e 20 3d 20 69 4d 65 74  .    iGen = iMet
1a750 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  a = 0;.  }.  ass
1a760 65 72 74 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20  ert( pOp->p5==0 
1a770 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
1a780 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 69 66  P4_INT32 );.  if
1a790 28 20 70 4f 70 2d 3e 70 35 20 26 26 20 28 69 4d  ( pOp->p5 && (iM
1a7a0 65 74 61 21 3d 70 4f 70 2d 3e 70 33 20 7c 7c 20  eta!=pOp->p3 || 
1a7b0 69 47 65 6e 21 3d 70 4f 70 2d 3e 70 34 2e 69 29  iGen!=pOp->p4.i)
1a7c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1a7d0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
1a7e0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
1a7f0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1a800 62 53 74 72 44 75 70 28 64 62 2c 20 22 64 61 74  bStrDup(db, "dat
1a810 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1a820 20 63 68 61 6e 67 65 64 22 29 3b 0a 20 20 20 20   changed");.    
1a830 2f 2a 20 49 66 20 74 68 65 20 73 63 68 65 6d 61  /* If the schema
1a840 2d 63 6f 6f 6b 69 65 20 66 72 6f 6d 20 74 68 65  -cookie from the
1a850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
1a860 61 74 63 68 65 73 20 74 68 65 20 63 6f 6f 6b 69  atches the cooki
1a870 65 20 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  e .    ** stored
1a880 20 77 69 74 68 20 74 68 65 20 69 6e 2d 6d 65 6d   with the in-mem
1a890 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
1a8a0 6f 6e 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  on of the schema
1a8b0 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
1a8c0 72 65 6c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  reload the schem
1a8d0 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1a8e0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
1a8f0 0a 20 20 20 20 2a 2a 20 49 66 20 76 69 72 74 75  .    ** If virtu
1a900 61 6c 2d 74 61 62 6c 65 73 20 61 72 65 20 69 6e  al-tables are in
1a910 20 75 73 65 2c 20 74 68 69 73 20 69 73 20 6e 6f   use, this is no
1a920 74 20 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69  t just an optimi
1a930 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 4f  zation..    ** O
1a940 66 74 65 6e 2c 20 76 2d 74 61 62 6c 65 73 20 73  ften, v-tables s
1a950 74 6f 72 65 20 74 68 65 69 72 20 64 61 74 61 20  tore their data 
1a960 69 6e 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  in other SQLite 
1a970 74 61 62 6c 65 73 2c 20 77 68 69 63 68 0a 20 20  tables, which.  
1a980 20 20 2a 2a 20 61 72 65 20 71 75 65 72 69 65 64    ** are queried
1a990 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 78 4e 65   from within xNe
1a9a0 78 74 28 29 20 61 6e 64 20 6f 74 68 65 72 20 76  xt() and other v
1a9b0 2d 74 61 62 6c 65 20 6d 65 74 68 6f 64 73 20 75  -table methods u
1a9c0 73 69 6e 67 0a 20 20 20 20 2a 2a 20 70 72 65 70  sing.    ** prep
1a9d0 61 72 65 64 20 71 75 65 72 69 65 73 2e 20 49 66  ared queries. If
1a9e0 20 73 75 63 68 20 61 20 71 75 65 72 79 20 69 73   such a query is
1a9f0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 2c 20 77 65   out-of-date, we
1aa00 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 0a   do not want to.
1aa10 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74      ** discard t
1aa20 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1aa30 6d 61 2c 20 61 73 20 74 68 65 20 75 73 65 72 20  ma, as the user 
1aa40 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  code implementin
1aa50 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 2d 74  g the.    ** v-t
1aa60 61 62 6c 65 20 77 6f 75 6c 64 20 68 61 76 65 20  able would have 
1aa70 74 6f 20 62 65 20 72 65 61 64 79 20 66 6f 72 20  to be ready for 
1aa80 74 68 65 20 73 71 6c 69 74 65 33 5f 76 74 61 62  the sqlite3_vtab
1aa90 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
1aaa0 66 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  f.    ** to be i
1aab0 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 65  nvalidated whene
1aac0 76 65 72 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ver sqlite3_step
1aad0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  () is called fro
1aae0 6d 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  m within .    **
1aaf0 20 61 20 76 2d 74 61 62 6c 65 20 6d 65 74 68 6f   a v-table metho
1ab00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1ab10 28 20 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70  ( db->aDb[pOp->p
1ab20 31 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  1].pSchema->sche
1ab30 6d 61 5f 63 6f 6f 6b 69 65 21 3d 69 4d 65 74 61  ma_cookie!=iMeta
1ab40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ab50 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61 28  3ResetOneSchema(
1ab60 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20 20  db, pOp->p1);.  
1ab70 20 20 7d 0a 20 20 20 20 70 2d 3e 65 78 70 69 72    }.    p->expir
1ab80 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ed = 1;.    rc =
1ab90 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3b 0a   SQLITE_SCHEMA;.
1aba0 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67    }.  if( rc ) g
1abb0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
1abc0 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b  _error;.  break;
1abd0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52  .}../* Opcode: R
1abe0 65 61 64 43 6f 6f 6b 69 65 20 50 31 20 50 32 20  eadCookie P1 P2 
1abf0 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61  P3 * *.**.** Rea
1ac00 64 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20  d cookie number 
1ac10 50 33 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  P3 from database
1ac20 20 50 31 20 61 6e 64 20 77 72 69 74 65 20 69 74   P1 and write it
1ac30 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50   into register P
1ac40 32 2e 0a 2a 2a 20 50 33 3d 3d 31 20 69 73 20 74  2..** P3==1 is t
1ac50 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
1ac60 6e 2e 20 20 50 33 3d 3d 32 20 69 73 20 74 68 65  n.  P3==2 is the
1ac70 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
1ac80 2e 0a 2a 2a 20 50 33 3d 3d 33 20 69 73 20 74 68  ..** P3==3 is th
1ac90 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61  e recommended pa
1aca0 67 65 72 20 63 61 63 68 65 20 73 69 7a 65 2c 20  ger cache size, 
1acb0 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 50  and so forth.  P
1acc0 31 3d 3d 30 20 69 73 0a 2a 2a 20 74 68 65 20 6d  1==0 is.** the m
1acd0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1ace0 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20 74  e and P1==1 is t
1acf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ad00 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
1ad10 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1ad20 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  es..**.** There 
1ad30 6d 75 73 74 20 62 65 20 61 20 72 65 61 64 2d 6c  must be a read-l
1ad40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ad50 61 73 65 20 28 65 69 74 68 65 72 20 61 20 74 72  ase (either a tr
1ad60 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73  ansaction.** mus
1ad70 74 20 62 65 20 73 74 61 72 74 65 64 20 6f 72 20  t be started or 
1ad80 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  there must be an
1ad90 20 6f 70 65 6e 20 63 75 72 73 6f 72 29 20 62 65   open cursor) be
1ada0 66 6f 72 65 0a 2a 2a 20 65 78 65 63 75 74 69 6e  fore.** executin
1adb0 67 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  g this instructi
1adc0 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52  on..*/.case OP_R
1add0 65 61 64 43 6f 6f 6b 69 65 3a 20 7b 20 20 20 20  eadCookie: {    
1ade0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
1adf0 74 32 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 74  t2 */.  int iMet
1ae00 61 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  a;.  int iDb;.  
1ae10 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 0a 0a 20 20  int iCookie;..  
1ae20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
1ae30 61 64 65 72 20 29 3b 0a 20 20 69 44 62 20 3d 20  ader );.  iDb = 
1ae40 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 43 6f 6f 6b  pOp->p1;.  iCook
1ae50 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  ie = pOp->p3;.  
1ae60 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
1ae70 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
1ae80 45 54 41 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ETA );.  assert(
1ae90 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
1aea0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
1aeb0 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1aec0 2e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  .pBt!=0 );.  ass
1aed0 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74 28  ert( DbMaskTest(
1aee0 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 44  p->btreeMask, iD
1aef0 62 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  b) );..  sqlite3
1af00 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d  BtreeGetMeta(db-
1af10 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 69  >aDb[iDb].pBt, i
1af20 43 6f 6f 6b 69 65 2c 20 28 75 33 32 20 2a 29 26  Cookie, (u32 *)&
1af30 69 4d 65 74 61 29 3b 0a 20 20 70 4f 75 74 20 3d  iMeta);.  pOut =
1af40 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
1af50 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
1af60 3e 75 2e 69 20 3d 20 69 4d 65 74 61 3b 0a 20 20  >u.i = iMeta;.  
1af70 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
1af80 6f 64 65 3a 20 53 65 74 43 6f 6f 6b 69 65 20 50  ode: SetCookie P
1af90 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a  1 P2 P3 * *.**.*
1afa0 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 74 65  * Write the inte
1afb0 67 65 72 20 76 61 6c 75 65 20 50 33 20 69 6e 74  ger value P3 int
1afc0 6f 20 63 6f 6f 6b 69 65 20 6e 75 6d 62 65 72 20  o cookie number 
1afd0 50 32 20 6f 66 20 64 61 74 61 62 61 73 65 20 50  P2 of database P
1afe0 31 2e 0a 2a 2a 20 50 32 3d 3d 31 20 69 73 20 74  1..** P2==1 is t
1aff0 68 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  he schema versio
1b000 6e 2e 20 20 50 32 3d 3d 32 20 69 73 20 74 68 65  n.  P2==2 is the
1b010 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
1b020 2e 0a 2a 2a 20 50 32 3d 3d 33 20 69 73 20 74 68  ..** P2==3 is th
1b030 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 70 61  e recommended pa
1b040 67 65 72 20 63 61 63 68 65 20 0a 2a 2a 20 73 69  ger cache .** si
1b050 7a 65 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ze, and so forth
1b060 2e 20 20 50 31 3d 3d 30 20 69 73 20 74 68 65 20  .  P1==0 is the 
1b070 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1b080 6c 65 20 61 6e 64 20 50 31 3d 3d 31 20 69 73 20  le and P1==1 is 
1b090 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1b0a0 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 73 74   file used to st
1b0b0 6f 72 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ore temporary ta
1b0c0 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  bles..**.** A tr
1b0d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1b0e0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1b0f0 20 65 78 65 63 75 74 69 6e 67 20 74 68 69 73 20   executing this 
1b100 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20  opcode..*/.case 
1b110 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 3a 20 7b 0a  OP_SetCookie: {.
1b120 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
1b130 65 72 74 28 20 70 4f 70 2d 3e 70 32 3c 53 51 4c  ert( pOp->p2<SQL
1b140 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41  ITE_N_BTREE_META
1b150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
1b160 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
1b170 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  >p1<db->nDb );. 
1b180 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54   assert( DbMaskT
1b190 65 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  est(p->btreeMask
1b1a0 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b 0a 20 20  , pOp->p1) );.  
1b1b0 61 73 73 65 72 74 28 20 70 2d 3e 72 65 61 64 4f  assert( p->readO
1b1c0 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70 44 62 20  nly==0 );.  pDb 
1b1d0 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e  = &db->aDb[pOp->
1b1e0 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
1b1f0 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  Db->pBt!=0 );.  
1b200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1b210 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1b220 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 30 29 20 29  b, pOp->p1, 0) )
1b230 3b 0a 20 20 2f 2a 20 53 65 65 20 6e 6f 74 65 20  ;.  /* See note 
1b240 61 62 6f 75 74 20 69 6e 64 65 78 20 73 68 69 66  about index shif
1b250 74 69 6e 67 20 6f 6e 20 4f 50 5f 52 65 61 64 43  ting on OP_ReadC
1b260 6f 6f 6b 69 65 20 2a 2f 0a 20 20 72 63 20 3d 20  ookie */.  rc = 
1b270 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1b280 74 65 4d 65 74 61 28 70 44 62 2d 3e 70 42 74 2c  teMeta(pDb->pBt,
1b290 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
1b2a0 33 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  3);.  if( pOp->p
1b2b0 32 3d 3d 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  2==BTREE_SCHEMA_
1b2c0 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20 2f  VERSION ){.    /
1b2d0 2a 20 57 68 65 6e 20 74 68 65 20 73 63 68 65 6d  * When the schem
1b2e0 61 20 63 6f 6f 6b 69 65 20 63 68 61 6e 67 65 73  a cookie changes
1b2f0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 65 77  , record the new
1b300 20 63 6f 6f 6b 69 65 20 69 6e 74 65 72 6e 61 6c   cookie internal
1b310 6c 79 20 2a 2f 0a 20 20 20 20 70 44 62 2d 3e 70  ly */.    pDb->p
1b320 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
1b330 6f 6f 6b 69 65 20 3d 20 70 4f 70 2d 3e 70 33 3b  ookie = pOp->p3;
1b340 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
1b350 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
1b360 68 61 6e 67 65 73 3b 0a 20 20 7d 65 6c 73 65 20  hanges;.  }else 
1b370 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 42 54 52  if( pOp->p2==BTR
1b380 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 20 29  EE_FILE_FORMAT )
1b390 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
1b3a0 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 66  changes in the f
1b3b0 69 6c 65 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ile format */.  
1b3c0 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e    pDb->pSchema->
1b3d0 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 70 4f  file_format = pO
1b3e0 70 2d 3e 70 33 3b 0a 20 20 7d 0a 20 20 69 66 28  p->p3;.  }.  if(
1b3f0 20 70 4f 70 2d 3e 70 31 3d 3d 31 20 29 7b 0a 20   pOp->p1==1 ){. 
1b400 20 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65     /* Invalidate
1b410 20 61 6c 6c 20 70 72 65 70 61 72 65 64 20 73 74   all prepared st
1b420 61 74 65 6d 65 6e 74 73 20 77 68 65 6e 65 76 65  atements wheneve
1b430 72 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  r the TEMP datab
1b440 61 73 65 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d  ase.    ** schem
1b450 61 20 69 73 20 63 68 61 6e 67 65 64 2e 20 20 54  a is changed.  T
1b460 69 63 6b 65 74 20 23 31 36 34 34 20 2a 2f 0a 20  icket #1644 */. 
1b470 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
1b480 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
1b490 74 73 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 65  ts(db);.    p->e
1b4a0 78 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  xpired = 0;.  }.
1b4b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1b4c0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
1b4d0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a  or;.  break;.}..
1b4e0 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 52  /* Opcode: OpenR
1b4f0 65 61 64 20 50 31 20 50 32 20 50 33 20 50 34 20  ead P1 P2 P3 P4 
1b500 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20  P5.** Synopsis: 
1b510 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a  root=P2 iDb=P3.*
1b520 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64  *.** Open a read
1b530 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 66 6f 72  -only cursor for
1b540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 61   the database ta
1b550 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70  ble whose root p
1b560 61 67 65 20 69 73 0a 2a 2a 20 50 32 20 69 6e 20  age is.** P2 in 
1b570 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
1b580 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1b590 69 6c 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ile is determine
1b5a0 64 20 62 79 20 50 33 2e 20 0a 2a 2a 20 50 33 3d  d by P3. .** P3=
1b5b0 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  =0 means the mai
1b5c0 6e 20 64 61 74 61 62 61 73 65 2c 20 50 33 3d 3d  n database, P3==
1b5d0 31 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  1 means the data
1b5e0 62 61 73 65 20 75 73 65 64 20 66 6f 72 20 0a 2a  base used for .*
1b5f0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
1b600 65 73 2c 20 61 6e 64 20 50 33 3e 31 20 6d 65 61  es, and P3>1 mea
1b610 6e 73 20 75 73 65 64 20 74 68 65 20 63 6f 72 72  ns used the corr
1b620 65 73 70 6f 6e 64 69 6e 67 20 61 74 74 61 63 68  esponding attach
1b630 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  ed.** database. 
1b640 20 47 69 76 65 20 74 68 65 20 6e 65 77 20 63 75   Give the new cu
1b650 72 73 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69  rsor an identifi
1b660 65 72 20 6f 66 20 50 31 2e 20 20 54 68 65 20 50  er of P1.  The P
1b670 31 0a 2a 2a 20 76 61 6c 75 65 73 20 6e 65 65 64  1.** values need
1b680 20 6e 6f 74 20 62 65 20 63 6f 6e 74 69 67 75 6f   not be contiguo
1b690 75 73 20 62 75 74 20 61 6c 6c 20 50 31 20 76 61  us but all P1 va
1b6a0 6c 75 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  lues should be s
1b6b0 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 2e 0a 2a  mall integers..*
1b6c0 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
1b6d0 20 66 6f 72 20 50 31 20 74 6f 20 62 65 20 6e 65   for P1 to be ne
1b6e0 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  gative..**.** If
1b6f0 20 50 35 21 3d 30 20 74 68 65 6e 20 75 73 65 20   P5!=0 then use 
1b700 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 72  the content of r
1b710 65 67 69 73 74 65 72 20 50 32 20 61 73 20 74 68  egister P2 as th
1b720 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6e 6f 74  e root page, not
1b730 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1b740 20 50 32 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a   P2 itself..**.*
1b750 2a 20 54 68 65 72 65 20 77 69 6c 6c 20 62 65 20  * There will be 
1b760 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
1b770 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  he database when
1b780 65 76 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ever there is an
1b790 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 2e  .** open cursor.
1b7a0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1b7b0 65 20 77 61 73 20 75 6e 6c 6f 63 6b 65 64 20 70  e was unlocked p
1b7c0 72 69 6f 72 20 74 6f 20 74 68 69 73 20 69 6e 73  rior to this ins
1b7d0 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 74 68 65 6e  truction.** then
1b7e0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
1b7f0 61 63 71 75 69 72 65 64 20 61 73 20 70 61 72 74  acquired as part
1b800 20 6f 66 20 74 68 69 73 20 69 6e 73 74 72 75 63   of this instruc
1b810 74 69 6f 6e 2e 20 20 41 20 72 65 61 64 0a 2a 2a  tion.  A read.**
1b820 20 6c 6f 63 6b 20 61 6c 6c 6f 77 73 20 6f 74 68   lock allows oth
1b830 65 72 20 70 72 6f 63 65 73 73 65 73 20 74 6f 20  er processes to 
1b840 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1b850 65 20 62 75 74 20 70 72 6f 68 69 62 69 74 73 0a  e but prohibits.
1b860 2a 2a 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  ** any other pro
1b870 63 65 73 73 20 66 72 6f 6d 20 6d 6f 64 69 66 79  cess from modify
1b880 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1b890 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1b8a0 20 69 73 0a 2a 2a 20 72 65 6c 65 61 73 65 64 20   is.** released 
1b8b0 77 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  when all cursors
1b8c0 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 20 49 66   are closed.  If
1b8d0 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1b8e0 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  n attempts.** to
1b8f0 20 67 65 74 20 61 20 72 65 61 64 20 6c 6f 63 6b   get a read lock
1b900 20 62 75 74 20 66 61 69 6c 73 2c 20 74 68 65 20   but fails, the 
1b910 73 63 72 69 70 74 20 74 65 72 6d 69 6e 61 74 65  script terminate
1b920 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  s with an.** SQL
1b930 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 63  ITE_BUSY error c
1b940 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  ode..**.** The P
1b950 34 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 65  4 value may be e
1b960 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1b970 20 28 50 34 5f 49 4e 54 33 32 29 20 6f 72 20 61   (P4_INT32) or a
1b980 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 61   pointer to.** a
1b990 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1b9a0 72 65 20 28 50 34 5f 4b 45 59 49 4e 46 4f 29 2e  re (P4_KEYINFO).
1b9b0 20 49 66 20 69 74 20 69 73 20 61 20 70 6f 69 6e   If it is a poin
1b9c0 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
1b9d0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20   .** structure, 
1b9e0 74 68 65 6e 20 73 61 69 64 20 73 74 72 75 63 74  then said struct
1b9f0 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20  ure defines the 
1ba00 63 6f 6e 74 65 6e 74 20 61 6e 64 20 63 6f 6c 6c  content and coll
1ba10 61 74 69 6e 67 20 0a 2a 2a 20 73 65 71 75 65 6e  ating .** sequen
1ba20 63 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ce of the index 
1ba30 62 65 69 6e 67 20 6f 70 65 6e 65 64 2e 20 4f 74  being opened. Ot
1ba40 68 65 72 77 69 73 65 2c 20 69 66 20 50 34 20 69  herwise, if P4 i
1ba50 73 20 61 6e 20 69 6e 74 65 67 65 72 20 0a 2a 2a  s an integer .**
1ba60 20 76 61 6c 75 65 2c 20 69 74 20 69 73 20 73 65   value, it is se
1ba70 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1ba80 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1ba90 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  e table..**.** S
1baa0 65 65 20 61 6c 73 6f 3a 20 4f 70 65 6e 57 72 69  ee also: OpenWri
1bab0 74 65 2c 20 52 65 6f 70 65 6e 49 64 78 0a 2a 2f  te, ReopenIdx.*/
1bac0 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 6f 70  ./* Opcode: Reop
1bad0 65 6e 49 64 78 20 50 31 20 50 32 20 50 33 20 50  enIdx P1 P2 P3 P
1bae0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
1baf0 3a 20 72 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33  : root=P2 iDb=P3
1bb00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70 65  .**.** The Reope
1bb10 6e 49 64 78 20 6f 70 63 6f 64 65 20 77 6f 72 6b  nIdx opcode work
1bb20 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 52  s exactly like R
1bb30 65 61 64 4f 70 65 6e 20 65 78 63 65 70 74 20 74  eadOpen except t
1bb40 68 61 74 20 69 74 20 66 69 72 73 74 0a 2a 2a 20  hat it first.** 
1bb50 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1bb60 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 50   the cursor on P
1bb70 31 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  1 is already ope
1bb80 6e 20 77 69 74 68 20 61 20 72 6f 6f 74 20 70 61  n with a root pa
1bb90 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  ge.** number of 
1bba0 50 32 20 61 6e 64 20 69 66 20 69 74 20 69 73 20  P2 and if it is 
1bbb0 74 68 69 73 20 6f 70 63 6f 64 65 20 62 65 63 6f  this opcode beco
1bbc0 6d 65 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 6e  mes a no-op.  In
1bbd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
1bbe0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1bbf0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
1bc00 64 6f 20 6e 6f 74 20 72 65 6f 70 65 6e 20 69 74  do not reopen it
1bc10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 52 65 6f 70  ..**.** The Reop
1bc20 65 6e 49 64 78 20 6f 70 63 6f 64 65 20 6d 61 79  enIdx opcode may
1bc30 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
1bc40 74 68 20 50 35 3d 3d 30 20 61 6e 64 20 77 69 74  th P5==0 and wit
1bc50 68 20 50 34 20 62 65 69 6e 67 0a 2a 2a 20 61 20  h P4 being.** a 
1bc60 50 34 5f 4b 45 59 49 4e 46 4f 20 6f 62 6a 65 63  P4_KEYINFO objec
1bc70 74 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  t.  Furthermore,
1bc80 20 74 68 65 20 50 33 20 76 61 6c 75 65 20 6d 75   the P3 value mu
1bc90 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
1bca0 73 0a 2a 2a 20 65 76 65 72 79 20 6f 74 68 65 72  s.** every other
1bcb0 20 52 65 6f 70 65 6e 49 64 78 20 6f 72 20 4f 70   ReopenIdx or Op
1bcc0 65 6e 52 65 61 64 20 66 6f 72 20 74 68 65 20 73  enRead for the s
1bcd0 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ame cursor numbe
1bce0 72 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65  r..**.** See the
1bcf0 20 4f 70 65 6e 52 65 61 64 20 6f 70 63 6f 64 65   OpenRead opcode
1bd00 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
1bd10 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1bd20 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a  formation..*/./*
1bd30 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 57 72 69   Opcode: OpenWri
1bd40 74 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50  te P1 P2 P3 P4 P
1bd50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  5.** Synopsis: r
1bd60 6f 6f 74 3d 50 32 20 69 44 62 3d 50 33 0a 2a 2a  oot=P2 iDb=P3.**
1bd70 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2f  .** Open a read/
1bd80 77 72 69 74 65 20 63 75 72 73 6f 72 20 6e 61 6d  write cursor nam
1bd90 65 64 20 50 31 20 6f 6e 20 74 68 65 20 74 61 62  ed P1 on the tab
1bda0 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 68 6f 73  le or index whos
1bdb0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
1bdc0 73 20 50 32 2e 20 20 4f 72 20 69 66 20 50 35 21  s P2.  Or if P5!
1bdd0 3d 30 20 75 73 65 20 74 68 65 20 63 6f 6e 74 65  =0 use the conte
1bde0 6e 74 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  nt of register P
1bdf0 32 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  2 to find the.**
1be00 20 72 6f 6f 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a   root page..**.*
1be10 2a 20 54 68 65 20 50 34 20 76 61 6c 75 65 20 6d  * The P4 value m
1be20 61 79 20 62 65 20 65 69 74 68 65 72 20 61 6e 20  ay be either an 
1be30 69 6e 74 65 67 65 72 20 28 50 34 5f 49 4e 54 33  integer (P4_INT3
1be40 32 29 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  2) or a pointer 
1be50 74 6f 0a 2a 2a 20 61 20 4b 65 79 49 6e 66 6f 20  to.** a KeyInfo 
1be60 73 74 72 75 63 74 75 72 65 20 28 50 34 5f 4b 45  structure (P4_KE
1be70 59 49 4e 46 4f 29 2e 20 49 66 20 69 74 20 69 73  YINFO). If it is
1be80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1be90 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
1bea0 63 74 75 72 65 2c 20 74 68 65 6e 20 73 61 69 64  cture, then said
1beb0 20 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e   structure defin
1bec0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  es the content a
1bed0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 0a 2a 2a  nd collating .**
1bee0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 68 65   sequence of the
1bef0 20 69 6e 64 65 78 20 62 65 69 6e 67 20 6f 70 65   index being ope
1bf00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1bf10 69 66 20 50 34 20 69 73 20 61 6e 20 69 6e 74 65  if P4 is an inte
1bf20 67 65 72 20 0a 2a 2a 20 76 61 6c 75 65 2c 20 69  ger .** value, i
1bf30 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1bf40 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1bf50 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s in the table, 
1bf60 6f 72 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 61 72  or to the.** lar
1bf70 67 65 73 74 20 69 6e 64 65 78 20 6f 66 20 61 6e  gest index of an
1bf80 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
1bf90 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 61 63  table that is ac
1bfa0 74 75 61 6c 6c 79 20 75 73 65 64 2e 0a 2a 2a 0a  tually used..**.
1bfb0 2a 2a 20 54 68 69 73 20 69 6e 73 74 72 75 63 74  ** This instruct
1bfc0 69 6f 6e 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ion works just l
1bfd0 69 6b 65 20 4f 70 65 6e 52 65 61 64 20 65 78 63  ike OpenRead exc
1bfe0 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e  ept that it open
1bff0 73 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  s the cursor.** 
1c000 69 6e 20 72 65 61 64 2f 77 72 69 74 65 20 6d 6f  in read/write mo
1c010 64 65 2e 20 20 46 6f 72 20 61 20 67 69 76 65 6e  de.  For a given
1c020 20 74 61 62 6c 65 2c 20 74 68 65 72 65 20 63 61   table, there ca
1c030 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  n be one or more
1c040 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1c050 72 73 6f 72 73 20 6f 72 20 61 20 73 69 6e 67 6c  rsors or a singl
1c060 65 20 72 65 61 64 2f 77 72 69 74 65 20 63 75 72  e read/write cur
1c070 73 6f 72 20 62 75 74 20 6e 6f 74 20 62 6f 74 68  sor but not both
1c080 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1c090 20 4f 70 65 6e 52 65 61 64 2e 0a 2a 2f 0a 63 61   OpenRead..*/.ca
1c0a0 73 65 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3a  se OP_ReopenIdx:
1c0b0 20 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b   {.  int nField;
1c0c0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1c0d0 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 70 32 3b 0a  Info;.  int p2;.
1c0e0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e 74    int iDb;.  int
1c0f0 20 77 72 46 6c 61 67 3b 0a 20 20 42 74 72 65 65   wrFlag;.  Btree
1c100 20 2a 70 58 3b 0a 20 20 56 64 62 65 43 75 72 73   *pX;.  VdbeCurs
1c110 6f 72 20 2a 70 43 75 72 3b 0a 20 20 44 62 20 2a  or *pCur;.  Db *
1c120 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
1c130 70 4f 70 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f  pOp->p5==0 || pO
1c140 70 2d 3e 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45  p->p5==OPFLAG_SE
1c150 45 4b 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74  EKEQ );.  assert
1c160 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
1c170 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 70  4_KEYINFO );.  p
1c180 43 75 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70  Cur = p->apCsr[p
1c190 4f 70 2d 3e 70 31 5d 3b 0a 20 20 69 66 28 20 70  Op->p1];.  if( p
1c1a0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 70 67 6e  Cur && pCur->pgn
1c1b0 6f 52 6f 6f 74 3d 3d 28 75 33 32 29 70 4f 70 2d  oRoot==(u32)pOp-
1c1c0 3e 70 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >p2 ){.    asser
1c1d0 74 28 20 70 43 75 72 2d 3e 69 44 62 3d 3d 70 4f  t( pCur->iDb==pO
1c1e0 70 2d 3e 70 33 20 29 3b 20 20 20 20 20 20 2f 2a  p->p3 );      /*
1c1f0 20 47 75 61 72 61 6e 74 65 65 64 20 62 79 20 74   Guaranteed by t
1c200 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1c210 72 20 2a 2f 0a 20 20 20 20 67 6f 74 6f 20 6f 70  r */.    goto op
1c220 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74 5f 68 69  en_cursor_set_hi
1c230 6e 74 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  nts;.  }.  /* If
1c240 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1c250 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
1c260 6e 20 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  n or is open on 
1c270 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
1c280 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 66 61 6c   index, then fal
1c290 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f  l through into O
1c2a0 50 5f 4f 70 65 6e 52 65 61 64 20 74 6f 20 66 6f  P_OpenRead to fo
1c2b0 72 63 65 20 61 20 72 65 6f 70 65 6e 20 2a 2f 0a  rce a reopen */.
1c2c0 63 61 73 65 20 4f 50 5f 4f 70 65 6e 52 65 61 64  case OP_OpenRead
1c2d0 3a 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 57 72  :.case OP_OpenWr
1c2e0 69 74 65 3a 0a 0a 20 20 61 73 73 65 72 74 28 20  ite:..  assert( 
1c2f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1c300 4f 70 65 6e 57 72 69 74 65 20 7c 7c 20 70 4f 70  OpenWrite || pOp
1c310 2d 3e 70 35 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e  ->p5==0 || pOp->
1c320 70 35 3d 3d 4f 50 46 4c 41 47 5f 53 45 45 4b 45  p5==OPFLAG_SEEKE
1c330 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Q );.  assert( p
1c340 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
1c350 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70   assert( pOp->op
1c360 63 6f 64 65 3d 3d 4f 50 5f 4f 70 65 6e 52 65 61  code==OP_OpenRea
1c370 64 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  d || pOp->opcode
1c380 3d 3d 4f 50 5f 52 65 6f 70 65 6e 49 64 78 0a 20  ==OP_ReopenIdx. 
1c390 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
1c3a0 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20  eadOnly==0 );.. 
1c3b0 20 69 66 28 20 70 2d 3e 65 78 70 69 72 65 64 20   if( p->expired 
1c3c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1c3d0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
1c3e0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  K;.    goto abor
1c3f0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1c400 20 20 7d 0a 0a 20 20 6e 46 69 65 6c 64 20 3d 20    }..  nField = 
1c410 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  0;.  pKeyInfo = 
1c420 30 3b 0a 20 20 70 32 20 3d 20 70 4f 70 2d 3e 70  0;.  p2 = pOp->p
1c430 32 3b 0a 20 20 69 44 62 20 3d 20 70 4f 70 2d 3e  2;.  iDb = pOp->
1c440 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  p3;.  assert( iD
1c450 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1c460 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
1c470 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62   DbMaskTest(p->b
1c480 74 72 65 65 4d 61 73 6b 2c 20 69 44 62 29 20 29  treeMask, iDb) )
1c490 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
1c4a0 44 62 5b 69 44 62 5d 3b 0a 20 20 70 58 20 3d 20  Db[iDb];.  pX = 
1c4b0 70 44 62 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  pDb->pBt;.  asse
1c4c0 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 69  rt( pX!=0 );.  i
1c4d0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
1c4e0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 29 7b 0a  OP_OpenWrite ){.
1c4f0 20 20 20 20 61 73 73 65 72 74 28 20 4f 50 46 4c      assert( OPFL
1c500 41 47 5f 46 4f 52 44 45 4c 45 54 45 3d 3d 42 54  AG_FORDELETE==BT
1c510 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 29 3b  REE_FORDELETE );
1c520 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 42 54  .    wrFlag = BT
1c530 52 45 45 5f 57 52 43 53 52 20 7c 20 28 70 4f 70  REE_WRCSR | (pOp
1c540 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 46 4f  ->p5 & OPFLAG_FO
1c550 52 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 61 73  RDELETE);.    as
1c560 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1c570 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1c580 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
1c590 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
1c5a0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3c 20  ->file_format < 
1c5b0 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
1c5c0 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 20 20 70  ormat ){.      p
1c5d0 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
1c5e0 72 6d 61 74 20 3d 20 70 44 62 2d 3e 70 53 63 68  rmat = pDb->pSch
1c5f0 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
1c600 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1c610 0a 20 20 20 20 77 72 46 6c 61 67 20 3d 20 30 3b  .    wrFlag = 0;
1c620 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1c630 70 35 20 26 20 4f 50 46 4c 41 47 5f 50 32 49 53  p5 & OPFLAG_P2IS
1c640 52 45 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72  REG ){.    asser
1c650 74 28 20 70 32 3e 30 20 29 3b 0a 20 20 20 20 61  t( p2>0 );.    a
1c660 73 73 65 72 74 28 20 70 32 3c 3d 28 70 2d 3e 6e  ssert( p2<=(p->n
1c670 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
1c680 6f 72 29 20 29 3b 0a 20 20 20 20 70 49 6e 32 20  or) );.    pIn2 
1c690 3d 20 26 61 4d 65 6d 5b 70 32 5d 3b 0a 20 20 20  = &aMem[p2];.   
1c6a0 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
1c6b0 6c 69 64 28 70 49 6e 32 29 20 29 3b 0a 20 20 20  lid(pIn2) );.   
1c6c0 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
1c6d0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1c6e0 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
1c6f0 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72  e3VdbeMemInteger
1c700 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 20 20 70  ify(pIn2);.    p
1c710 32 20 3d 20 28 69 6e 74 29 70 49 6e 32 2d 3e 75  2 = (int)pIn2->u
1c720 2e 69 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  .i;.    /* The p
1c730 32 20 76 61 6c 75 65 20 61 6c 77 61 79 73 20 63  2 value always c
1c740 6f 6d 65 73 20 66 72 6f 6d 20 61 20 70 72 69 6f  omes from a prio
1c750 72 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  r OP_CreateTable
1c760 20 6f 70 63 6f 64 65 20 61 6e 64 0a 20 20 20 20   opcode and.    
1c770 2a 2a 20 74 68 61 74 20 6f 70 63 6f 64 65 20 77  ** that opcode w
1c780 69 6c 6c 20 61 6c 77 61 79 73 20 73 65 74 20 74  ill always set t
1c790 68 65 20 70 32 20 76 61 6c 75 65 20 74 6f 20 32  he p2 value to 2
1c7a0 20 6f 72 20 6d 6f 72 65 20 6f 72 20 65 6c 73 65   or more or else
1c7b0 20 66 61 69 6c 2e 0a 20 20 20 20 2a 2a 20 49 66   fail..    ** If
1c7c0 20 74 68 65 72 65 20 77 65 72 65 20 61 20 66 61   there were a fa
1c7d0 69 6c 75 72 65 2c 20 74 68 65 20 70 72 65 70 61  ilure, the prepa
1c7e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 77 6f  red statement wo
1c7f0 75 6c 64 20 68 61 76 65 20 68 61 6c 74 65 64 0a  uld have halted.
1c800 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 72 65      ** before re
1c810 61 63 68 69 6e 67 20 74 68 69 73 20 69 6e 73 74  aching this inst
1c820 72 75 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ruction. */.    
1c830 61 73 73 65 72 74 28 20 70 32 3e 3d 32 20 29 3b  assert( p2>=2 );
1c840 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 70 2d 3e  .  }.  if( pOp->
1c850 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e  p4type==P4_KEYIN
1c860 46 4f 20 29 7b 0a 20 20 20 20 70 4b 65 79 49 6e  FO ){.    pKeyIn
1c870 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
1c880 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72  yInfo;.    asser
1c890 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63  t( pKeyInfo->enc
1c8a0 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20 20 20  ==ENC(db) );.   
1c8b0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1c8c0 6f 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20  o->db==db );.   
1c8d0 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
1c8e0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1c8f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3b 0a 20 20  nfo->nXField;.  
1c900 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70  }else if( pOp->p
1c910 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 20  4type==P4_INT32 
1c920 29 7b 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20  ){.    nField = 
1c930 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 7d 0a 20  pOp->p4.i;.  }. 
1c940 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1c950 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c960 20 6e 46 69 65 6c 64 3e 3d 30 20 29 3b 0a 20 20   nField>=0 );.  
1c970 74 65 73 74 63 61 73 65 28 20 6e 46 69 65 6c 64  testcase( nField
1c980 3d 3d 30 20 29 3b 20 20 2f 2a 20 54 61 62 6c 65  ==0 );  /* Table
1c990 20 77 69 74 68 20 49 4e 54 45 47 45 52 20 50 52   with INTEGER PR
1c9a0 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 6e 6f  IMARY KEY and no
1c9b0 74 68 69 6e 67 20 65 6c 73 65 20 2a 2f 0a 20 20  thing else */.  
1c9c0 70 43 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43  pCur = allocateC
1c9d0 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1c9e0 2c 20 6e 46 69 65 6c 64 2c 20 69 44 62 2c 20 43  , nField, iDb, C
1c9f0 55 52 54 59 50 45 5f 42 54 52 45 45 29 3b 0a 20  URTYPE_BTREE);. 
1ca00 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 67   if( pCur==0 ) g
1ca10 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1ca20 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b  ur->nullRow = 1;
1ca30 0a 20 20 70 43 75 72 2d 3e 69 73 4f 72 64 65 72  .  pCur->isOrder
1ca40 65 64 20 3d 20 31 3b 0a 20 20 70 43 75 72 2d 3e  ed = 1;.  pCur->
1ca50 70 67 6e 6f 52 6f 6f 74 20 3d 20 70 32 3b 0a 23  pgnoRoot = p2;.#
1ca60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ca70 55 47 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  UG.  pCur->wrFla
1ca80 67 20 3d 20 77 72 46 6c 61 67 3b 0a 23 65 6e 64  g = wrFlag;.#end
1ca90 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  if.  rc = sqlite
1caa0 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 58 2c  3BtreeCursor(pX,
1cab0 20 70 32 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65   p2, wrFlag, pKe
1cac0 79 49 6e 66 6f 2c 20 70 43 75 72 2d 3e 75 63 2e  yInfo, pCur->uc.
1cad0 70 43 75 72 73 6f 72 29 3b 0a 20 20 70 43 75 72  pCursor);.  pCur
1cae0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1caf0 79 49 6e 66 6f 3b 0a 20 20 2f 2a 20 53 65 74 20  yInfo;.  /* Set 
1cb00 74 68 65 20 56 64 62 65 43 75 72 73 6f 72 2e 69  the VdbeCursor.i
1cb10 73 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65 2e  sTable variable.
1cb20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
1cb30 6e 73 20 6f 66 0a 20 20 2a 2a 20 53 51 4c 69 74  ns of.  ** SQLit
1cb40 65 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  e used to check 
1cb50 69 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  if the root-page
1cb60 20 66 6c 61 67 73 20 77 65 72 65 20 73 61 6e 65   flags were sane
1cb70 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20   at this point. 
1cb80 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 20 64   ** and report d
1cb90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1cba0 6f 6e 20 69 66 20 74 68 65 79 20 77 65 72 65 20  on if they were 
1cbb0 6e 6f 74 2c 20 62 75 74 20 74 68 69 73 20 63 68  not, but this ch
1cbc0 65 63 6b 20 68 61 73 0a 20 20 2a 2a 20 73 69 6e  eck has.  ** sin
1cbd0 63 65 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68  ce moved into th
1cbe0 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 20 20  e btree layer.  
1cbf0 2a 2f 20 20 0a 20 20 70 43 75 72 2d 3e 69 73 54  */  .  pCur->isT
1cc00 61 62 6c 65 20 3d 20 70 4f 70 2d 3e 70 34 74 79  able = pOp->p4ty
1cc10 70 65 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  pe!=P4_KEYINFO;.
1cc20 0a 6f 70 65 6e 5f 63 75 72 73 6f 72 5f 73 65 74  .open_cursor_set
1cc30 5f 68 69 6e 74 73 3a 0a 20 20 61 73 73 65 72 74  _hints:.  assert
1cc40 28 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  ( OPFLAG_BULKCSR
1cc50 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44  ==BTREE_BULKLOAD
1cc60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50   );.  assert( OP
1cc70 46 4c 41 47 5f 53 45 45 4b 45 51 3d 3d 42 54 52  FLAG_SEEKEQ==BTR
1cc80 45 45 5f 53 45 45 4b 5f 45 51 20 29 3b 0a 20 20  EE_SEEK_EQ );.  
1cc90 74 65 73 74 63 61 73 65 28 20 70 4f 70 2d 3e 70  testcase( pOp->p
1cca0 35 20 26 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  5 & OPFLAG_BULKC
1ccb0 53 52 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  SR );.#ifdef SQL
1ccc0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
1ccd0 52 5f 48 49 4e 54 53 0a 20 20 74 65 73 74 63 61  R_HINTS.  testca
1cce0 73 65 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50  se( pOp->p2 & OP
1ccf0 46 4c 41 47 5f 53 45 45 4b 45 51 20 29 3b 0a 23  FLAG_SEEKEQ );.#
1cd00 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
1cd10 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c  treeCursorHintFl
1cd20 61 67 73 28 70 43 75 72 2d 3e 75 63 2e 70 43 75  ags(pCur->uc.pCu
1cd30 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rsor,.          
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20       (pOp->p5 & 
1cd60 28 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c  (OPFLAG_BULKCSR|
1cd70 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 29 29  OPFLAG_SEEKEQ)))
1cd80 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1cd90 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1cda0 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
1cdb0 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65  ../* Opcode: Ope
1cdc0 6e 45 70 68 65 6d 65 72 61 6c 20 50 31 20 50 32  nEphemeral P1 P2
1cdd0 20 2a 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f   * P4 P5.** Syno
1cde0 70 73 69 73 3a 20 6e 43 6f 6c 75 6d 6e 3d 50 32  psis: nColumn=P2
1cdf0 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  .**.** Open a ne
1ce00 77 20 63 75 72 73 6f 72 20 50 31 20 74 6f 20 61  w cursor P1 to a
1ce10 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1ce20 2e 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  ..** The cursor 
1ce30 69 73 20 61 6c 77 61 79 73 20 6f 70 65 6e 65 64  is always opened
1ce40 20 72 65 61 64 2f 77 72 69 74 65 20 65 76 65 6e   read/write even
1ce50 20 69 66 20 0a 2a 2a 20 74 68 65 20 6d 61 69 6e   if .** the main
1ce60 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1ce70 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 65 70 68  d-only.  The eph
1ce80 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  emeral.** table 
1ce90 69 73 20 64 65 6c 65 74 65 64 20 61 75 74 6f 6d  is deleted autom
1cea0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
1ceb0 65 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  e cursor is clos
1cec0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20  ed..**.** P2 is 
1ced0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1cee0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 65 70 68  lumns in the eph
1cef0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  emeral table..**
1cf00 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
1cf10 74 73 20 74 6f 20 61 20 42 54 72 65 65 20 74 61  ts to a BTree ta
1cf20 62 6c 65 20 69 66 20 50 34 3d 3d 30 20 61 6e 64  ble if P4==0 and
1cf30 20 74 6f 20 61 20 42 54 72 65 65 20 69 6e 64 65   to a BTree inde
1cf40 78 0a 2a 2a 20 69 66 20 50 34 20 69 73 20 6e 6f  x.** if P4 is no
1cf50 74 20 30 2e 20 20 49 66 20 50 34 20 69 73 20 6e  t 0.  If P4 is n
1cf60 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
1cf70 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  ts to a KeyInfo 
1cf80 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
1cf90 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 66 6f  t defines the fo
1cfa0 72 6d 61 74 20 6f 66 20 6b 65 79 73 20 69 6e 20  rmat of keys in 
1cfb0 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  the index..**.**
1cfc0 20 54 68 65 20 50 35 20 70 61 72 61 6d 65 74 65   The P5 paramete
1cfd0 72 20 63 61 6e 20 62 65 20 61 20 6d 61 73 6b 20  r can be a mask 
1cfe0 6f 66 20 74 68 65 20 42 54 52 45 45 5f 2a 20 66  of the BTREE_* f
1cff0 6c 61 67 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  lags defined.** 
1d000 69 6e 20 62 74 72 65 65 2e 68 2e 20 20 54 68 65  in btree.h.  The
1d010 73 65 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  se flags control
1d020 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20   aspects of the 
1d030 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  operation of.** 
1d040 74 68 65 20 62 74 72 65 65 2e 20 20 54 68 65 20  the btree.  The 
1d050 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
1d060 41 4c 20 61 6e 64 20 42 54 52 45 45 5f 53 49 4e  AL and BTREE_SIN
1d070 47 4c 45 20 66 6c 61 67 73 20 61 72 65 0a 2a 2a  GLE flags are.**
1d080 20 61 64 64 65 64 20 61 75 74 6f 6d 61 74 69 63   added automatic
1d090 61 6c 6c 79 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f  ally..*/./* Opco
1d0a0 64 65 3a 20 4f 70 65 6e 41 75 74 6f 69 6e 64 65  de: OpenAutoinde
1d0b0 78 20 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a  x P1 P2 * P4 *.*
1d0c0 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6e 43 6f 6c  * Synopsis: nCol
1d0d0 75 6d 6e 3d 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69  umn=P2.**.** Thi
1d0e0 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b 73 20 74  s opcode works t
1d0f0 68 65 20 73 61 6d 65 20 61 73 20 4f 50 5f 4f 70  he same as OP_Op
1d100 65 6e 45 70 68 65 6d 65 72 61 6c 2e 20 20 49 74  enEphemeral.  It
1d110 20 68 61 73 20 61 0a 2a 2a 20 64 69 66 66 65 72   has a.** differ
1d120 65 6e 74 20 6e 61 6d 65 20 74 6f 20 64 69 73 74  ent name to dist
1d130 69 6e 67 75 69 73 68 20 69 74 73 20 75 73 65 2e  inguish its use.
1d140 20 20 54 61 62 6c 65 73 20 63 72 65 61 74 65 64    Tables created
1d150 20 75 73 69 6e 67 0a 2a 2a 20 62 79 20 74 68 69   using.** by thi
1d160 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 62 65  s opcode will be
1d170 20 75 73 65 64 20 66 6f 72 20 61 75 74 6f 6d 61   used for automa
1d180 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
1d190 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 69 6e 64  transient.** ind
1d1a0 69 63 65 73 20 69 6e 20 6a 6f 69 6e 73 2e 0a 2a  ices in joins..*
1d1b0 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65 6e 41 75  /.case OP_OpenAu
1d1c0 74 6f 69 6e 64 65 78 3a 20 0a 63 61 73 65 20 4f  toindex: .case O
1d1d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 3a  P_OpenEphemeral:
1d1e0 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20   {.  VdbeCursor 
1d1f0 2a 70 43 78 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  *pCx;.  KeyInfo 
1d200 2a 70 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 73 74  *pKeyInfo;..  st
1d210 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 76  atic const int v
1d220 66 73 46 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  fsFlags = .     
1d230 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1d240 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 53  DWRITE |.      S
1d250 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1d260 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1d270 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1d280 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
1d290 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1d2a0 45 20 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45  E |.      SQLITE
1d2b0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1d2c0 44 42 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  DB;.  assert( pO
1d2d0 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61 73  p->p1>=0 );.  as
1d2e0 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30  sert( pOp->p2>=0
1d2f0 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c 6f   );.  pCx = allo
1d300 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70 4f  cateCursor(p, pO
1d310 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
1d320 2d 31 2c 20 43 55 52 54 59 50 45 5f 42 54 52 45  -1, CURTYPE_BTRE
1d330 45 29 3b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  E);.  if( pCx==0
1d340 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
1d350 20 20 70 43 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d    pCx->nullRow =
1d360 20 31 3b 0a 20 20 70 43 78 2d 3e 69 73 45 70 68   1;.  pCx->isEph
1d370 65 6d 65 72 61 6c 20 3d 20 31 3b 0a 20 20 72 63  emeral = 1;.  rc
1d380 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
1d390 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
1d3a0 20 64 62 2c 20 26 70 43 78 2d 3e 70 42 74 78 2c   db, &pCx->pBtx,
1d3b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1d3c0 20 20 20 20 20 20 20 20 20 20 42 54 52 45 45 5f            BTREE_
1d3d0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 7c 20 42  OMIT_JOURNAL | B
1d3e0 54 52 45 45 5f 53 49 4e 47 4c 45 20 7c 20 70 4f  TREE_SINGLE | pO
1d3f0 70 2d 3e 70 35 2c 20 76 66 73 46 6c 61 67 73 29  p->p5, vfsFlags)
1d400 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1d410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1d420 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
1d430 67 69 6e 54 72 61 6e 73 28 70 43 78 2d 3e 70 42  ginTrans(pCx->pB
1d440 74 78 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  tx, 1);.  }.  if
1d450 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d460 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  ){.    /* If a t
1d470 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 69  ransient index i
1d480 73 20 72 65 71 75 69 72 65 64 2c 20 63 72 65 61  s required, crea
1d490 74 65 20 69 74 20 62 79 20 63 61 6c 6c 69 6e 67  te it by calling
1d4a0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
1d4b0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1d4c0 29 20 77 69 74 68 20 74 68 65 20 42 54 52 45 45  ) with the BTREE
1d4d0 5f 42 4c 4f 42 4b 45 59 20 66 6c 61 67 20 62 65  _BLOBKEY flag be
1d4e0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  fore.    ** open
1d4f0 69 6e 67 20 69 74 2e 20 49 66 20 61 20 74 72 61  ing it. If a tra
1d500 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 69 73 20  nsient table is 
1d510 72 65 71 75 69 72 65 64 2c 20 6a 75 73 74 20 75  required, just u
1d520 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 75  se the.    ** au
1d530 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1d540 74 65 64 20 74 61 62 6c 65 20 77 69 74 68 20 72  ted table with r
1d550 6f 6f 74 2d 70 61 67 65 20 31 20 28 61 6e 20 42  oot-page 1 (an B
1d560 4c 4f 42 5f 49 4e 54 4b 45 59 20 74 61 62 6c 65  LOB_INTKEY table
1d570 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1d580 28 20 28 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f  ( (pCx->pKeyInfo
1d590 20 3d 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f   = pKeyInfo = pO
1d5a0 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 29 21  p->p4.pKeyInfo)!
1d5b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1d5c0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  pgno;.      asse
1d5d0 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
1d5e0 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20  =P4_KEYINFO );. 
1d5f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d600 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1d610 65 28 70 43 78 2d 3e 70 42 74 78 2c 20 26 70 67  e(pCx->pBtx, &pg
1d620 6e 6f 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  no, BTREE_BLOBKE
1d630 59 20 7c 20 70 4f 70 2d 3e 70 35 29 3b 20 0a 20  Y | pOp->p5); . 
1d640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d660 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
1d670 4d 41 53 54 45 52 5f 52 4f 4f 54 2b 31 20 29 3b  MASTER_ROOT+1 );
1d680 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d690 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64   pKeyInfo->db==d
1d6a0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b );.        ass
1d6b0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  ert( pKeyInfo->e
1d6c0 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29 3b 0a 20  nc==ENC(db) );. 
1d6d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d6e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70  te3BtreeCursor(p
1d6f0 43 78 2d 3e 70 42 74 78 2c 20 70 67 6e 6f 2c 20  Cx->pBtx, pgno, 
1d700 42 54 52 45 45 5f 57 52 43 53 52 2c 0a 20 20 20  BTREE_WRCSR,.   
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 65               pKe
1d730 79 49 6e 66 6f 2c 20 70 43 78 2d 3e 75 63 2e 70  yInfo, pCx->uc.p
1d740 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
1d750 0a 20 20 20 20 20 20 70 43 78 2d 3e 69 73 54 61  .      pCx->isTa
1d760 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ble = 0;.    }el
1d770 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1d780 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d790 72 28 70 43 78 2d 3e 70 42 74 78 2c 20 4d 41 53  r(pCx->pBtx, MAS
1d7a0 54 45 52 5f 52 4f 4f 54 2c 20 42 54 52 45 45 5f  TER_ROOT, BTREE_
1d7b0 57 52 43 53 52 2c 0a 20 20 20 20 20 20 20 20 20  WRCSR,.         
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 30 2c 20 70 43 78 2d 3e 75 63 2e       0, pCx->uc.
1d7e0 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  pCursor);.      
1d7f0 70 43 78 2d 3e 69 73 54 61 62 6c 65 20 3d 20 31  pCx->isTable = 1
1d800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d810 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72  ( rc ) goto abor
1d820 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
1d830 20 20 70 43 78 2d 3e 69 73 4f 72 64 65 72 65 64    pCx->isOrdered
1d840 20 3d 20 28 70 4f 70 2d 3e 70 35 21 3d 42 54 52   = (pOp->p5!=BTR
1d850 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
1d860 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
1d870 63 6f 64 65 3a 20 53 6f 72 74 65 72 4f 70 65 6e  code: SorterOpen
1d880 20 50 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a   P1 P2 P3 P4 *.*
1d890 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  *.** This opcode
1d8a0 20 77 6f 72 6b 73 20 6c 69 6b 65 20 4f 50 5f 4f   works like OP_O
1d8b0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 65 78 63  penEphemeral exc
1d8c0 65 70 74 20 74 68 61 74 20 69 74 20 6f 70 65 6e  ept that it open
1d8d0 73 0a 2a 2a 20 61 20 74 72 61 6e 73 69 65 6e 74  s.** a transient
1d8e0 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 73   index that is s
1d8f0 70 65 63 69 66 69 63 61 6c 6c 79 20 64 65 73 69  pecifically desi
1d900 67 6e 65 64 20 74 6f 20 73 6f 72 74 20 6c 61 72  gned to sort lar
1d910 67 65 0a 2a 2a 20 74 61 62 6c 65 73 20 75 73 69  ge.** tables usi
1d920 6e 67 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 6d  ng an external m
1d930 65 72 67 65 2d 73 6f 72 74 20 61 6c 67 6f 72 69  erge-sort algori
1d940 74 68 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  thm..**.** If ar
1d950 67 75 6d 65 6e 74 20 50 33 20 69 73 20 6e 6f 6e  gument P3 is non
1d960 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
1d970 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1d980 65 20 73 6f 72 74 65 72 20 6d 61 79 0a 2a 2a 20  e sorter may.** 
1d990 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 73 74  assume that a st
1d9a0 61 62 6c 65 20 73 6f 72 74 20 63 6f 6e 73 69 64  able sort consid
1d9b0 65 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ering the first 
1d9c0 50 33 20 66 69 65 6c 64 73 20 6f 66 20 65 61 63  P3 fields of eac
1d9d0 68 0a 2a 2a 20 6b 65 79 20 69 73 20 73 75 66 66  h.** key is suff
1d9e0 69 63 69 65 6e 74 20 74 6f 20 70 72 6f 64 75 63  icient to produc
1d9f0 65 20 74 68 65 20 72 65 71 75 69 72 65 64 20 72  e the required r
1da00 65 73 75 6c 74 73 2e 0a 2a 2f 0a 63 61 73 65 20  esults..*/.case 
1da10 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3a 20 7b  OP_SorterOpen: {
1da20 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1da30 43 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Cx;..  assert( p
1da40 4f 70 2d 3e 70 31 3e 3d 30 20 29 3b 0a 20 20 61  Op->p1>=0 );.  a
1da50 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
1da60 30 20 29 3b 0a 20 20 70 43 78 20 3d 20 61 6c 6c  0 );.  pCx = all
1da70 6f 63 61 74 65 43 75 72 73 6f 72 28 70 2c 20 70  ocateCursor(p, p
1da80 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
1da90 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 53 4f 52   -1, CURTYPE_SOR
1daa0 54 45 52 29 3b 0a 20 20 69 66 28 20 70 43 78 3d  TER);.  if( pCx=
1dab0 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
1dac0 3b 0a 20 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66  ;.  pCx->pKeyInf
1dad0 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
1dae0 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  Info;.  assert( 
1daf0 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  pCx->pKeyInfo->d
1db00 62 3d 3d 64 62 20 29 3b 0a 20 20 61 73 73 65 72  b==db );.  asser
1db10 74 28 20 70 43 78 2d 3e 70 4b 65 79 49 6e 66 6f  t( pCx->pKeyInfo
1db20 2d 3e 65 6e 63 3d 3d 45 4e 43 28 64 62 29 20 29  ->enc==ENC(db) )
1db30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1db40 56 64 62 65 53 6f 72 74 65 72 49 6e 69 74 28 64  VdbeSorterInit(d
1db50 62 2c 20 70 4f 70 2d 3e 70 33 2c 20 70 43 78 29  b, pOp->p3, pCx)
1db60 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1db70 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
1db80 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
1db90 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 71  ../* Opcode: Seq
1dba0 75 65 6e 63 65 54 65 73 74 20 50 31 20 50 32 20  uenceTest P1 P2 
1dbb0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
1dbc0 73 3a 20 69 66 28 20 63 75 72 73 6f 72 5b 50 31  s: if( cursor[P1
1dbd0 5d 2e 63 74 72 2b 2b 20 29 20 70 63 20 3d 20 50  ].ctr++ ) pc = P
1dbe0 32 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20  2.**.** P1 is a 
1dbf0 73 6f 72 74 65 72 20 63 75 72 73 6f 72 2e 20 49  sorter cursor. I
1dc00 66 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 63  f the sequence c
1dc10 6f 75 6e 74 65 72 20 69 73 20 63 75 72 72 65 6e  ounter is curren
1dc20 74 6c 79 20 7a 65 72 6f 2c 20 6a 75 6d 70 0a 2a  tly zero, jump.*
1dc30 2a 20 74 6f 20 50 32 2e 20 52 65 67 61 72 64 6c  * to P2. Regardl
1dc40 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
1dc50 72 20 6e 6f 74 20 74 68 65 20 6a 75 6d 70 20 69  r not the jump i
1dc60 73 20 74 61 6b 65 6e 2c 20 69 6e 63 72 65 6d 65  s taken, increme
1dc70 6e 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 73 65  nt the.** the se
1dc80 71 75 65 6e 63 65 20 76 61 6c 75 65 2e 0a 2a 2f  quence value..*/
1dc90 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e 63  .case OP_Sequenc
1dca0 65 54 65 73 74 3a 20 7b 0a 20 20 56 64 62 65 43  eTest: {.  VdbeC
1dcb0 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 61 73 73  ursor *pC;.  ass
1dcc0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1dcd0 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1dce0 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20  ursor );.  pC = 
1dcf0 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
1dd00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53  ];.  assert( isS
1dd10 6f 72 74 65 72 28 70 43 29 20 29 3b 0a 20 20 69  orter(pC) );.  i
1dd20 66 28 20 28 70 43 2d 3e 73 65 71 43 6f 75 6e 74  f( (pC->seqCount
1dd30 2b 2b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ++)==0 ){.    go
1dd40 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
1dd50 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
1dd60 2a 20 4f 70 63 6f 64 65 3a 20 4f 70 65 6e 50 73  * Opcode: OpenPs
1dd70 65 75 64 6f 20 50 31 20 50 32 20 50 33 20 2a 20  eudo P1 P2 P3 * 
1dd80 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 50  *.** Synopsis: P
1dd90 33 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 5b 50  3 columns in r[P
1dda0 32 5d 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  2].**.** Open a 
1ddb0 6e 65 77 20 63 75 72 73 6f 72 20 74 68 61 74 20  new cursor that 
1ddc0 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 61 6b 65  points to a fake
1ddd0 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
1dde0 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  ains a single.**
1ddf0 20 72 6f 77 20 6f 66 20 64 61 74 61 2e 20 20 54   row of data.  T
1de00 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1de10 61 74 20 6f 6e 65 20 72 6f 77 20 69 73 20 74 68  at one row is th
1de20 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 6d 65 6d  e content of mem
1de30 6f 72 79 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  ory.** register 
1de40 50 32 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  P2.  In other wo
1de50 72 64 73 2c 20 63 75 72 73 6f 72 20 50 31 20 62  rds, cursor P1 b
1de60 65 63 6f 6d 65 73 20 61 6e 20 61 6c 69 61 73 20  ecomes an alias 
1de70 66 6f 72 20 74 68 65 20 0a 2a 2a 20 4d 45 4d 5f  for the .** MEM_
1de80 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 20 63 6f 6e  Blob content con
1de90 74 61 69 6e 65 64 20 69 6e 20 72 65 67 69 73 74  tained in regist
1dea0 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  er P2..**.** A p
1deb0 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 72 65 61  seudo-table crea
1dec0 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 63 6f  ted by this opco
1ded0 64 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f  de is used to ho
1dee0 6c 64 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72  ld a single.** r
1def0 6f 77 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 74  ow output from t
1df00 68 65 20 73 6f 72 74 65 72 20 73 6f 20 74 68 61  he sorter so tha
1df10 74 20 74 68 65 20 72 6f 77 20 63 61 6e 20 62 65  t the row can be
1df20 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f   decomposed into
1df30 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 63  .** individual c
1df40 6f 6c 75 6d 6e 73 20 75 73 69 6e 67 20 74 68 65  olumns using the
1df50 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64   OP_Column opcod
1df60 65 2e 20 20 54 68 65 20 4f 50 5f 43 6f 6c 75 6d  e.  The OP_Colum
1df70 6e 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 74  n opcode.** is t
1df80 68 65 20 6f 6e 6c 79 20 63 75 72 73 6f 72 20 6f  he only cursor o
1df90 70 63 6f 64 65 20 74 68 61 74 20 77 6f 72 6b 73  pcode that works
1dfa0 20 77 69 74 68 20 61 20 70 73 65 75 64 6f 2d 74   with a pseudo-t
1dfb0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 50 33 20 69  able..**.** P3 i
1dfc0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1dfd0 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 72 65  fields in the re
1dfe0 63 6f 72 64 73 20 74 68 61 74 20 77 69 6c 6c 20  cords that will 
1dff0 62 65 20 73 74 6f 72 65 64 20 62 79 0a 2a 2a 20  be stored by.** 
1e000 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  the pseudo-table
1e010 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f 70 65  ..*/.case OP_Ope
1e020 6e 50 73 65 75 64 6f 3a 20 7b 0a 20 20 56 64 62  nPseudo: {.  Vdb
1e030 65 43 75 72 73 6f 72 20 2a 70 43 78 3b 0a 0a 20  eCursor *pCx;.. 
1e040 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
1e050 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1e060 20 70 4f 70 2d 3e 70 33 3e 3d 30 20 29 3b 0a 20   pOp->p3>=0 );. 
1e070 20 70 43 78 20 3d 20 61 6c 6c 6f 63 61 74 65 43   pCx = allocateC
1e080 75 72 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31  ursor(p, pOp->p1
1e090 2c 20 70 4f 70 2d 3e 70 33 2c 20 2d 31 2c 20 43  , pOp->p3, -1, C
1e0a0 55 52 54 59 50 45 5f 50 53 45 55 44 4f 29 3b 0a  URTYPE_PSEUDO);.
1e0b0 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 20 67    if( pCx==0 ) g
1e0c0 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 70 43  oto no_mem;.  pC
1e0d0 78 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  x->nullRow = 1;.
1e0e0 20 20 70 43 78 2d 3e 75 63 2e 70 73 65 75 64 6f    pCx->uc.pseudo
1e0f0 54 61 62 6c 65 52 65 67 20 3d 20 70 4f 70 2d 3e  TableReg = pOp->
1e100 70 32 3b 0a 20 20 70 43 78 2d 3e 69 73 54 61 62  p2;.  pCx->isTab
1e110 6c 65 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  le = 1;.  assert
1e120 28 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29 3b 0a  ( pOp->p5==0 );.
1e130 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
1e140 70 63 6f 64 65 3a 20 43 6c 6f 73 65 20 50 31 20  pcode: Close P1 
1e150 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 43 6c  * * * *.**.** Cl
1e160 6f 73 65 20 61 20 63 75 72 73 6f 72 20 70 72 65  ose a cursor pre
1e170 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 61  viously opened a
1e180 73 20 50 31 2e 20 20 49 66 20 50 31 20 69 73 20  s P1.  If P1 is 
1e190 6e 6f 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  not.** currently
1e1a0 20 6f 70 65 6e 2c 20 74 68 69 73 20 69 6e 73 74   open, this inst
1e1b0 72 75 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  ruction is a no-
1e1c0 6f 70 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43  op..*/.case OP_C
1e1d0 6c 6f 73 65 3a 20 7b 0a 20 20 61 73 73 65 72 74  lose: {.  assert
1e1e0 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20  ( pOp->p1>=0 && 
1e1f0 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73  pOp->p1<p->nCurs
1e200 6f 72 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  or );.  sqlite3V
1e210 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
1e220 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
1e230 31 5d 29 3b 0a 20 20 70 2d 3e 61 70 43 73 72 5b  1]);.  p->apCsr[
1e240 70 4f 70 2d 3e 70 31 5d 20 3d 20 30 3b 0a 20 20  pOp->p1] = 0;.  
1e250 62 72 65 61 6b 3b 0a 7d 0a 0a 23 69 66 64 65 66  break;.}..#ifdef
1e260 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
1e270 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
1e280 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6f 6c 75 6d  /* Opcode: Colum
1e290 6e 73 55 73 65 64 20 50 31 20 2a 20 2a 20 50 34  nsUsed P1 * * P4
1e2a0 20 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70   *.**.** This op
1e2b0 63 6f 64 65 20 28 77 68 69 63 68 20 6f 6e 6c 79  code (which only
1e2c0 20 65 78 69 73 74 73 20 69 66 20 53 51 4c 69 74   exists if SQLit
1e2d0 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
1e2e0 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e  ith.** SQLITE_EN
1e2f0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
1e300 5f 4d 41 53 4b 29 20 69 64 65 6e 74 69 66 69 65  _MASK) identifie
1e310 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  s which columns 
1e320 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
1e330 6f 72 20 69 6e 64 65 78 20 66 6f 72 20 63 75 72  or index for cur
1e340 73 6f 72 20 50 31 20 61 72 65 20 75 73 65 64 2e  sor P1 are used.
1e350 20 20 50 34 20 69 73 20 61 20 36 34 2d 62 69 74    P4 is a 64-bit
1e360 20 69 6e 74 65 67 65 72 0a 2a 2a 20 28 50 34 5f   integer.** (P4_
1e370 49 4e 54 36 34 29 20 69 6e 20 77 68 69 63 68 20  INT64) in which 
1e380 74 68 65 20 66 69 72 73 74 20 36 33 20 62 69 74  the first 63 bit
1e390 73 20 61 72 65 20 6f 6e 65 20 66 6f 72 20 65 61  s are one for ea
1e3a0 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ch of the.** fir
1e3b0 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66  st 63 columns of
1e3c0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
1e3d0 64 65 78 20 74 68 61 74 20 61 72 65 20 61 63 74  dex that are act
1e3e0 75 61 6c 6c 79 20 75 73 65 64 0a 2a 2a 20 62 79  ually used.** by
1e3f0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
1e400 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74  e high-order bit
1e410 20 69 73 20 73 65 74 20 69 66 20 61 6e 79 20 63   is set if any c
1e420 6f 6c 75 6d 6e 20 61 66 74 65 72 0a 2a 2a 20 74  olumn after.** t
1e430 68 65 20 36 34 74 68 20 69 73 20 75 73 65 64 2e  he 64th is used.
1e440 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6f 6c 75  .*/.case OP_Colu
1e450 6d 6e 73 55 73 65 64 3a 20 7b 0a 20 20 56 64 62  mnsUsed: {.  Vdb
1e460 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 70  eCursor *pC;.  p
1e470 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
1e480 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
1e490 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
1e4a0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
1e4b0 20 20 70 43 2d 3e 6d 61 73 6b 55 73 65 64 20 3d    pC->maskUsed =
1e4c0 20 2a 28 75 36 34 2a 29 70 4f 70 2d 3e 70 34 2e   *(u64*)pOp->p4.
1e4d0 70 49 36 34 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  pI64;.  break;.}
1e4e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f  .#endif../* Opco
1e4f0 64 65 3a 20 53 65 65 6b 47 45 20 50 31 20 50 32  de: SeekGE P1 P2
1e500 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f   P3 P4 *.** Syno
1e510 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50  psis: key=r[P3@P
1e520 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63 75 72 73  4].**.** If curs
1e530 6f 72 20 50 31 20 72 65 66 65 72 73 20 74 6f 20  or P1 refers to 
1e540 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 28 42 2d  an SQL table (B-
1e550 54 72 65 65 20 74 68 61 74 20 75 73 65 73 20 69  Tree that uses i
1e560 6e 74 65 67 65 72 20 6b 65 79 73 29 2c 20 0a 2a  nteger keys), .*
1e570 2a 20 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  * use the value 
1e580 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 20 61  in register P3 a
1e590 73 20 74 68 65 20 6b 65 79 2e 20 20 49 66 20 63  s the key.  If c
1e5a0 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1e5b0 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
1e5c0 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
1e5d0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
1e5e0 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
1e5f0 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
1e600 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
1e610 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1e620 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
1e630 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
1e640 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73   that  it points
1e650 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
1e660 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1e670 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1e680 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1e690 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  key value. If th
1e6a0 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63 6f 72  ere are no recor
1e6b0 64 73 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  ds .** greater t
1e6c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1e6d0 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1e6e0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1e6f0 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1e700 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
1e710 20 50 31 20 77 61 73 20 6f 70 65 6e 65 64 20 75   P1 was opened u
1e720 73 69 6e 67 20 74 68 65 20 4f 50 46 4c 41 47 5f  sing the OPFLAG_
1e730 53 45 45 4b 45 51 20 66 6c 61 67 2c 20 74 68 65  SEEKEQ flag, the
1e740 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65  n this.** opcode
1e750 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 6c 61 6e   will always lan
1e760 64 20 6f 6e 20 61 20 72 65 63 6f 72 64 20 74 68  d on a record th
1e770 61 74 20 65 71 75 61 6c 6c 79 20 65 71 75 61 6c  at equally equal
1e780 73 20 74 68 65 20 6b 65 79 2c 20 6f 72 0a 2a 2a  s the key, or.**
1e790 20 65 6c 73 65 20 6a 75 6d 70 20 69 6d 6d 65 64   else jump immed
1e7a0 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 57  iately to P2.  W
1e7b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
1e7c0 73 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 2c  s OPFLAG_SEEKEQ,
1e7d0 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f 64 65 20   this.** opcode 
1e7e0 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
1e7f0 20 62 79 20 61 6e 20 49 64 78 4c 45 20 6f 70 63   by an IdxLE opc
1e800 6f 64 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ode with the sam
1e810 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20  e arguments..** 
1e820 54 68 65 20 49 64 78 4c 45 20 6f 70 63 6f 64 65  The IdxLE opcode
1e830 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
1e840 20 69 66 20 74 68 69 73 20 6f 70 63 6f 64 65 20   if this opcode 
1e850 73 75 63 63 65 65 64 73 2c 20 62 75 74 20 74 68  succeeds, but th
1e860 65 0a 2a 2a 20 49 64 78 4c 45 20 6f 70 63 6f 64  e.** IdxLE opcod
1e870 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 6f  e will be used o
1e880 6e 20 73 75 62 73 65 71 75 65 6e 74 20 6c 6f 6f  n subsequent loo
1e890 70 20 69 74 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a  p iterations..**
1e8a0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
1e8b0 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
1e8c0 72 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  r configured to 
1e8d0 6d 6f 76 65 20 69 6e 20 66 6f 72 77 61 72 64 20  move in forward 
1e8e0 6f 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74  order,.** from t
1e8f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 77  he beginning tow
1e900 61 72 64 20 74 68 65 20 65 6e 64 2e 20 20 49 6e  ard the end.  In
1e910 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1e920 65 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63  e cursor is.** c
1e930 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
1e940 20 4e 65 78 74 2c 20 6e 6f 74 20 50 72 65 76 2e   Next, not Prev.
1e950 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1e960 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1e970 2c 20 53 65 65 6b 4c 74 2c 20 53 65 65 6b 47 74  , SeekLt, SeekGt
1e980 2c 20 53 65 65 6b 4c 65 0a 2a 2f 0a 2f 2a 20 4f  , SeekLe.*/./* O
1e990 70 63 6f 64 65 3a 20 53 65 65 6b 47 54 20 50 31  pcode: SeekGT P1
1e9a0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
1e9b0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
1e9c0 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 63  3@P4].**.** If c
1e9d0 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1e9e0 74 6f 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  to an SQL table 
1e9f0 28 42 2d 54 72 65 65 20 74 68 61 74 20 75 73 65  (B-Tree that use
1ea00 73 20 69 6e 74 65 67 65 72 20 6b 65 79 73 29 2c  s integer keys),
1ea10 20 0a 2a 2a 20 75 73 65 20 74 68 65 20 76 61 6c   .** use the val
1ea20 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ue in register P
1ea30 33 20 61 73 20 61 20 6b 65 79 2e 20 49 66 20 63  3 as a key. If c
1ea40 75 72 73 6f 72 20 50 31 20 72 65 66 65 72 73 20  ursor P1 refers 
1ea50 0a 2a 2a 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  .** to an SQL in
1ea60 64 65 78 2c 20 74 68 65 6e 20 50 33 20 69 73 20  dex, then P3 is 
1ea70 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20  the first in an 
1ea80 61 72 72 61 79 20 6f 66 20 50 34 20 72 65 67 69  array of P4 regi
1ea90 73 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20 61  sters .** that a
1eaa0 72 65 20 75 73 65 64 20 61 73 20 61 6e 20 75 6e  re used as an un
1eab0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1eac0 2e 20 0a 2a 2a 0a 2a 2a 20 52 65 70 6f 73 69 74  . .**.** Reposit
1ead0 69 6f 6e 20 63 75 72 73 6f 72 20 50 31 20 73 6f  ion cursor P1 so
1eae0 20 74 68 61 74 20 20 69 74 20 70 6f 69 6e 74 73   that  it points
1eaf0 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
1eb00 20 65 6e 74 72 79 20 74 68 61 74 20 0a 2a 2a 20   entry that .** 
1eb10 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1eb20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49  the key value. I
1eb30 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72  f there are no r
1eb40 65 63 6f 72 64 73 20 67 72 65 61 74 65 72 20 74  ecords greater t
1eb50 68 61 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79 20  han .** the key 
1eb60 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a 65  and P2 is not ze
1eb70 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ro, then jump to
1eb80 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   P2..**.** This 
1eb90 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68  opcode leaves th
1eba0 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67 75  e cursor configu
1ebb0 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66  red to move in f
1ebc0 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a  orward order,.**
1ebd0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
1ebe0 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 65  ing toward the e
1ebf0 6e 64 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  nd.  In other wo
1ec00 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72 20  rds, the cursor 
1ec10 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  is.** configured
1ec20 20 74 6f 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f   to use Next, no
1ec30 74 20 50 72 65 76 2e 0a 2a 2a 0a 2a 2a 20 53 65  t Prev..**.** Se
1ec40 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20 4e  e also: Found, N
1ec50 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 4c 74 2c  otFound, SeekLt,
1ec60 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65 0a   SeekGe, SeekLe.
1ec70 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65  */./* Opcode: Se
1ec80 65 6b 4c 54 20 50 31 20 50 32 20 50 33 20 50 34  ekLT P1 P2 P3 P4
1ec90 20 2a 20 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a   * .** Synopsis:
1eca0 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
1ecb0 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1ecc0 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1ecd0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1ece0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1ecf0 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1ed00 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1ed10 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
1ed20 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
1ed30 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
1ed40 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
1ed50 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
1ed60 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
1ed70 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
1ed80 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
1ed90 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
1eda0 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
1edb0 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
1edc0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 20 69  or P1 so that  i
1edd0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1ede0 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68  largest entry th
1edf0 61 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  at .** is less t
1ee00 68 61 6e 20 74 68 65 20 6b 65 79 20 76 61 6c 75  han the key valu
1ee10 65 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  e. If there are 
1ee20 6e 6f 20 72 65 63 6f 72 64 73 20 6c 65 73 73 20  no records less 
1ee30 74 68 61 6e 20 0a 2a 2a 20 74 68 65 20 6b 65 79  than .** the key
1ee40 20 61 6e 64 20 50 32 20 69 73 20 6e 6f 74 20 7a   and P2 is not z
1ee50 65 72 6f 2c 20 74 68 65 6e 20 6a 75 6d 70 20 74  ero, then jump t
1ee60 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  o P2..**.** This
1ee70 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73 20 74   opcode leaves t
1ee80 68 65 20 63 75 72 73 6f 72 20 63 6f 6e 66 69 67  he cursor config
1ee90 75 72 65 64 20 74 6f 20 6d 6f 76 65 20 69 6e 20  ured to move in 
1eea0 72 65 76 65 72 73 65 20 6f 72 64 65 72 2c 0a 2a  reverse order,.*
1eeb0 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74  * from the end t
1eec0 6f 77 61 72 64 20 74 68 65 20 62 65 67 69 6e 6e  oward the beginn
1eed0 69 6e 67 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ing.  In other w
1eee0 6f 72 64 73 2c 20 74 68 65 20 63 75 72 73 6f 72  ords, the cursor
1eef0 20 69 73 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65   is.** configure
1ef00 64 20 74 6f 20 75 73 65 20 50 72 65 76 2c 20 6e  d to use Prev, n
1ef10 6f 74 20 4e 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 53  ot Next..**.** S
1ef20 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
1ef30 4e 6f 74 46 6f 75 6e 64 2c 20 53 65 65 6b 47 74  NotFound, SeekGt
1ef40 2c 20 53 65 65 6b 47 65 2c 20 53 65 65 6b 4c 65  , SeekGe, SeekLe
1ef50 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
1ef60 65 65 6b 4c 45 20 50 31 20 50 32 20 50 33 20 50  eekLE P1 P2 P3 P
1ef70 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  4 *.** Synopsis:
1ef80 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a   key=r[P3@P4].**
1ef90 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 20 50 31  .** If cursor P1
1efa0 20 72 65 66 65 72 73 20 74 6f 20 61 6e 20 53 51   refers to an SQ
1efb0 4c 20 74 61 62 6c 65 20 28 42 2d 54 72 65 65 20  L table (B-Tree 
1efc0 74 68 61 74 20 75 73 65 73 20 69 6e 74 65 67 65  that uses intege
1efd0 72 20 6b 65 79 73 29 2c 20 0a 2a 2a 20 75 73 65  r keys), .** use
1efe0 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
1eff0 67 69 73 74 65 72 20 50 33 20 61 73 20 61 20 6b  gister P3 as a k
1f000 65 79 2e 20 49 66 20 63 75 72 73 6f 72 20 50 31  ey. If cursor P1
1f010 20 72 65 66 65 72 73 20 0a 2a 2a 20 74 6f 20 61   refers .** to a
1f020 6e 20 53 51 4c 20 69 6e 64 65 78 2c 20 74 68 65  n SQL index, the
1f030 6e 20 50 33 20 69 73 20 74 68 65 20 66 69 72 73  n P3 is the firs
1f040 74 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  t in an array of
1f050 20 50 34 20 72 65 67 69 73 74 65 72 73 20 0a 2a   P4 registers .*
1f060 2a 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  * that are used 
1f070 61 73 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  as an unpacked i
1f080 6e 64 65 78 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a  ndex key. .**.**
1f090 20 52 65 70 6f 73 69 74 69 6f 6e 20 63 75 72 73   Reposition curs
1f0a0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
1f0b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
1f0c0 61 72 67 65 73 74 20 65 6e 74 72 79 20 74 68 61  argest entry tha
1f0d0 74 20 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  t .** is less th
1f0e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1f0f0 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66  he key value. If
1f100 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65   there are no re
1f110 63 6f 72 64 73 20 0a 2a 2a 20 6c 65 73 73 20 74  cords .** less t
1f120 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1f130 74 68 65 20 6b 65 79 20 61 6e 64 20 50 32 20 69  the key and P2 i
1f140 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
1f150 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a 2a 0a   jump to P2..**.
1f160 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c  ** This opcode l
1f170 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
1f180 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d   configured to m
1f190 6f 76 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ove in reverse o
1f1a0 72 64 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68  rder,.** from th
1f1b0 65 20 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65  e end toward the
1f1c0 20 62 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20   beginning.  In 
1f1d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1f1e0 20 63 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f   cursor is.** co
1f1f0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
1f200 50 72 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a  Prev, not Next..
1f210 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
1f220 73 6f 72 20 50 31 20 77 61 73 20 6f 70 65 6e 65  sor P1 was opene
1f230 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 46 4c  d using the OPFL
1f240 41 47 5f 53 45 45 4b 45 51 20 66 6c 61 67 2c 20  AG_SEEKEQ flag, 
1f250 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 6f 70 63  then this.** opc
1f260 6f 64 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ode will always 
1f270 6c 61 6e 64 20 6f 6e 20 61 20 72 65 63 6f 72 64  land on a record
1f280 20 74 68 61 74 20 65 71 75 61 6c 6c 79 20 65 71   that equally eq
1f290 75 61 6c 73 20 74 68 65 20 6b 65 79 2c 20 6f 72  uals the key, or
1f2a0 0a 2a 2a 20 65 6c 73 65 20 6a 75 6d 70 20 69 6d  .** else jump im
1f2b0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e  mediately to P2.
1f2c0 20 20 57 68 65 6e 20 74 68 65 20 63 75 72 73 6f    When the curso
1f2d0 72 20 69 73 20 4f 50 46 4c 41 47 5f 53 45 45 4b  r is OPFLAG_SEEK
1f2e0 45 51 2c 20 74 68 69 73 0a 2a 2a 20 6f 70 63 6f  EQ, this.** opco
1f2f0 64 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  de must be follo
1f300 77 65 64 20 62 79 20 61 6e 20 49 64 78 47 45 20  wed by an IdxGE 
1f310 6f 70 63 6f 64 65 20 77 69 74 68 20 74 68 65 20  opcode with the 
1f320 73 61 6d 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a  same arguments..
1f330 2a 2a 20 54 68 65 20 49 64 78 47 45 20 6f 70 63  ** The IdxGE opc
1f340 6f 64 65 20 77 69 6c 6c 20 62 65 20 73 6b 69 70  ode will be skip
1f350 70 65 64 20 69 66 20 74 68 69 73 20 6f 70 63 6f  ped if this opco
1f360 64 65 20 73 75 63 63 65 65 64 73 2c 20 62 75 74  de succeeds, but
1f370 20 74 68 65 0a 2a 2a 20 49 64 78 47 45 20 6f 70   the.** IdxGE op
1f380 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 73 65  code will be use
1f390 64 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20  d on subsequent 
1f3a0 6c 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 73 2e  loop iterations.
1f3b0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
1f3c0 20 46 6f 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64   Found, NotFound
1f3d0 2c 20 53 65 65 6b 47 74 2c 20 53 65 65 6b 47 65  , SeekGt, SeekGe
1f3e0 2c 20 53 65 65 6b 4c 74 0a 2a 2f 0a 63 61 73 65  , SeekLt.*/.case
1f3f0 20 4f 50 5f 53 65 65 6b 4c 54 3a 20 20 20 20 20   OP_SeekLT:     
1f400 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1f410 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b   */.case OP_Seek
1f420 4c 45 3a 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  LE:         /* j
1f430 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
1f440 20 4f 50 5f 53 65 65 6b 47 45 3a 20 20 20 20 20   OP_SeekGE:     
1f450 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
1f460 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 65 65 6b   */.case OP_Seek
1f470 47 54 3a 20 7b 20 20 20 20 20 20 20 2f 2a 20 6a  GT: {       /* j
1f480 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  ump, in3 */.  in
1f490 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1f4a0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 72   /* Comparison r
1f4b0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  esult */.  int o
1f4c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
1f4d0 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62   Opcode */.  Vdb
1f4e0 65 43 75 72 73 6f 72 20 2a 70 43 3b 20 20 20 20  eCursor *pC;    
1f4f0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1f500 20 73 65 65 6b 20 2a 2f 0a 20 20 55 6e 70 61 63   seek */.  Unpac
1f510 6b 65 64 52 65 63 6f 72 64 20 72 3b 20 20 2f 2a  kedRecord r;  /*
1f520 20 54 68 65 20 6b 65 79 20 74 6f 20 73 65 65 6b   The key to seek
1f530 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46   for */.  int nF
1f540 69 65 6c 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  ield;        /* 
1f550 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
1f560 73 20 6f 72 20 66 69 65 6c 64 73 20 69 6e 20 74  s or fields in t
1f570 68 65 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  he key */.  i64 
1f580 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 2f  iKey;          /
1f590 2a 20 54 68 65 20 72 6f 77 69 64 20 77 65 20 61  * The rowid we a
1f5a0 72 65 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  re to seek to */
1f5b0 0a 20 20 69 6e 74 20 65 71 4f 6e 6c 79 3b 20 20  .  int eqOnly;  
1f5c0 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 69 6e        /* Only in
1f5d0 74 65 72 65 73 74 65 64 20 69 6e 20 3d 3d 20 72  terested in == r
1f5e0 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
1f5f0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
1f600 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
1f610 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
1f620 74 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 3b  t( pOp->p2!=0 );
1f630 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
1f640 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
1f650 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
1f660 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
1f670 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
1f680 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
1f690 20 4f 50 5f 53 65 65 6b 4c 45 20 3d 3d 20 4f 50   OP_SeekLE == OP
1f6a0 5f 53 65 65 6b 4c 54 2b 31 20 29 3b 0a 20 20 61  _SeekLT+1 );.  a
1f6b0 73 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45  ssert( OP_SeekGE
1f6c0 20 3d 3d 20 4f 50 5f 53 65 65 6b 4c 54 2b 32 20   == OP_SeekLT+2 
1f6d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 5f  );.  assert( OP_
1f6e0 53 65 65 6b 47 54 20 3d 3d 20 4f 50 5f 53 65 65  SeekGT == OP_See
1f6f0 6b 4c 54 2b 33 20 29 3b 0a 20 20 61 73 73 65 72  kLT+3 );.  asser
1f700 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65 64  t( pC->isOrdered
1f710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f720 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
1f730 29 3b 0a 20 20 6f 63 20 3d 20 70 4f 70 2d 3e 6f  );.  oc = pOp->o
1f740 70 63 6f 64 65 3b 0a 20 20 65 71 4f 6e 6c 79 20  pcode;.  eqOnly 
1f750 3d 20 30 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  = 0;.  pC->nullR
1f760 6f 77 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ow = 0;.#ifdef S
1f770 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 43  QLITE_DEBUG.  pC
1f780 2d 3e 73 65 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e  ->seekOp = pOp->
1f790 6f 70 63 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a  opcode;.#endif..
1f7a0 20 20 69 66 28 20 70 43 2d 3e 69 73 54 61 62 6c    if( pC->isTabl
1f7b0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
1f7c0 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 66 6c  BTREE_SEEK_EQ fl
1f7d0 61 67 20 69 73 20 6f 6e 6c 79 20 73 65 74 20 6f  ag is only set o
1f7e0 6e 20 69 6e 64 65 78 20 63 75 72 73 6f 72 73 20  n index cursors 
1f7f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
1f800 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f810 72 48 61 73 48 69 6e 74 28 70 43 2d 3e 75 63 2e  rHasHint(pC->uc.
1f820 70 43 75 72 73 6f 72 2c 20 42 54 52 45 45 5f 53  pCursor, BTREE_S
1f830 45 45 4b 5f 45 51 29 3d 3d 30 0a 20 20 20 20 20  EEK_EQ)==0.     
1f840 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
1f850 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f  UPT_DB );..    /
1f860 2a 20 54 68 65 20 69 6e 70 75 74 20 76 61 6c 75  * The input valu
1f870 65 20 69 6e 20 50 33 20 6d 69 67 68 74 20 62 65  e in P3 might be
1f880 20 6f 66 20 61 6e 79 20 74 79 70 65 3a 20 69 6e   of any type: in
1f890 74 65 67 65 72 2c 20 72 65 61 6c 2c 20 73 74 72  teger, real, str
1f8a0 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 62 6c 6f 62  ing,.    ** blob
1f8b0 2c 20 6f 72 20 4e 55 4c 4c 2e 20 20 42 75 74 20  , or NULL.  But 
1f8c0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
1f8d0 6e 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65  n integer before
1f8e0 20 77 65 20 63 61 6e 20 64 6f 0a 20 20 20 20 2a   we can do.    *
1f8f0 2a 20 74 68 65 20 73 65 65 6b 2c 20 73 6f 20 63  * the seek, so c
1f900 6f 6e 76 65 72 74 20 69 74 2e 20 2a 2f 0a 20 20  onvert it. */.  
1f910 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
1f920 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 69 66 28  Op->p3];.    if(
1f930 20 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20   (pIn3->flags & 
1f940 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61  (MEM_Int|MEM_Rea
1f950 6c 7c 4d 45 4d 5f 53 74 72 29 29 3d 3d 4d 45 4d  l|MEM_Str))==MEM
1f960 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 61 70  _Str ){.      ap
1f970 70 6c 79 4e 75 6d 65 72 69 63 41 66 66 69 6e 69  plyNumericAffini
1f980 74 79 28 70 49 6e 33 2c 20 30 29 3b 0a 20 20 20  ty(pIn3, 0);.   
1f990 20 7d 0a 20 20 20 20 69 4b 65 79 20 3d 20 73 71   }.    iKey = sq
1f9a0 6c 69 74 65 33 56 64 62 65 49 6e 74 56 61 6c 75  lite3VdbeIntValu
1f9b0 65 28 70 49 6e 33 29 3b 0a 0a 20 20 20 20 2f 2a  e(pIn3);..    /*
1f9c0 20 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65   If the P3 value
1f9d0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6f   could not be co
1f9e0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20  nverted into an 
1f9f0 69 6e 74 65 67 65 72 20 77 69 74 68 6f 75 74 0a  integer without.
1fa00 20 20 20 20 2a 2a 20 6c 6f 73 73 20 6f 66 20 69      ** loss of i
1fa10 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e  nformation, then
1fa20 20 73 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   special process
1fa30 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e  ing is required.
1fa40 2e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  .. */.    if( (p
1fa50 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
1fa60 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Int)==0 ){.    
1fa70 20 20 69 66 28 20 28 70 49 6e 33 2d 3e 66 6c 61    if( (pIn3->fla
1fa80 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 29 3d 3d  gs & MEM_Real)==
1fa90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1faa0 49 66 20 74 68 65 20 50 33 20 76 61 6c 75 65 20  If the P3 value 
1fab0 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65 72  cannot be conver
1fac0 74 65 64 20 69 6e 74 6f 20 61 6e 79 20 6b 69 6e  ted into any kin
1fad0 64 20 6f 66 20 61 20 6e 75 6d 62 65 72 2c 0a 20  d of a number,. 
1fae0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
1faf0 68 65 20 73 65 65 6b 20 69 73 20 6e 6f 74 20 70  he seek is not p
1fb00 6f 73 73 69 62 6c 65 2c 20 73 6f 20 6a 75 6d 70  ossible, so jump
1fb10 20 74 6f 20 50 32 20 2a 2f 0a 20 20 20 20 20 20   to P2 */.      
1fb20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
1fb30 6e 28 31 2c 32 29 3b 20 67 6f 74 6f 20 6a 75 6d  n(1,2); goto jum
1fb40 70 5f 74 6f 5f 70 32 3b 0a 20 20 20 20 20 20 20  p_to_p2;.       
1fb50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fb60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1fb70 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 69   approximation i
1fb80 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20 74 68  Key is larger th
1fb90 61 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  an the actual re
1fba0 61 6c 20 73 65 61 72 63 68 0a 20 20 20 20 20 20  al search.      
1fbb0 2a 2a 20 74 65 72 6d 2c 20 73 75 62 73 74 69 74  ** term, substit
1fbc0 75 74 65 20 3e 3d 20 66 6f 72 20 3e 20 61 6e 64  ute >= for > and
1fbd0 20 3c 20 66 6f 72 20 3c 3d 2e 20 65 2e 67 2e 20   < for <=. e.g. 
1fbe0 69 66 20 74 68 65 20 73 65 61 72 63 68 20 74 65  if the search te
1fbf0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 34  rm.      ** is 4
1fc00 2e 39 20 61 6e 64 20 74 68 65 20 69 6e 74 65 67  .9 and the integ
1fc10 65 72 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  er approximation
1fc20 20 35 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   5:.      **.   
1fc30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20     **        (x 
1fc40 3e 20 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20  >  4.9)    ->   
1fc50 20 20 28 78 20 3e 3d 20 35 29 0a 20 20 20 20 20    (x >= 5).     
1fc60 20 2a 2a 20 20 20 20 20 20 20 20 28 78 20 3c 3d   **        (x <=
1fc70 20 34 2e 39 29 20 20 20 20 2d 3e 20 20 20 20 20   4.9)    ->     
1fc80 28 78 20 3c 20 20 35 29 0a 20 20 20 20 20 20 2a  (x <  5).      *
1fc90 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 33  /.      if( pIn3
1fca0 2d 3e 75 2e 72 3c 28 64 6f 75 62 6c 65 29 69 4b  ->u.r<(double)iK
1fcb0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ey ){.        as
1fcc0 73 65 72 74 28 20 4f 50 5f 53 65 65 6b 47 45 3d  sert( OP_SeekGE=
1fcd0 3d 28 4f 50 5f 53 65 65 6b 47 54 2d 31 29 20 29  =(OP_SeekGT-1) )
1fce0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1fcf0 28 20 4f 50 5f 53 65 65 6b 4c 54 3d 3d 28 4f 50  ( OP_SeekLT==(OP
1fd00 5f 53 65 65 6b 4c 45 2d 31 29 20 29 3b 0a 20 20  _SeekLE-1) );.  
1fd10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 4f        assert( (O
1fd20 50 5f 53 65 65 6b 4c 45 20 26 20 30 78 30 30 30  P_SeekLE & 0x000
1fd30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 54 20 26  1)==(OP_SeekGT &
1fd40 20 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20   0x0001) );.    
1fd50 20 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 78      if( (oc & 0x
1fd60 30 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 47  0001)==(OP_SeekG
1fd70 54 20 26 20 30 78 30 30 30 31 29 20 29 20 6f 63  T & 0x0001) ) oc
1fd80 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  --;.      }..   
1fd90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 70 70     /* If the app
1fda0 72 6f 78 69 6d 61 74 69 6f 6e 20 69 4b 65 79 20  roximation iKey 
1fdb0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1fdc0 74 68 65 20 61 63 74 75 61 6c 20 72 65 61 6c 20  the actual real 
1fdd0 73 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20  search.      ** 
1fde0 74 65 72 6d 2c 20 73 75 62 73 74 69 74 75 74 65  term, substitute
1fdf0 20 3c 3d 20 66 6f 72 20 3c 20 61 6e 64 20 3e 20   <= for < and > 
1fe00 66 6f 72 20 3e 3d 2e 20 20 2a 2f 0a 20 20 20 20  for >=.  */.    
1fe10 20 20 65 6c 73 65 20 69 66 28 20 70 49 6e 33 2d    else if( pIn3-
1fe20 3e 75 2e 72 3e 28 64 6f 75 62 6c 65 29 69 4b 65  >u.r>(double)iKe
1fe30 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
1fe40 65 72 74 28 20 4f 50 5f 53 65 65 6b 4c 45 3d 3d  ert( OP_SeekLE==
1fe50 28 4f 50 5f 53 65 65 6b 4c 54 2b 31 29 20 29 3b  (OP_SeekLT+1) );
1fe60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fe70 20 4f 50 5f 53 65 65 6b 47 54 3d 3d 28 4f 50 5f   OP_SeekGT==(OP_
1fe80 53 65 65 6b 47 45 2b 31 29 20 29 3b 0a 20 20 20  SeekGE+1) );.   
1fe90 20 20 20 20 20 61 73 73 65 72 74 28 20 28 4f 50       assert( (OP
1fea0 5f 53 65 65 6b 4c 54 20 26 20 30 78 30 30 30 31  _SeekLT & 0x0001
1feb0 29 3d 3d 28 4f 50 5f 53 65 65 6b 47 45 20 26 20  )==(OP_SeekGE & 
1fec0 30 78 30 30 30 31 29 20 29 3b 0a 20 20 20 20 20  0x0001) );.     
1fed0 20 20 20 69 66 28 20 28 6f 63 20 26 20 30 78 30     if( (oc & 0x0
1fee0 30 30 31 29 3d 3d 28 4f 50 5f 53 65 65 6b 4c 54  001)==(OP_SeekLT
1fef0 20 26 20 30 78 30 30 30 31 29 20 29 20 6f 63 2b   & 0x0001) ) oc+
1ff00 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1ff10 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74   .    rc = sqlit
1ff20 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1ff30 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e 70 43 75  acked(pC->uc.pCu
1ff40 72 73 6f 72 2c 20 30 2c 20 28 75 36 34 29 69 4b  rsor, 0, (u64)iK
1ff50 65 79 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  ey, 0, &res);.  
1ff60 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
1ff70 65 74 20 3d 20 69 4b 65 79 3b 20 20 2f 2a 20 55  et = iKey;  /* U
1ff80 73 65 64 20 62 79 20 4f 50 5f 44 65 6c 65 74 65  sed by OP_Delete
1ff90 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d   */.    if( rc!=
1ffa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ffb0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
1ffc0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
1ffd0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1ffe0 2a 20 46 6f 72 20 61 20 63 75 72 73 6f 72 20 77  * For a cursor w
1fff0 69 74 68 20 74 68 65 20 42 54 52 45 45 5f 53 45  ith the BTREE_SE
20000 45 4b 5f 45 51 20 68 69 6e 74 2c 20 6f 6e 6c 79  EK_EQ hint, only
20010 20 74 68 65 20 4f 50 5f 53 65 65 6b 47 45 20 61   the OP_SeekGE a
20020 6e 64 0a 20 20 20 20 2a 2a 20 4f 50 5f 53 65 65  nd.    ** OP_See
20030 6b 4c 45 20 6f 70 63 6f 64 65 73 20 61 72 65 20  kLE opcodes are 
20040 61 6c 6c 6f 77 65 64 2c 20 61 6e 64 20 74 68 65  allowed, and the
20050 73 65 20 6d 75 73 74 20 62 65 20 69 6d 6d 65 64  se must be immed
20060 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 0a  iately followed.
20070 20 20 20 20 2a 2a 20 62 79 20 61 6e 20 4f 50 5f      ** by an OP_
20080 49 64 78 47 54 20 6f 72 20 4f 50 5f 49 64 78 4c  IdxGT or OP_IdxL
20090 54 20 6f 70 63 6f 64 65 2c 20 72 65 73 70 65 63  T opcode, respec
200a0 74 69 76 65 6c 79 2c 20 77 69 74 68 20 74 68 65  tively, with the
200b0 20 73 61 6d 65 20 6b 65 79 2e 0a 20 20 20 20 2a   same key..    *
200c0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
200d0 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 48  3BtreeCursorHasH
200e0 69 6e 74 28 70 43 2d 3e 75 63 2e 70 43 75 72 73  int(pC->uc.pCurs
200f0 6f 72 2c 20 42 54 52 45 45 5f 53 45 45 4b 5f 45  or, BTREE_SEEK_E
20100 51 29 20 29 7b 0a 20 20 20 20 20 20 65 71 4f 6e  Q) ){.      eqOn
20110 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  ly = 1;.      as
20120 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  sert( pOp->opcod
20130 65 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20  e==OP_SeekGE || 
20140 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
20150 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 20 20  SeekLE );.      
20160 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 6f  assert( pOp[1].o
20170 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20  pcode==OP_IdxLT 
20180 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65  || pOp[1].opcode
20190 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20  ==OP_IdxGT );.  
201a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
201b0 31 5d 2e 70 31 3d 3d 70 4f 70 5b 30 5d 2e 70 31  1].p1==pOp[0].p1
201c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
201d0 28 20 70 4f 70 5b 31 5d 2e 70 32 3d 3d 70 4f 70  ( pOp[1].p2==pOp
201e0 5b 30 5d 2e 70 32 20 29 3b 0a 20 20 20 20 20 20  [0].p2 );.      
201f0 61 73 73 65 72 74 28 20 70 4f 70 5b 31 5d 2e 70  assert( pOp[1].p
20200 33 3d 3d 70 4f 70 5b 30 5d 2e 70 33 20 29 3b 0a  3==pOp[0].p3 );.
20210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
20220 70 5b 31 5d 2e 70 34 2e 69 3d 3d 70 4f 70 5b 30  p[1].p4.i==pOp[0
20230 5d 2e 70 34 2e 69 20 29 3b 0a 20 20 20 20 7d 0a  ].p4.i );.    }.
20240 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 70 4f  .    nField = pO
20250 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 61 73 73  p->p4.i;.    ass
20260 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
20270 3d 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20  ==P4_INT32 );.  
20280 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
20290 3e 30 20 29 3b 0a 20 20 20 20 72 2e 70 4b 65 79  >0 );.    r.pKey
202a0 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
202b0 6e 66 6f 3b 0a 20 20 20 20 72 2e 6e 46 69 65 6c  nfo;.    r.nFiel
202c0 64 20 3d 20 28 75 31 36 29 6e 46 69 65 6c 64 3b  d = (u16)nField;
202d0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78  ..    /* The nex
202e0 74 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 20 63  t line of code c
202f0 6f 6d 70 75 74 65 73 20 61 73 20 66 6f 6c 6c 6f  omputes as follo
20300 77 73 2c 20 6f 6e 6c 79 20 66 61 73 74 65 72 3a  ws, only faster:
20310 0a 20 20 20 20 2a 2a 20 20 20 69 66 28 20 6f 63  .    **   if( oc
20320 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 7c 7c 20 6f  ==OP_SeekGT || o
20330 63 3d 3d 4f 50 5f 53 65 65 6b 4c 45 20 29 7b 0a  c==OP_SeekLE ){.
20340 20 20 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66      **     r.def
20350 61 75 6c 74 5f 72 63 20 3d 20 2d 31 3b 0a 20 20  ault_rc = -1;.  
20360 20 20 2a 2a 20 20 20 7d 65 6c 73 65 7b 0a 20 20    **   }else{.  
20370 20 20 2a 2a 20 20 20 20 20 72 2e 64 65 66 61 75    **     r.defau
20380 6c 74 5f 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20  lt_rc = +1;.    
20390 2a 2a 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  **   }.    */.  
203a0 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
203b0 20 28 28 31 20 26 20 28 6f 63 20 2d 20 4f 50 5f   ((1 & (oc - OP_
203c0 53 65 65 6b 4c 54 29 29 20 3f 20 2d 31 20 3a 20  SeekLT)) ? -1 : 
203d0 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1);.    assert(
203e0 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 54 20 7c   oc!=OP_SeekGT |
203f0 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  | r.default_rc==
20400 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
20410 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c 45 20  ( oc!=OP_SeekLE 
20420 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 3d  || r.default_rc=
20430 3d 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =-1 );.    asser
20440 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 47 45  t( oc!=OP_SeekGE
20450 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72 63   || r.default_rc
20460 3d 3d 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ==+1 );.    asse
20470 72 74 28 20 6f 63 21 3d 4f 50 5f 53 65 65 6b 4c  rt( oc!=OP_SeekL
20480 54 20 7c 7c 20 72 2e 64 65 66 61 75 6c 74 5f 72  T || r.default_r
20490 63 3d 3d 2b 31 20 29 3b 0a 0a 20 20 20 20 72 2e  c==+1 );..    r.
204a0 61 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  aMem = &aMem[pOp
204b0 2d 3e 70 33 5d 3b 0a 23 69 66 64 65 66 20 53 51  ->p3];.#ifdef SQ
204c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 7b  LITE_DEBUG.    {
204d0 20 69 6e 74 20 69 3b 20 66 6f 72 28 69 3d 30 3b   int i; for(i=0;
204e0 20 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 2b 2b   i<r.nField; i++
204f0 29 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56  ) assert( memIsV
20500 61 6c 69 64 28 26 72 2e 61 4d 65 6d 5b 69 5d 29  alid(&r.aMem[i])
20510 20 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20   ); }.#endif.   
20520 20 72 2e 65 71 53 65 65 6e 20 3d 20 30 3b 0a 20   r.eqSeen = 0;. 
20530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20540 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
20550 65 64 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ed(pC->uc.pCurso
20560 72 2c 20 26 72 2c 20 30 2c 20 30 2c 20 26 72 65  r, &r, 0, 0, &re
20570 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
20580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20590 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
205a0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
205b0 7d 0a 20 20 20 20 69 66 28 20 65 71 4f 6e 6c 79  }.    if( eqOnly
205c0 20 26 26 20 72 2e 65 71 53 65 65 6e 3d 3d 30 20   && r.eqSeen==0 
205d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
205e0 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 20   res!=0 );.     
205f0 20 67 6f 74 6f 20 73 65 65 6b 5f 6e 6f 74 5f 66   goto seek_not_f
20600 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ound;.    }.  }.
20610 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
20620 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 43 2d 3e  veto = 0;.  pC->
20630 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
20640 43 48 45 5f 53 54 41 4c 45 3b 0a 23 69 66 64 65  CHE_STALE;.#ifde
20650 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
20660 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
20670 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
20680 20 69 66 28 20 6f 63 3e 3d 4f 50 5f 53 65 65 6b   if( oc>=OP_Seek
20690 47 45 20 29 7b 20 20 61 73 73 65 72 74 28 20 6f  GE ){  assert( o
206a0 63 3d 3d 4f 50 5f 53 65 65 6b 47 45 20 7c 7c 20  c==OP_SeekGE || 
206b0 6f 63 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b  oc==OP_SeekGT );
206c0 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 7c  .    if( res<0 |
206d0 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 6f 63 3d  | (res==0 && oc=
206e0 3d 4f 50 5f 53 65 65 6b 47 54 29 20 29 7b 0a 20  =OP_SeekGT) ){. 
206f0 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
20700 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20710 42 74 72 65 65 4e 65 78 74 28 70 43 2d 3e 75 63  BtreeNext(pC->uc
20720 2e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  .pCursor, &res);
20730 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20740 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20750 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
20760 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
20770 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
20780 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20790 20 61 73 73 65 72 74 28 20 6f 63 3d 3d 4f 50 5f   assert( oc==OP_
207a0 53 65 65 6b 4c 54 20 7c 7c 20 6f 63 3d 3d 4f 50  SeekLT || oc==OP
207b0 5f 53 65 65 6b 4c 45 20 29 3b 0a 20 20 20 20 69  _SeekLE );.    i
207c0 66 28 20 72 65 73 3e 30 20 7c 7c 20 28 72 65 73  f( res>0 || (res
207d0 3d 3d 30 20 26 26 20 6f 63 3d 3d 4f 50 5f 53 65  ==0 && oc==OP_Se
207e0 65 6b 4c 54 29 20 29 7b 0a 20 20 20 20 20 20 72  ekLT) ){.      r
207f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
20800 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
20810 72 65 76 69 6f 75 73 28 70 43 2d 3e 75 63 2e 70  revious(pC->uc.p
20820 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
20830 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20840 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62  ITE_OK ) goto ab
20850 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
20860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20870 20 20 20 2f 2a 20 72 65 73 20 6d 69 67 68 74 20     /* res might 
20880 62 65 20 6e 65 67 61 74 69 76 65 20 62 65 63 61  be negative beca
20890 75 73 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  use the table is
208a0 20 65 6d 70 74 79 2e 20 20 43 68 65 63 6b 20 74   empty.  Check t
208b0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
208c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
208d0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
208e0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
208f0 42 74 72 65 65 45 6f 66 28 70 43 2d 3e 75 63 2e  BtreeEof(pC->uc.
20900 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  pCursor);.    }.
20910 20 20 7d 0a 73 65 65 6b 5f 6e 6f 74 5f 66 6f 75    }.seek_not_fou
20920 6e 64 3a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  nd:.  assert( pO
20930 70 2d 3e 70 32 3e 30 20 29 3b 0a 20 20 56 64 62  p->p2>0 );.  Vdb
20940 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73  eBranchTaken(res
20950 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65  !=0,2);.  if( re
20960 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6a 75  s ){.    goto ju
20970 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 65 6c 73  mp_to_p2;.  }els
20980 65 20 69 66 28 20 65 71 4f 6e 6c 79 20 29 7b 0a  e if( eqOnly ){.
20990 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
209a0 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64  1].opcode==OP_Id
209b0 78 4c 54 20 7c 7c 20 70 4f 70 5b 31 5d 2e 6f 70  xLT || pOp[1].op
209c0 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 54 20 29  code==OP_IdxGT )
209d0 3b 0a 20 20 20 20 70 4f 70 2b 2b 3b 20 2f 2a 20  ;.    pOp++; /* 
209e0 53 6b 69 70 20 74 68 65 20 4f 50 5f 49 64 78 4c  Skip the OP_IdxL
209f0 74 20 6f 72 20 4f 50 5f 49 64 78 47 54 20 74 68  t or OP_IdxGT th
20a00 61 74 20 66 6f 6c 6c 6f 77 73 20 2a 2f 0a 20 20  at follows */.  
20a10 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  }.  break;.}../*
20a20 20 4f 70 63 6f 64 65 3a 20 46 6f 75 6e 64 20 50   Opcode: Found P
20a30 31 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20  1 P2 P3 P4 *.** 
20a40 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b  Synopsis: key=r[
20a50 50 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20  P3@P4].**.** If 
20a60 50 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73  P4==0 then regis
20a70 74 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62  ter P3 holds a b
20a80 6c 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lob constructed 
20a90 62 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  by MakeRecord.  
20aa0 49 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20  If.** P4>0 then 
20ab0 72 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  register P3 is t
20ac0 68 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72  he first of P4 r
20ad0 65 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f  egisters that fo
20ae0 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a  rm an unpacked.*
20af0 2a 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  * record..**.** 
20b00 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20  Cursor P1 is on 
20b10 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20  an index btree. 
20b20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
20b30 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20  dentified by P3 
20b40 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 61 20 70  and P4.** is a p
20b50 72 65 66 69 78 20 6f 66 20 61 6e 79 20 65 6e 74  refix of any ent
20b60 72 79 20 69 6e 20 50 31 20 74 68 65 6e 20 61 20  ry in P1 then a 
20b70 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 74 6f 20  jump is made to 
20b80 50 32 20 61 6e 64 0a 2a 2a 20 50 31 20 69 73 20  P2 and.** P1 is 
20b90 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
20ba0 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e   the matching en
20bb0 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
20bc0 6f 70 65 72 61 74 69 6f 6e 20 6c 65 61 76 65 73  operation leaves
20bd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
20be0 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
20bf0 63 61 6e 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63  can be.** advanc
20c00 65 64 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72  ed in the forwar
20c10 64 20 64 69 72 65 63 74 69 6f 6e 2e 20 20 54 68  d direction.  Th
20c20 65 20 4e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e Next instructi
20c30 6f 6e 20 77 69 6c 6c 20 77 6f 72 6b 2c 0a 2a 2a  on will work,.**
20c40 20 62 75 74 20 6e 6f 74 20 74 68 65 20 50 72 65   but not the Pre
20c50 76 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  v instruction..*
20c60 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 4e  *.** See also: N
20c70 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66 6c  otFound, NoConfl
20c80 69 63 74 2c 20 4e 6f 74 45 78 69 73 74 73 2e 20  ict, NotExists. 
20c90 53 65 65 6b 47 65 0a 2a 2f 0a 2f 2a 20 4f 70 63  SeekGe.*/./* Opc
20ca0 6f 64 65 3a 20 4e 6f 74 46 6f 75 6e 64 20 50 31  ode: NotFound P1
20cb0 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
20cc0 79 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50  ynopsis: key=r[P
20cd0 33 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 49 66 20 50  3@P4].**.** If P
20ce0 34 3d 3d 30 20 74 68 65 6e 20 72 65 67 69 73 74  4==0 then regist
20cf0 65 72 20 50 33 20 68 6f 6c 64 73 20 61 20 62 6c  er P3 holds a bl
20d00 6f 62 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ob constructed b
20d10 79 20 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 49  y MakeRecord.  I
20d20 66 0a 2a 2a 20 50 34 3e 30 20 74 68 65 6e 20 72  f.** P4>0 then r
20d30 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74 68  egister P3 is th
20d40 65 20 66 69 72 73 74 20 6f 66 20 50 34 20 72 65  e first of P4 re
20d50 67 69 73 74 65 72 73 20 74 68 61 74 20 66 6f 72  gisters that for
20d60 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 0a 2a 2a  m an unpacked.**
20d70 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 0a 2a 2a 20   record..** .** 
20d80 43 75 72 73 6f 72 20 50 31 20 69 73 20 6f 6e 20  Cursor P1 is on 
20d90 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2e 20  an index btree. 
20da0 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
20db0 64 65 6e 74 69 66 69 65 64 20 62 79 20 50 33 20  dentified by P3 
20dc0 61 6e 64 20 50 34 0a 2a 2a 20 69 73 20 6e 6f 74  and P4.** is not
20dd0 20 74 68 65 20 70 72 65 66 69 78 20 6f 66 20 61   the prefix of a
20de0 6e 79 20 65 6e 74 72 79 20 69 6e 20 50 31 20 74  ny entry in P1 t
20df0 68 65 6e 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hen a jump is ma
20e00 64 65 20 74 6f 20 50 32 2e 20 20 49 66 20 50 31  de to P2.  If P1
20e10 20 0a 2a 2a 20 64 6f 65 73 20 63 6f 6e 74 61 69   .** does contai
20e20 6e 20 61 6e 20 65 6e 74 72 79 20 77 68 6f 73 65  n an entry whose
20e30 20 70 72 65 66 69 78 20 6d 61 74 63 68 65 73 20   prefix matches 
20e40 74 68 65 20 50 33 2f 50 34 20 72 65 63 6f 72 64  the P3/P4 record
20e50 20 74 68 65 6e 20 63 6f 6e 74 72 6f 6c 0a 2a 2a   then control.**
20e60 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 20 74   falls through t
20e70 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
20e80 75 63 74 69 6f 6e 20 61 6e 64 20 50 31 20 69 73  uction and P1 is
20e90 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
20ea0 74 20 74 68 65 0a 2a 2a 20 6d 61 74 63 68 69 6e  t the.** matchin
20eb0 67 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  g entry..**.** T
20ec0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65  his operation le
20ed0 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  aves the cursor 
20ee0 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65  in a state where
20ef0 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a   it cannot be.**
20f00 20 61 64 76 61 6e 63 65 64 20 69 6e 20 65 69 74   advanced in eit
20f10 68 65 72 20 64 69 72 65 63 74 69 6f 6e 2e 20 20  her direction.  
20f20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20f30 74 68 65 20 4e 65 78 74 20 61 6e 64 20 50 72 65  the Next and Pre
20f40 76 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 64 6f 20  v.** opcodes do 
20f50 6e 6f 74 20 77 6f 72 6b 20 61 66 74 65 72 20 74  not work after t
20f60 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
20f70 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46  *.** See also: F
20f80 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73 2c  ound, NotExists,
20f90 20 4e 6f 43 6f 6e 66 6c 69 63 74 0a 2a 2f 0a 2f   NoConflict.*/./
20fa0 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f 43 6f 6e 66  * Opcode: NoConf
20fb0 6c 69 63 74 20 50 31 20 50 32 20 50 33 20 50 34  lict P1 P2 P3 P4
20fc0 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20   *.** Synopsis: 
20fd0 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a 2a 0a  key=r[P3@P4].**.
20fe0 2a 2a 20 49 66 20 50 34 3d 3d 30 20 74 68 65 6e  ** If P4==0 then
20ff0 20 72 65 67 69 73 74 65 72 20 50 33 20 68 6f 6c   register P3 hol
21000 64 73 20 61 20 62 6c 6f 62 20 63 6f 6e 73 74 72  ds a blob constr
21010 75 63 74 65 64 20 62 79 20 4d 61 6b 65 52 65 63  ucted by MakeRec
21020 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 50 34 3e 30  ord.  If.** P4>0
21030 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20 50   then register P
21040 33 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  3 is the first o
21050 66 20 50 34 20 72 65 67 69 73 74 65 72 73 20 74  f P4 registers t
21060 68 61 74 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61  hat form an unpa
21070 63 6b 65 64 0a 2a 2a 20 72 65 63 6f 72 64 2e 0a  cked.** record..
21080 2a 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 50 31  ** .** Cursor P1
21090 20 69 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   is on an index 
210a0 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 72  btree.  If the r
210b0 65 63 6f 72 64 20 69 64 65 6e 74 69 66 69 65 64  ecord identified
210c0 20 62 79 20 50 33 20 61 6e 64 20 50 34 0a 2a 2a   by P3 and P4.**
210d0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
210e0 4c 4c 20 76 61 6c 75 65 2c 20 6a 75 6d 70 20 69  LL value, jump i
210f0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32  mmediately to P2
21100 2e 20 20 49 66 20 61 6c 6c 20 74 65 72 6d 73 20  .  If all terms 
21110 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  of the.** record
21120 20 61 72 65 20 6e 6f 74 2d 4e 55 4c 4c 20 74 68   are not-NULL th
21130 65 6e 20 61 20 63 68 65 63 6b 20 69 73 20 64 6f  en a check is do
21140 6e 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ne to determine 
21150 69 66 20 61 6e 79 20 72 6f 77 20 69 6e 20 74 68  if any row in th
21160 65 0a 2a 2a 20 50 31 20 69 6e 64 65 78 20 62 74  e.** P1 index bt
21170 72 65 65 20 68 61 73 20 61 20 6d 61 74 63 68 69  ree has a matchi
21180 6e 67 20 6b 65 79 20 70 72 65 66 69 78 2e 20 20  ng key prefix.  
21190 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
211a0 6d 61 74 63 68 65 73 2c 20 6a 75 6d 70 0a 2a 2a  matches, jump.**
211b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
211c0 50 32 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  P2.  If there is
211d0 20 61 20 6d 61 74 63 68 2c 20 66 61 6c 6c 20 74   a match, fall t
211e0 68 72 6f 75 67 68 20 61 6e 64 20 6c 65 61 76 65  hrough and leave
211f0 20 74 68 65 20 50 31 0a 2a 2a 20 63 75 72 73 6f   the P1.** curso
21200 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
21210 65 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 0a  e matching row..
21220 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64  **.** This opcod
21230 65 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  e is similar to 
21240 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 77 69 74 68  OP_NotFound with
21250 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 73 20   the exceptions 
21260 74 68 61 74 20 74 68 65 0a 2a 2a 20 62 72 61 6e  that the.** bran
21270 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b  ch is always tak
21280 65 6e 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  en if any part o
21290 66 20 74 68 65 20 73 65 61 72 63 68 20 6b 65 79  f the search key
212a0 20 69 6e 70 75 74 20 69 73 20 4e 55 4c 4c 2e 0a   input is NULL..
212b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  **.** This opera
212c0 74 69 6f 6e 20 6c 65 61 76 65 73 20 74 68 65 20  tion leaves the 
212d0 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
212e0 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
212f0 74 20 62 65 0a 2a 2a 20 61 64 76 61 6e 63 65 64  t be.** advanced
21300 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
21310 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
21320 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
21330 61 6e 64 20 50 72 65 76 0a 2a 2a 20 6f 70 63 6f  and Prev.** opco
21340 64 65 73 20 64 6f 20 6e 6f 74 20 77 6f 72 6b 20  des do not work 
21350 61 66 74 65 72 20 74 68 69 73 20 6f 70 65 72 61  after this opera
21360 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  tion..**.** See 
21370 61 6c 73 6f 3a 20 4e 6f 74 46 6f 75 6e 64 2c 20  also: NotFound, 
21380 46 6f 75 6e 64 2c 20 4e 6f 74 45 78 69 73 74 73  Found, NotExists
21390 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f 43 6f  .*/.case OP_NoCo
213a0 6e 66 6c 69 63 74 3a 20 20 20 20 20 2f 2a 20 6a  nflict:     /* j
213b0 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 63 61 73 65  ump, in3 */.case
213c0 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 3a 20 20 20   OP_NotFound:   
213d0 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
213e0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6f 75 6e   */.case OP_Foun
213f0 64 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  d: {        /* j
21400 75 6d 70 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  ump, in3 */.  in
21410 74 20 61 6c 72 65 61 64 79 45 78 69 73 74 73 3b  t alreadyExists;
21420 0a 20 20 69 6e 74 20 74 61 6b 65 4a 75 6d 70 3b  .  int takeJump;
21430 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 56 64 62  .  int ii;.  Vdb
21440 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20 69  eCursor *pC;.  i
21450 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61 63 6b  nt res;.  Unpack
21460 65 64 52 65 63 6f 72 64 20 2a 70 46 72 65 65 3b  edRecord *pFree;
21470 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21480 64 20 2a 70 49 64 78 4b 65 79 3b 0a 20 20 55 6e  d *pIdxKey;.  Un
21490 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
214a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
214b0 45 53 54 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  EST.  if( pOp->o
214c0 70 63 6f 64 65 21 3d 4f 50 5f 4e 6f 43 6f 6e 66  pcode!=OP_NoConf
214d0 6c 69 63 74 20 29 20 73 71 6c 69 74 65 33 5f 66  lict ) sqlite3_f
214e0 6f 75 6e 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  ound_count++;.#e
214f0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
21500 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f  pOp->p1>=0 && pO
21510 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p1<p->nCursor
21520 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
21530 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
21540 54 33 32 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d  T32 );.  pC = p-
21550 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b  >apCsr[pOp->p1];
21560 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d 30  .  assert( pC!=0
21570 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
21580 45 5f 44 45 42 55 47 0a 20 20 70 43 2d 3e 73 65  E_DEBUG.  pC->se
21590 65 6b 4f 70 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  ekOp = pOp->opco
215a0 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  de;.#endif.  pIn
215b0 33 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  3 = &aMem[pOp->p
215c0 33 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  3];.  assert( pC
215d0 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
215e0 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
215f0 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
21600 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
21610 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61 62 6c  sert( pC->isTabl
21620 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f  e==0 );.  if( pO
21630 70 2d 3e 70 34 2e 69 3e 30 20 29 7b 0a 20 20 20  p->p4.i>0 ){.   
21640 20 72 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 43   r.pKeyInfo = pC
21650 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  ->pKeyInfo;.    
21660 72 2e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  r.nField = (u16)
21670 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72  pOp->p4.i;.    r
21680 2e 61 4d 65 6d 20 3d 20 70 49 6e 33 3b 0a 23 69  .aMem = pIn3;.#i
21690 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
216a0 47 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  G.    for(ii=0; 
216b0 69 69 3c 72 2e 6e 46 69 65 6c 64 3b 20 69 69 2b  ii<r.nField; ii+
216c0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
216d0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e  ( memIsValid(&r.
216e0 61 4d 65 6d 5b 69 69 5d 29 20 29 3b 0a 20 20 20  aMem[ii]) );.   
216f0 20 20 20 61 73 73 65 72 74 28 20 28 72 2e 61 4d     assert( (r.aM
21700 65 6d 5b 69 69 5d 2e 66 6c 61 67 73 20 26 20 4d  em[ii].flags & M
21710 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 72  EM_Zero)==0 || r
21720 2e 61 4d 65 6d 5b 69 69 5d 2e 6e 3d 3d 30 20 29  .aMem[ii].n==0 )
21730 3b 0a 20 20 20 20 20 20 69 66 28 20 69 69 20 29  ;.      if( ii )
21740 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
21750 70 4f 70 2d 3e 70 33 2b 69 69 2c 20 26 72 2e 61  pOp->p3+ii, &r.a
21760 4d 65 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 7d 0a  Mem[ii]);.    }.
21770 23 65 6e 64 69 66 0a 20 20 20 20 70 49 64 78 4b  #endif.    pIdxK
21780 65 79 20 3d 20 26 72 3b 0a 20 20 20 20 70 46 72  ey = &r;.    pFr
21790 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
217a0 0a 20 20 20 20 70 46 72 65 65 20 3d 20 70 49 64  .    pFree = pId
217b0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
217c0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
217d0 65 63 6f 72 64 28 70 43 2d 3e 70 4b 65 79 49 6e  ecord(pC->pKeyIn
217e0 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  fo);.    if( pId
217f0 78 4b 65 79 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  xKey==0 ) goto n
21800 6f 5f 6d 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  o_mem;.    asser
21810 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26  t( pIn3->flags &
21820 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
21830 20 28 76 6f 69 64 29 45 78 70 61 6e 64 42 6c 6f   (void)ExpandBlo
21840 62 28 70 49 6e 33 29 3b 0a 20 20 20 20 73 71 6c  b(pIn3);.    sql
21850 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
21860 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66  pack(pC->pKeyInf
21870 6f 2c 20 70 49 6e 33 2d 3e 6e 2c 20 70 49 6e 33  o, pIn3->n, pIn3
21880 2d 3e 7a 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  ->z, pIdxKey);. 
21890 20 7d 0a 20 20 70 49 64 78 4b 65 79 2d 3e 64 65   }.  pIdxKey->de
218a0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
218b0 74 61 6b 65 4a 75 6d 70 20 3d 20 30 3b 0a 20 20  takeJump = 0;.  
218c0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
218d0 3d 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 29  =OP_NoConflict )
218e0 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65  {.    /* For the
218f0 20 4f 50 5f 4e 6f 43 6f 6e 66 6c 69 63 74 20 6f   OP_NoConflict o
21900 70 63 6f 64 65 2c 20 74 61 6b 65 20 74 68 65 20  pcode, take the 
21910 6a 75 6d 70 20 69 66 20 61 6e 79 20 6f 66 20 74  jump if any of t
21920 68 65 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20  he.    ** input 
21930 66 69 65 6c 64 73 20 61 72 65 20 4e 55 4c 4c 2c  fields are NULL,
21940 20 73 69 6e 63 65 20 61 6e 79 20 6b 65 79 20 77   since any key w
21950 69 74 68 20 61 20 4e 55 4c 4c 20 77 69 6c 6c 20  ith a NULL will 
21960 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 66 6c  not.    ** confl
21970 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ict */.    for(i
21980 69 3d 30 3b 20 69 69 3c 70 49 64 78 4b 65 79 2d  i=0; ii<pIdxKey-
21990 3e 6e 46 69 65 6c 64 3b 20 69 69 2b 2b 29 7b 0a  >nField; ii++){.
219a0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
219b0 79 2d 3e 61 4d 65 6d 5b 69 69 5d 2e 66 6c 61 67  y->aMem[ii].flag
219c0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
219d0 20 20 20 20 20 20 20 20 74 61 6b 65 4a 75 6d 70          takeJump
219e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
219f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21a00 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71   }.  }.  rc = sq
21a10 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
21a20 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63 2e  Unpacked(pC->uc.
21a30 70 43 75 72 73 6f 72 2c 20 70 49 64 78 4b 65 79  pCursor, pIdxKey
21a40 2c 20 30 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  , 0, 0, &res);. 
21a50 20 69 66 28 20 70 46 72 65 65 20 29 20 73 71 6c   if( pFree ) sql
21a60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21a70 46 72 65 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Free);.  if( rc!
21a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21a90 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
21aa0 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
21ab0 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20   pC->seekResult 
21ac0 3d 20 72 65 73 3b 0a 20 20 61 6c 72 65 61 64 79  = res;.  already
21ad0 45 78 69 73 74 73 20 3d 20 28 72 65 73 3d 3d 30  Exists = (res==0
21ae0 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77  );.  pC->nullRow
21af0 20 3d 20 31 2d 61 6c 72 65 61 64 79 45 78 69 73   = 1-alreadyExis
21b00 74 73 3b 0a 20 20 70 43 2d 3e 64 65 66 65 72 72  ts;.  pC->deferr
21b10 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
21b20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
21b30 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
21b40 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
21b50 3d 3d 4f 50 5f 46 6f 75 6e 64 20 29 7b 0a 20 20  ==OP_Found ){.  
21b60 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
21b70 6e 28 61 6c 72 65 61 64 79 45 78 69 73 74 73 21  n(alreadyExists!
21b80 3d 30 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 61  =0,2);.    if( a
21b90 6c 72 65 61 64 79 45 78 69 73 74 73 20 29 20 67  lreadyExists ) g
21ba0 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
21bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
21bc0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 74 61 6b  eBranchTaken(tak
21bd0 65 4a 75 6d 70 7c 7c 61 6c 72 65 61 64 79 45 78  eJump||alreadyEx
21be0 69 73 74 73 3d 3d 30 2c 32 29 3b 0a 20 20 20 20  ists==0,2);.    
21bf0 69 66 28 20 74 61 6b 65 4a 75 6d 70 20 7c 7c 20  if( takeJump || 
21c00 21 61 6c 72 65 61 64 79 45 78 69 73 74 73 20 29  !alreadyExists )
21c10 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
21c20 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d  ;.  }.  break;.}
21c30 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 65 65  ../* Opcode: See
21c40 6b 52 6f 77 69 64 20 50 31 20 50 32 20 50 33 20  kRowid P1 P2 P3 
21c50 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a  * *.** Synopsis:
21c60 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a 2a   intkey=r[P3].**
21c70 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69 6e  .** P1 is the in
21c80 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72 20  dex of a cursor 
21c90 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20 74  open on an SQL t
21ca0 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74 68  able btree (with
21cb0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79 73   integer.** keys
21cc0 29 2e 20 20 49 66 20 72 65 67 69 73 74 65 72 20  ).  If register 
21cd0 50 33 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  P3 does not cont
21ce0 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  ain an integer o
21cf0 72 20 69 66 20 50 31 20 64 6f 65 73 20 6e 6f 74  r if P1 does not
21d00 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 72 65  .** contain a re
21d10 63 6f 72 64 20 77 69 74 68 20 72 6f 77 69 64 20  cord with rowid 
21d20 50 33 20 74 68 65 6e 20 6a 75 6d 70 20 69 6d 6d  P3 then jump imm
21d30 65 64 69 61 74 65 6c 79 20 74 6f 20 50 32 2e 20  ediately to P2. 
21d40 20 0a 2a 2a 20 4f 72 2c 20 69 66 20 50 32 20 69   .** Or, if P2 i
21d50 73 20 30 2c 20 72 61 69 73 65 20 61 6e 20 53 51  s 0, raise an SQ
21d60 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
21d70 6f 72 2e 20 49 66 20 50 31 20 64 6f 65 73 20 63  or. If P1 does c
21d80 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 63 6f  ontain.** a reco
21d90 72 64 20 77 69 74 68 20 72 6f 77 69 64 20 50 33  rd with rowid P3
21da0 20 74 68 65 6e 20 0a 2a 2a 20 6c 65 61 76 65 20   then .** leave 
21db0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
21dc0 69 6e 67 20 61 74 20 74 68 61 74 20 72 65 63 6f  ing at that reco
21dd0 72 64 20 61 6e 64 20 66 61 6c 6c 20 74 68 72 6f  rd and fall thro
21de0 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 0a  ugh to the next.
21df0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ** instruction..
21e00 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 5f 4e 6f 74  **.** The OP_Not
21e10 45 78 69 73 74 73 20 6f 70 63 6f 64 65 20 70 65  Exists opcode pe
21e20 72 66 6f 72 6d 73 20 74 68 65 20 73 61 6d 65 20  rforms the same 
21e30 6f 70 65 72 61 74 69 6f 6e 2c 20 62 75 74 20 77  operation, but w
21e40 69 74 68 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  ith OP_NotExists
21e50 0a 2a 2a 20 74 68 65 20 50 33 20 72 65 67 69 73  .** the P3 regis
21e60 74 65 72 20 6d 75 73 74 20 62 65 20 67 75 61 72  ter must be guar
21e70 61 6e 74 65 65 64 20 74 6f 20 63 6f 6e 74 61 69  anteed to contai
21e80 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
21e90 75 65 2e 20 20 57 69 74 68 20 74 68 69 73 0a 2a  ue.  With this.*
21ea0 2a 20 6f 70 63 6f 64 65 2c 20 72 65 67 69 73 74  * opcode, regist
21eb0 65 72 20 50 33 20 6d 69 67 68 74 20 6e 6f 74 20  er P3 might not 
21ec0 63 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67  contain an integ
21ed0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50  er..**.** The OP
21ee0 5f 4e 6f 74 46 6f 75 6e 64 20 6f 70 63 6f 64 65  _NotFound opcode
21ef0 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 73 61   performs the sa
21f00 6d 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  me operation on 
21f10 69 6e 64 65 78 20 62 74 72 65 65 73 0a 2a 2a 20  index btrees.** 
21f20 28 77 69 74 68 20 61 72 62 69 74 72 61 72 79 20  (with arbitrary 
21f30 6d 75 6c 74 69 2d 76 61 6c 75 65 20 6b 65 79 73  multi-value keys
21f40 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  )..**.** This op
21f50 63 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20  code leaves the 
21f60 63 75 72 73 6f 72 20 69 6e 20 61 20 73 74 61 74  cursor in a stat
21f70 65 20 77 68 65 72 65 20 69 74 20 63 61 6e 6e 6f  e where it canno
21f80 74 20 62 65 20 61 64 76 61 6e 63 65 64 0a 2a 2a  t be advanced.**
21f90 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65 63   in either direc
21fa0 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
21fb0 77 6f 72 64 73 2c 20 74 68 65 20 4e 65 78 74 20  words, the Next 
21fc0 61 6e 64 20 50 72 65 76 20 6f 70 63 6f 64 65 73  and Prev opcodes
21fd0 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72   will.** not wor
21fe0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  k following this
21ff0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53   opcode..**.** S
22000 65 65 20 61 6c 73 6f 3a 20 46 6f 75 6e 64 2c 20  ee also: Found, 
22010 4e 6f 74 46 6f 75 6e 64 2c 20 4e 6f 43 6f 6e 66  NotFound, NoConf
22020 6c 69 63 74 2c 20 53 65 65 6b 52 6f 77 69 64 0a  lict, SeekRowid.
22030 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 6f  */./* Opcode: No
22040 74 45 78 69 73 74 73 20 50 31 20 50 32 20 50 33  tExists P1 P2 P3
22050 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
22060 3a 20 69 6e 74 6b 65 79 3d 72 5b 50 33 5d 0a 2a  : intkey=r[P3].*
22070 2a 0a 2a 2a 20 50 31 20 69 73 20 74 68 65 20 69  *.** P1 is the i
22080 6e 64 65 78 20 6f 66 20 61 20 63 75 72 73 6f 72  ndex of a cursor
22090 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 53 51 4c 20   open on an SQL 
220a0 74 61 62 6c 65 20 62 74 72 65 65 20 28 77 69 74  table btree (wit
220b0 68 20 69 6e 74 65 67 65 72 0a 2a 2a 20 6b 65 79  h integer.** key
220c0 73 29 2e 20 20 50 33 20 69 73 20 61 6e 20 69 6e  s).  P3 is an in
220d0 74 65 67 65 72 20 72 6f 77 69 64 2e 20 20 49 66  teger rowid.  If
220e0 20 50 31 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   P1 does not con
220f0 74 61 69 6e 20 61 20 72 65 63 6f 72 64 20 77 69  tain a record wi
22100 74 68 0a 2a 2a 20 72 6f 77 69 64 20 50 33 20 74  th.** rowid P3 t
22110 68 65 6e 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  hen jump immedia
22120 74 65 6c 79 20 74 6f 20 50 32 2e 20 20 4f 72 2c  tely to P2.  Or,
22130 20 69 66 20 50 32 20 69 73 20 30 2c 20 72 61 69   if P2 is 0, rai
22140 73 65 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  se an.** SQLITE_
22150 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 49  CORRUPT error. I
22160 66 20 50 31 20 64 6f 65 73 20 63 6f 6e 74 61 69  f P1 does contai
22170 6e 20 61 20 72 65 63 6f 72 64 20 77 69 74 68 20  n a record with 
22180 72 6f 77 69 64 20 50 33 20 74 68 65 6e 20 0a 2a  rowid P3 then .*
22190 2a 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73  * leave the curs
221a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  or pointing at t
221b0 68 61 74 20 72 65 63 6f 72 64 20 61 6e 64 20 66  hat record and f
221c0 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
221d0 68 65 20 6e 65 78 74 0a 2a 2a 20 69 6e 73 74 72  he next.** instr
221e0 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  uction..**.** Th
221f0 65 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 20 6f  e OP_SeekRowid o
22200 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
22210 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
22220 6e 20 62 75 74 20 61 6c 73 6f 20 61 6c 6c 6f 77  n but also allow
22230 73 20 74 68 65 0a 2a 2a 20 50 33 20 72 65 67 69  s the.** P3 regi
22240 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ster to contain 
22250 61 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 76 61  a non-integer va
22260 6c 75 65 2c 20 69 6e 20 77 68 69 63 68 20 63 61  lue, in which ca
22270 73 65 20 74 68 65 20 6a 75 6d 70 20 69 73 0a 2a  se the jump is.*
22280 2a 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 20  * always taken. 
22290 20 54 68 69 73 20 6f 70 63 6f 64 65 20 72 65 71   This opcode req
222a0 75 69 72 65 73 20 74 68 61 74 20 50 33 20 61 6c  uires that P3 al
222b0 77 61 79 73 20 63 6f 6e 74 61 69 6e 20 61 6e 20  ways contain an 
222c0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  integer..**.** T
222d0 68 65 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 20 6f  he OP_NotFound o
222e0 70 63 6f 64 65 20 70 65 72 66 6f 72 6d 73 20 74  pcode performs t
222f0 68 65 20 73 61 6d 65 20 6f 70 65 72 61 74 69 6f  he same operatio
22300 6e 20 6f 6e 20 69 6e 64 65 78 20 62 74 72 65 65  n on index btree
22310 73 0a 2a 2a 20 28 77 69 74 68 20 61 72 62 69 74  s.** (with arbit
22320 72 61 72 79 20 6d 75 6c 74 69 2d 76 61 6c 75 65  rary multi-value
22330 20 6b 65 79 73 29 2e 0a 2a 2a 0a 2a 2a 20 54 68   keys)..**.** Th
22340 69 73 20 6f 70 63 6f 64 65 20 6c 65 61 76 65 73  is opcode leaves
22350 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 20 61   the cursor in a
22360 20 73 74 61 74 65 20 77 68 65 72 65 20 69 74 20   state where it 
22370 63 61 6e 6e 6f 74 20 62 65 20 61 64 76 61 6e 63  cannot be advanc
22380 65 64 0a 2a 2a 20 69 6e 20 65 69 74 68 65 72 20  ed.** in either 
22390 64 69 72 65 63 74 69 6f 6e 2e 20 20 49 6e 20 6f  direction.  In o
223a0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
223b0 4e 65 78 74 20 61 6e 64 20 50 72 65 76 20 6f 70  Next and Prev op
223c0 63 6f 64 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f  codes will.** no
223d0 74 20 77 6f 72 6b 20 66 6f 6c 6c 6f 77 69 6e 67  t work following
223e0 20 74 68 69 73 20 6f 70 63 6f 64 65 2e 0a 2a 2a   this opcode..**
223f0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 46 6f  .** See also: Fo
22400 75 6e 64 2c 20 4e 6f 74 46 6f 75 6e 64 2c 20 4e  und, NotFound, N
22410 6f 43 6f 6e 66 6c 69 63 74 2c 20 53 65 65 6b 52  oConflict, SeekR
22420 6f 77 69 64 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  owid.*/.case OP_
22430 53 65 65 6b 52 6f 77 69 64 3a 20 7b 20 20 20 20  SeekRowid: {    
22440 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33      /* jump, in3
22450 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
22460 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
22470 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
22480 65 73 3b 0a 20 20 75 36 34 20 69 4b 65 79 3b 0a  es;.  u64 iKey;.
22490 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b  .  pIn3 = &aMem[
224a0 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 66 28 20  pOp->p3];.  if( 
224b0 28 70 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d  (pIn3->flags & M
224c0 45 4d 5f 49 6e 74 29 3d 3d 30 20 29 7b 0a 20 20  EM_Int)==0 ){.  
224d0 20 20 61 70 70 6c 79 41 66 66 69 6e 69 74 79 28    applyAffinity(
224e0 70 49 6e 33 2c 20 53 51 4c 49 54 45 5f 41 46 46  pIn3, SQLITE_AFF
224f0 5f 4e 55 4d 45 52 49 43 2c 20 65 6e 63 6f 64 69  _NUMERIC, encodi
22500 6e 67 29 3b 0a 20 20 20 20 69 66 28 20 28 70 49  ng);.    if( (pI
22510 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n3->flags & MEM_
22520 49 6e 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6a  Int)==0 ) goto j
22530 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
22540 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
22550 20 69 6e 74 6f 20 4f 50 5f 4e 6f 74 45 78 69 73   into OP_NotExis
22560 74 73 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 6f  ts */.case OP_No
22570 74 45 78 69 73 74 73 3a 20 20 20 20 20 20 20 20  tExists:        
22580 20 20 2f 2a 20 6a 75 6d 70 2c 20 69 6e 33 20 2a    /* jump, in3 *
22590 2f 0a 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d  /.  pIn3 = &aMem
225a0 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61 73 73  [pOp->p3];.  ass
225b0 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61 67 73  ert( pIn3->flags
225c0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
225d0 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
225e0 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
225f0 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
22600 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
22610 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
22620 70 43 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20  pC!=0 );.#ifdef 
22630 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
22640 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 30 3b 0a 23  C->seekOp = 0;.#
22650 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
22660 70 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  pC->isTable );. 
22670 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
22680 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
22690 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72 20  TREE );.  pCrsr 
226a0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
226b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 72 73  ;.  assert( pCrs
226c0 72 21 3d 30 20 29 3b 0a 20 20 72 65 73 20 3d 20  r!=0 );.  res = 
226d0 30 3b 0a 20 20 69 4b 65 79 20 3d 20 70 49 6e 33  0;.  iKey = pIn3
226e0 2d 3e 75 2e 69 3b 0a 20 20 72 63 20 3d 20 73 71  ->u.i;.  rc = sq
226f0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
22700 55 6e 70 61 63 6b 65 64 28 70 43 72 73 72 2c 20  Unpacked(pCrsr, 
22710 30 2c 20 69 4b 65 79 2c 20 30 2c 20 26 72 65 73  0, iKey, 0, &res
22720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
22730 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 65  =SQLITE_OK || re
22740 73 3d 3d 30 20 29 3b 0a 20 20 70 43 2d 3e 6d 6f  s==0 );.  pC->mo
22750 76 65 74 6f 54 61 72 67 65 74 20 3d 20 69 4b 65  vetoTarget = iKe
22760 79 3b 20 20 2f 2a 20 55 73 65 64 20 62 79 20 4f  y;  /* Used by O
22770 50 5f 44 65 6c 65 74 65 20 2a 2f 0a 20 20 70 43  P_Delete */.  pC
22780 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20  ->nullRow = 0;. 
22790 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
227a0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
227b0 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f    pC->deferredMo
227c0 76 65 74 6f 20 3d 20 30 3b 0a 20 20 56 64 62 65  veto = 0;.  Vdbe
227d0 42 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21  BranchTaken(res!
227e0 3d 30 2c 32 29 3b 0a 20 20 70 43 2d 3e 73 65 65  =0,2);.  pC->see
227f0 6b 52 65 73 75 6c 74 20 3d 20 72 65 73 3b 0a 20  kResult = res;. 
22800 20 69 66 28 20 72 65 73 21 3d 30 20 29 7b 0a 20   if( res!=0 ){. 
22810 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
22820 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
22830 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 30 20 29  if( pOp->p2==0 )
22840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
22850 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22870 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f     goto jump_to_
22880 70 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p2;.    }.  }.  
22890 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62  if( rc ) goto ab
228a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
228b0 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ;.  break;.}../*
228c0 20 4f 70 63 6f 64 65 3a 20 53 65 71 75 65 6e 63   Opcode: Sequenc
228d0 65 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  e P1 P2 * * *.**
228e0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
228f0 3d 63 75 72 73 6f 72 5b 50 31 5d 2e 63 74 72 2b  =cursor[P1].ctr+
22900 2b 0a 2a 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  +.**.** Find the
22910 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
22920 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20  sequence number 
22930 66 6f 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  for cursor P1..*
22940 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 71 75  * Write the sequ
22950 65 6e 63 65 20 6e 75 6d 62 65 72 20 69 6e 74 6f  ence number into
22960 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
22970 20 54 68 65 20 73 65 71 75 65 6e 63 65 20 6e 75   The sequence nu
22980 6d 62 65 72 20 6f 6e 20 74 68 65 20 63 75 72 73  mber on the curs
22990 6f 72 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  or is incremente
229a0 64 20 61 66 74 65 72 20 74 68 69 73 0a 2a 2a 20  d after this.** 
229b0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  instruction.  .*
229c0 2f 0a 63 61 73 65 20 4f 50 5f 53 65 71 75 65 6e  /.case OP_Sequen
229d0 63 65 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20  ce: {           
229e0 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 61 73 73  /* out2 */.  ass
229f0 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20  ert( pOp->p1>=0 
22a00 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43  && pOp->p1<p->nC
22a10 75 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  ursor );.  asser
22a20 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  t( p->apCsr[pOp-
22a30 3e 70 31 5d 21 3d 30 20 29 3b 0a 20 20 61 73 73  >p1]!=0 );.  ass
22a40 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f  ert( p->apCsr[pO
22a50 70 2d 3e 70 31 5d 2d 3e 65 43 75 72 54 79 70 65  p->p1]->eCurType
22a60 21 3d 43 55 52 54 59 50 45 5f 56 54 41 42 20 29  !=CURTYPE_VTAB )
22a70 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50  ;.  pOut = out2P
22a80 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
22a90 29 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d  );.  pOut->u.i =
22aa0 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70   p->apCsr[pOp->p
22ab0 31 5d 2d 3e 73 65 71 43 6f 75 6e 74 2b 2b 3b 0a  1]->seqCount++;.
22ac0 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 2f 2a 20    break;.}.../* 
22ad0 4f 70 63 6f 64 65 3a 20 4e 65 77 52 6f 77 69 64  Opcode: NewRowid
22ae0 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
22af0 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d   Synopsis: r[P2]
22b00 3d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 47 65 74  =rowid.**.** Get
22b10 20 61 20 6e 65 77 20 69 6e 74 65 67 65 72 20 72   a new integer r
22b20 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 28 61 2e  ecord number (a.
22b30 6b 2e 61 20 22 72 6f 77 69 64 22 29 20 75 73 65  k.a "rowid") use
22b40 64 20 61 73 20 74 68 65 20 6b 65 79 20 74 6f 20  d as the key to 
22b50 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  a table..** The 
22b60 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 69 73  record number is
22b70 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   not previously 
22b80 75 73 65 64 20 61 73 20 61 20 6b 65 79 20 69 6e  used as a key in
22b90 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
22ba0 20 74 61 62 6c 65 20 74 68 61 74 20 63 75 72 73   table that curs
22bb0 6f 72 20 50 31 20 70 6f 69 6e 74 73 20 74 6f 2e  or P1 points to.
22bc0 20 20 54 68 65 20 6e 65 77 20 72 65 63 6f 72 64    The new record
22bd0 20 6e 75 6d 62 65 72 20 69 73 20 77 72 69 74 74   number is writt
22be0 65 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  en.** written to
22bf0 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a   register P2..**
22c00 0a 2a 2a 20 49 66 20 50 33 3e 30 20 74 68 65 6e  .** If P3>0 then
22c10 20 50 33 20 69 73 20 61 20 72 65 67 69 73 74 65   P3 is a registe
22c20 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66 72  r in the root fr
22c30 61 6d 65 20 6f 66 20 74 68 69 73 20 56 44 42 45  ame of this VDBE
22c40 20 74 68 61 74 20 68 6f 6c 64 73 20 0a 2a 2a 20   that holds .** 
22c50 74 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 76  the largest prev
22c60 69 6f 75 73 6c 79 20 67 65 6e 65 72 61 74 65 64  iously generated
22c70 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20   record number. 
22c80 4e 6f 20 6e 65 77 20 72 65 63 6f 72 64 20 6e 75  No new record nu
22c90 6d 62 65 72 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  mbers are.** all
22ca0 6f 77 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  owed to be less 
22cb0 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2e  than this value.
22cc0 20 57 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65   When this value
22cd0 20 72 65 61 63 68 65 73 20 69 74 73 20 6d 61 78   reaches its max
22ce0 69 6d 75 6d 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  imum, .** an SQL
22cf0 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 69  ITE_FULL error i
22d00 73 20 67 65 6e 65 72 61 74 65 64 2e 20 54 68 65  s generated. The
22d10 20 50 33 20 72 65 67 69 73 74 65 72 20 69 73 20   P3 register is 
22d20 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
22d30 20 27 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20   '.** generated 
22d40 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 2e 20 54  record number. T
22d50 68 69 73 20 50 33 20 6d 65 63 68 61 6e 69 73 6d  his P3 mechanism
22d60 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
22d70 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
22d80 2a 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  * AUTOINCREMENT 
22d90 66 65 61 74 75 72 65 2e 0a 2a 2f 0a 63 61 73 65  feature..*/.case
22da0 20 4f 50 5f 4e 65 77 52 6f 77 69 64 3a 20 7b 20   OP_NewRowid: { 
22db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
22dc0 32 20 2a 2f 0a 20 20 69 36 34 20 76 3b 20 20 20  2 */.  i64 v;   
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22de0 20 54 68 65 20 6e 65 77 20 72 6f 77 69 64 20 2a   The new rowid *
22df0 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
22e00 70 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  pC;        /* Cu
22e10 72 73 6f 72 20 6f 66 20 74 61 62 6c 65 20 74 6f  rsor of table to
22e20 20 67 65 74 20 74 68 65 20 6e 65 77 20 72 6f 77   get the new row
22e30 69 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  id */.  int res;
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e50 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 73  * Result of an s
22e60 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
22e70 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  ) */.  int cnt; 
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e90 20 43 6f 75 6e 74 65 72 20 74 6f 20 6c 69 6d 69   Counter to limi
22ea0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
22eb0 73 65 61 72 63 68 65 73 20 2a 2f 0a 20 20 4d 65  searches */.  Me
22ec0 6d 20 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20  m *pMem;        
22ed0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
22ee0 20 68 6f 6c 64 69 6e 67 20 6c 61 72 67 65 73 74   holding largest
22ef0 20 72 6f 77 69 64 20 66 6f 72 20 41 55 54 4f 49   rowid for AUTOI
22f00 4e 43 52 45 4d 45 4e 54 20 2a 2f 0a 20 20 56 64  NCREMENT */.  Vd
22f10 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
22f20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 66 72 61       /* Root fra
22f30 6d 65 20 6f 66 20 56 44 42 45 20 2a 2f 0a 0a 20  me of VDBE */.. 
22f40 20 76 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20   v = 0;.  res = 
22f50 30 3b 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  0;.  pOut = out2
22f60 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
22f70 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
22f80 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
22f90 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
22fa0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
22fb0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
22fc0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
22fd0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
22fe0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
22ff0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
23000 28 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ( pC->uc.pCursor
23010 21 3d 30 20 29 3b 0a 20 20 7b 0a 20 20 20 20 2f  !=0 );.  {.    /
23020 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 77 69 64  * The next rowid
23030 20 6f 72 20 72 65 63 6f 72 64 20 6e 75 6d 62 65   or record numbe
23040 72 20 28 64 69 66 66 65 72 65 6e 74 20 74 65 72  r (different ter
23050 6d 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 0a  ms for the same.
23060 20 20 20 20 2a 2a 20 74 68 69 6e 67 29 20 69 73      ** thing) is
23070 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 61 20 74   obtained in a t
23080 77 6f 2d 73 74 65 70 20 61 6c 67 6f 72 69 74 68  wo-step algorith
23090 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m..    **.    **
230a0 20 46 69 72 73 74 20 77 65 20 61 74 74 65 6d 70   First we attemp
230b0 74 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  t to find the la
230c0 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72  rgest existing r
230d0 6f 77 69 64 20 61 6e 64 20 61 64 64 20 6f 6e 65  owid and add one
230e0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 61 74 2e  .    ** to that.
230f0 20 20 42 75 74 20 69 66 20 74 68 65 20 6c 61 72    But if the lar
23100 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 72 6f  gest existing ro
23110 77 69 64 20 69 73 20 61 6c 72 65 61 64 79 20 74  wid is already t
23120 68 65 20 6d 61 78 69 6d 75 6d 0a 20 20 20 20 2a  he maximum.    *
23130 2a 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  * positive integ
23140 65 72 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  er, we have to f
23150 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
23160 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
23170 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63 20 61   probabilistic a
23180 6c 67 6f 72 69 74 68 6d 0a 20 20 20 20 2a 2a 0a  lgorithm.    **.
23190 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
231a0 64 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 74  d algorithm is t
231b0 6f 20 73 65 6c 65 63 74 20 61 20 72 6f 77 69 64  o select a rowid
231c0 20 61 74 20 72 61 6e 64 6f 6d 20 61 6e 64 20 73   at random and s
231d0 65 65 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  ee if.    ** it 
231e0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
231f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  n the table.  If
23200 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
23210 73 74 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20  st, we have.    
23220 2a 2a 20 73 75 63 63 65 65 64 65 64 2e 20 20 49  ** succeeded.  I
23230 66 20 74 68 65 20 72 61 6e 64 6f 6d 20 72 6f 77  f the random row
23240 69 64 20 64 6f 65 73 20 65 78 69 73 74 2c 20 77  id does exist, w
23250 65 20 73 65 6c 65 63 74 20 61 20 6e 65 77 20 6f  e select a new o
23260 6e 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 72  ne.    ** and tr
23270 79 20 61 67 61 69 6e 2c 20 75 70 20 74 6f 20 31  y again, up to 1
23280 30 30 20 74 69 6d 65 73 2e 0a 20 20 20 20 2a 2f  00 times..    */
23290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d  .    assert( pC-
232a0 3e 69 73 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  >isTable );..#if
232b0 64 65 66 20 53 51 4c 49 54 45 5f 33 32 42 49 54  def SQLITE_32BIT
232c0 5f 52 4f 57 49 44 0a 23 20 20 20 64 65 66 69 6e  _ROWID.#   defin
232d0 65 20 4d 41 58 5f 52 4f 57 49 44 20 30 78 37 66  e MAX_ROWID 0x7f
232e0 66 66 66 66 66 66 0a 23 65 6c 73 65 0a 20 20 20  ffffff.#else.   
232f0 20 2f 2a 20 53 6f 6d 65 20 63 6f 6d 70 69 6c 65   /* Some compile
23300 72 73 20 63 6f 6d 70 6c 61 69 6e 20 61 62 6f 75  rs complain abou
23310 74 20 63 6f 6e 73 74 61 6e 74 73 20 6f 66 20 74  t constants of t
23320 68 65 20 66 6f 72 6d 20 30 78 37 66 66 66 66 66  he form 0x7fffff
23330 66 66 66 66 66 66 66 66 66 66 2e 0a 20 20 20 20  ffffffffff..    
23340 2a 2a 20 4f 74 68 65 72 73 20 63 6f 6d 70 6c 61  ** Others compla
23350 69 6e 20 61 62 6f 75 74 20 30 78 37 66 66 66 66  in about 0x7ffff
23360 66 66 66 66 66 66 66 66 66 66 66 66 4c 4c 2e 20  ffffffffffffLL. 
23370 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
23380 61 63 72 6f 20 73 65 65 6d 73 0a 20 20 20 20 2a  acro seems.    *
23390 2a 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  * to provide the
233a0 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 6c 65 20   constant while 
233b0 6d 61 6b 69 6e 67 20 61 6c 6c 20 63 6f 6d 70 69  making all compi
233c0 6c 65 72 73 20 68 61 70 70 79 2e 0a 20 20 20 20  lers happy..    
233d0 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
233e0 58 5f 52 4f 57 49 44 20 20 28 69 36 34 29 28 20  X_ROWID  (i64)( 
233f0 28 28 28 75 36 34 29 30 78 37 66 66 66 66 66 66  (((u64)0x7ffffff
23400 66 29 3c 3c 33 32 29 20 7c 20 28 75 36 34 29 30  f)<<32) | (u64)0
23410 78 66 66 66 66 66 66 66 66 20 29 0a 23 65 6e 64  xffffffff ).#end
23420 69 66 0a 0a 20 20 20 20 69 66 28 20 21 70 43 2d  if..    if( !pC-
23430 3e 75 73 65 52 61 6e 64 6f 6d 52 6f 77 69 64 20  >useRandomRowid 
23440 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23450 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 70  lite3BtreeLast(p
23460 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26  C->uc.pCursor, &
23470 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  res);.      if( 
23480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23490 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 62  .        goto ab
234a0 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72  ort_due_to_error
234b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
234c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
234d0 20 20 20 76 20 3d 20 31 3b 20 20 20 2f 2a 20 49     v = 1;   /* I
234e0 4d 50 3a 20 52 2d 36 31 39 31 34 2d 34 38 30 37  MP: R-61914-4807
234f0 34 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  4 */.      }else
23500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
23510 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
23520 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 2d 3e  rsorIsValid(pC->
23530 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  uc.pCursor) );. 
23540 20 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74         v = sqlit
23550 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
23560 79 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  y(pC->uc.pCursor
23570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
23580 3e 3d 4d 41 58 5f 52 4f 57 49 44 20 29 7b 0a 20  >=MAX_ROWID ){. 
23590 20 20 20 20 20 20 20 20 20 70 43 2d 3e 75 73 65           pC->use
235a0 52 61 6e 64 6f 6d 52 6f 77 69 64 20 3d 20 31 3b  RandomRowid = 1;
235b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
235c0 20 20 20 20 20 20 20 20 20 20 76 2b 2b 3b 20 20            v++;  
235d0 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 39 35 33 38   /* IMP: R-29538
235e0 2d 33 34 39 38 37 20 2a 2f 0a 20 20 20 20 20 20  -34987 */.      
235f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23600 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
23610 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
23620 4d 45 4e 54 0a 20 20 20 20 69 66 28 20 70 4f 70  MENT.    if( pOp
23630 2d 3e 70 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ->p3 ){.      /*
23640 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20   Assert that P3 
23650 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72  is a valid memor
23660 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  y cell. */.     
23670 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33   assert( pOp->p3
23680 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
23690 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
236a0 20 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d       for(pFrame=
236b0 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
236c0 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
236d0 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
236e0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  nt);.        /* 
236f0 41 73 73 65 72 74 20 74 68 61 74 20 50 33 20 69  Assert that P3 i
23700 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f 72 79  s a valid memory
23710 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
23720 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
23730 33 3c 3d 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20  3<=pFrame->nMem 
23740 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  );.        pMem 
23750 3d 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b  = &pFrame->aMem[
23760 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20  pOp->p3];.      
23770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
23780 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 50 33  * Assert that P3
23790 20 69 73 20 61 20 76 61 6c 69 64 20 6d 65 6d 6f   is a valid memo
237a0 72 79 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20  ry cell. */.    
237b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
237c0 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p3<=(p->nMem+1 
237d0 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
237e0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
237f0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
23800 20 20 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74          memAbout
23810 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 4d 65 6d  ToChange(p, pMem
23820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23830 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
23840 6c 69 64 28 70 4d 65 6d 29 20 29 3b 0a 0a 20 20  lid(pMem) );..  
23850 20 20 20 20 52 45 47 49 53 54 45 52 5f 54 52 41      REGISTER_TRA
23860 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 4d 65 6d  CE(pOp->p3, pMem
23870 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23880 56 64 62 65 4d 65 6d 49 6e 74 65 67 65 72 69 66  VdbeMemIntegerif
23890 79 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 61  y(pMem);.      a
238a0 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
238b0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d  ags & MEM_Int)!=
238c0 30 20 29 3b 20 20 2f 2a 20 6d 65 6d 28 50 33 29  0 );  /* mem(P3)
238d0 20 68 6f 6c 64 73 20 61 6e 20 69 6e 74 65 67 65   holds an intege
238e0 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
238f0 4d 65 6d 2d 3e 75 2e 69 3d 3d 4d 41 58 5f 52 4f  Mem->u.i==MAX_RO
23900 57 49 44 20 7c 7c 20 70 43 2d 3e 75 73 65 52 61  WID || pC->useRa
23910 6e 64 6f 6d 52 6f 77 69 64 20 29 7b 0a 20 20 20  ndomRowid ){.   
23920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23930 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
23940 20 52 2d 31 37 38 31 37 2d 30 30 36 33 30 20 2a   R-17817-00630 *
23950 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  /.        goto a
23960 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
23970 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
23980 20 69 66 28 20 76 3c 70 4d 65 6d 2d 3e 75 2e 69   if( v<pMem->u.i
23990 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 76 20  +1 ){.        v 
239a0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 20 2b 20 31 3b  = pMem->u.i + 1;
239b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
239c0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 76 3b 0a 20 20  Mem->u.i = v;.  
239d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
239e0 66 28 20 70 43 2d 3e 75 73 65 52 61 6e 64 6f 6d  f( pC->useRandom
239f0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 2f  Rowid ){.      /
23a00 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
23a10 2d 4f 46 3a 20 52 2d 30 37 36 37 37 2d 34 31 38  -OF: R-07677-418
23a20 38 31 20 49 66 20 74 68 65 20 6c 61 72 67 65 73  81 If the larges
23a30 74 20 52 4f 57 49 44 20 69 73 20 65 71 75 61 6c  t ROWID is equal
23a40 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
23a50 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   largest possibl
23a60 65 20 69 6e 74 65 67 65 72 20 28 39 32 32 33 33  e integer (92233
23a70 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29 20  72036854775807) 
23a80 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
23a90 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 67 69 6e  e.      ** engin
23aa0 65 20 73 74 61 72 74 73 20 70 69 63 6b 69 6e 67  e starts picking
23ab0 20 70 6f 73 69 74 69 76 65 20 63 61 6e 64 69 64   positive candid
23ac0 61 74 65 20 52 4f 57 49 44 73 20 61 74 20 72 61  ate ROWIDs at ra
23ad0 6e 64 6f 6d 20 75 6e 74 69 6c 0a 20 20 20 20 20  ndom until.     
23ae0 20 2a 2a 20 69 74 20 66 69 6e 64 73 20 6f 6e 65   ** it finds one
23af0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 70 72 65   that is not pre
23b00 76 69 6f 75 73 6c 79 20 75 73 65 64 2e 20 2a 2f  viously used. */
23b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23b20 4f 70 2d 3e 70 33 3d 3d 30 20 29 3b 20 20 2f 2a  Op->p3==0 );  /*
23b30 20 57 65 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e   We cannot be in
23b40 20 72 61 6e 64 6f 6d 20 72 6f 77 69 64 20 6d 6f   random rowid mo
23b50 64 65 20 69 66 20 74 68 69 73 20 69 73 0a 20 20  de if this is.  
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e             ** an
23b80 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 74   AUTOINCREMENT t
23b90 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63  able. */.      c
23ba0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f  nt = 0;.      do
23bb0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23bc0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
23bd0 65 6f 66 28 76 29 2c 20 26 76 29 3b 0a 20 20 20  eof(v), &v);.   
23be0 20 20 20 20 20 76 20 26 3d 20 28 4d 41 58 5f 52       v &= (MAX_R
23bf0 4f 57 49 44 3e 3e 31 29 3b 20 76 2b 2b 3b 20 20  OWID>>1); v++;  
23c00 2f 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 76  /* Ensure that v
23c10 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
23c20 20 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 7d   zero */.      }
23c30 77 68 69 6c 65 28 20 20 28 28 72 63 20 3d 20 73  while(  ((rc = s
23c40 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
23c50 6f 55 6e 70 61 63 6b 65 64 28 70 43 2d 3e 75 63  oUnpacked(pC->uc
23c60 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 36  .pCursor, 0, (u6
23c70 34 29 76 2c 0a 20 20 20 20 20 20 20 20 20 20 20  4)v,.           
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 20 20 20 20 20 20 30 2c 20 26 72 65 73 29 29 3d        0, &res))=
23cb0 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 20  =SQLITE_OK).    
23cc0 20 20 20 20 20 20 20 20 26 26 20 28 72 65 73 3d          && (res=
23cd0 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
23ce0 26 26 20 28 2b 2b 63 6e 74 3c 31 30 30 29 29 3b  && (++cnt<100));
23cf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
23d00 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
23d10 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  o_error;.      i
23d20 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
23d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23d40 5f 46 55 4c 4c 3b 20 20 20 2f 2a 20 49 4d 50 3a  _FULL;   /* IMP:
23d50 20 52 2d 33 38 32 31 39 2d 35 33 30 30 32 20 2a   R-38219-53002 *
23d60 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61  /.        goto a
23d70 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
23d80 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
23d90 20 61 73 73 65 72 74 28 20 76 3e 30 20 29 3b 20   assert( v>0 ); 
23da0 20 2f 2a 20 45 56 3a 20 52 2d 34 30 38 31 32 2d   /* EV: R-40812-
23db0 30 33 35 37 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  03570 */.    }. 
23dc0 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64 4d     pC->deferredM
23dd0 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
23de0 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  C->cacheStatus =
23df0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
23e00 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20  }.  pOut->u.i = 
23e10 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  v;.  break;.}../
23e20 2a 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74  * Opcode: Insert
23e30 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
23e40 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 6e 74  ** Synopsis: int
23e50 6b 65 79 3d 72 5b 50 33 5d 20 64 61 74 61 3d 72  key=r[P3] data=r
23e60 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  [P2].**.** Write
23e70 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
23e80 68 65 20 74 61 62 6c 65 20 6f 66 20 63 75 72 73  he table of curs
23e90 6f 72 20 50 31 2e 20 20 41 20 6e 65 77 20 65 6e  or P1.  A new en
23ea0 74 72 79 20 69 73 0a 2a 2a 20 63 72 65 61 74 65  try is.** create
23eb0 64 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  d if it doesn't 
23ec0 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6f 72  already exist or
23ed0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 61 6e   the data for an
23ee0 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 65 6e 74   existing.** ent
23ef0 72 79 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ry is overwritte
23f00 6e 2e 20 20 54 68 65 20 64 61 74 61 20 69 73 20  n.  The data is 
23f10 74 68 65 20 76 61 6c 75 65 20 4d 45 4d 5f 42 6c  the value MEM_Bl
23f20 6f 62 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  ob stored in reg
23f30 69 73 74 65 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ister.** number 
23f40 50 32 2e 20 54 68 65 20 6b 65 79 20 69 73 20 73  P2. The key is s
23f50 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
23f60 72 20 50 33 2e 20 54 68 65 20 6b 65 79 20 6d 75  r P3. The key mu
23f70 73 74 0a 2a 2a 20 62 65 20 61 20 4d 45 4d 5f 49  st.** be a MEM_I
23f80 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
23f90 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20   OPFLAG_NCHANGE 
23fa0 66 6c 61 67 20 6f 66 20 50 35 20 69 73 20 73 65  flag of P5 is se
23fb0 74 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  t, then the row 
23fc0 63 68 61 6e 67 65 20 63 6f 75 6e 74 20 69 73 0a  change count is.
23fd0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 28  ** incremented (
23fe0 6f 74 68 65 72 77 69 73 65 20 6e 6f 74 29 2e 20  otherwise not). 
23ff0 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4c   If the OPFLAG_L
24000 41 53 54 52 4f 57 49 44 20 66 6c 61 67 20 6f 66  ASTROWID flag of
24010 20 50 35 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74   P5 is set,.** t
24020 68 65 6e 20 72 6f 77 69 64 20 69 73 20 73 74 6f  hen rowid is sto
24030 72 65 64 20 66 6f 72 20 73 75 62 73 65 71 75 65  red for subseque
24040 6e 74 20 72 65 74 75 72 6e 20 62 79 20 74 68 65  nt return by the
24050 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  .** sqlite3_last
24060 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20  _insert_rowid() 
24070 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65 72 77  function (otherw
24080 69 73 65 20 69 74 20 69 73 20 75 6e 6d 6f 64 69  ise it is unmodi
24090 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  fied)..**.** If 
240a0 74 68 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  the OPFLAG_USESE
240b0 45 4b 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66  EKRESULT flag of
240c0 20 50 35 20 69 73 20 73 65 74 2c 20 74 68 65 20   P5 is set, the 
240d0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
240e0 69 67 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74  ight.** run fast
240f0 65 72 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61  er by avoiding a
24100 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65  n unnecessary se
24110 65 6b 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e  ek on cursor P1.
24120 20 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68    However,.** th
24130 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
24140 52 45 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74  RESULT flag must
24150 20 6f 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20   only be set if 
24160 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
24170 6e 6f 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b  no prior.** seek
24180 73 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  s on the cursor 
24190 6f 72 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72  or if the most r
241a0 65 63 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20  ecent seek used 
241b0 61 20 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 50  a key equal to P
241c0 33 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  3..**.** If the 
241d0 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54 45 20  OPFLAG_ISUPDATE 
241e0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
241f0 6e 20 74 68 69 73 20 6f 70 63 6f 64 65 20 69 73  n this opcode is
24200 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a 20 55   part of an.** U
24210 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e 2e  PDATE operation.
24220 20 20 4f 74 68 65 72 77 69 73 65 20 28 69 66 20    Otherwise (if 
24230 74 68 65 20 66 6c 61 67 20 69 73 20 63 6c 65 61  the flag is clea
24240 72 29 20 74 68 65 6e 20 74 68 69 73 20 6f 70 63  r) then this opc
24250 6f 64 65 0a 2a 2a 20 69 73 20 70 61 72 74 20 6f  ode.** is part o
24260 66 20 61 6e 20 49 4e 53 45 52 54 20 6f 70 65 72  f an INSERT oper
24270 61 74 69 6f 6e 2e 20 20 54 68 65 20 64 69 66 66  ation.  The diff
24280 65 72 65 6e 63 65 20 69 73 20 6f 6e 6c 79 20 69  erence is only i
24290 6d 70 6f 72 74 61 6e 74 20 74 6f 0a 2a 2a 20 74  mportant to.** t
242a0 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2e 0a  he update hook..
242b0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
242c0 50 34 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  P4 may point to 
242d0 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
242e0 65 2c 20 6f 72 20 6d 61 79 20 62 65 20 4e 55 4c  e, or may be NUL
242f0 4c 2e 20 49 66 20 69 74 20 69 73 20 0a 2a 2a 20  L. If it is .** 
24300 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
24310 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 28  he update-hook (
24320 73 71 6c 69 74 65 33 2e 78 55 70 64 61 74 65 43  sqlite3.xUpdateC
24330 61 6c 6c 62 61 63 6b 29 20 69 73 20 69 6e 76 6f  allback) is invo
24340 6b 65 64 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ked .** followin
24350 67 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 69  g a successful i
24360 6e 73 65 72 74 2e 0a 2a 2a 0a 2a 2a 20 28 57 41  nsert..**.** (WA
24370 52 4e 49 4e 47 2f 54 4f 44 4f 3a 20 49 66 20 50  RNING/TODO: If P
24380 31 20 69 73 20 61 20 70 73 65 75 64 6f 2d 63 75  1 is a pseudo-cu
24390 72 73 6f 72 20 61 6e 64 20 50 32 20 69 73 20 64  rsor and P2 is d
243a0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
243b0 6c 6f 63 61 74 65 64 2c 20 74 68 65 6e 20 6f 77  located, then ow
243c0 6e 65 72 73 68 69 70 20 6f 66 20 50 32 20 69 73  nership of P2 is
243d0 20 74 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20   transferred to 
243e0 74 68 65 20 70 73 65 75 64 6f 2d 63 75 72 73 6f  the pseudo-curso
243f0 72 0a 2a 2a 20 61 6e 64 20 72 65 67 69 73 74 65  r.** and registe
24400 72 20 50 32 20 62 65 63 6f 6d 65 73 20 65 70 68  r P2 becomes eph
24410 65 6d 65 72 61 6c 2e 20 20 49 66 20 74 68 65 20  emeral.  If the 
24420 63 75 72 73 6f 72 20 69 73 20 63 68 61 6e 67 65  cursor is change
24430 64 2c 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  d, the.** value 
24440 6f 66 20 72 65 67 69 73 74 65 72 20 50 32 20 77  of register P2 w
24450 69 6c 6c 20 74 68 65 6e 20 63 68 61 6e 67 65 2e  ill then change.
24460 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73    Make sure this
24470 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 61 75   does not.** cau
24480 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
24490 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 73  ).**.** This ins
244a0 74 72 75 63 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  truction only wo
244b0 72 6b 73 20 6f 6e 20 74 61 62 6c 65 73 2e 20 20  rks on tables.  
244c0 54 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 69  The equivalent i
244d0 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 66 6f  nstruction.** fo
244e0 72 20 69 6e 64 69 63 65 73 20 69 73 20 4f 50 5f  r indices is OP_
244f0 49 64 78 49 6e 73 65 72 74 2e 0a 2a 2f 0a 2f 2a  IdxInsert..*/./*
24500 20 4f 70 63 6f 64 65 3a 20 49 6e 73 65 72 74 49   Opcode: InsertI
24510 6e 74 20 50 31 20 50 32 20 50 33 20 50 34 20 50  nt P1 P2 P3 P4 P
24520 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69  5.** Synopsis: i
24530 6e 74 6b 65 79 3d 50 33 20 64 61 74 61 3d 72 5b  ntkey=P3 data=r[
24540 50 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  P2].**.** This w
24550 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
24560 65 20 4f 50 5f 49 6e 73 65 72 74 20 65 78 63 65  e OP_Insert exce
24570 70 74 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  pt that the key 
24580 69 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  is the.** intege
24590 72 20 76 61 6c 75 65 20 50 33 2c 20 6e 6f 74 20  r value P3, not 
245a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
245b0 20 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20   integer stored 
245c0 69 6e 20 72 65 67 69 73 74 65 72 20 50 33 2e 0a  in register P3..
245d0 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65 72  */.case OP_Inser
245e0 74 3a 20 0a 63 61 73 65 20 4f 50 5f 49 6e 73 65  t: .case OP_Inse
245f0 72 74 49 6e 74 3a 20 7b 0a 20 20 4d 65 6d 20 2a  rtInt: {.  Mem *
24600 70 44 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  pData;       /* 
24610 4d 45 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67  MEM cell holding
24620 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
24630 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
24640 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4b  ted */.  Mem *pK
24650 65 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 45  ey;        /* ME
24660 4d 20 63 65 6c 6c 20 68 6f 6c 64 69 6e 67 20 6b  M cell holding k
24670 65 79 20 20 66 6f 72 20 74 68 65 20 72 65 63 6f  ey  for the reco
24680 72 64 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  rd */.  VdbeCurs
24690 6f 72 20 2a 70 43 3b 20 20 20 2f 2a 20 43 75 72  or *pC;   /* Cur
246a0 73 6f 72 20 74 6f 20 74 61 62 6c 65 20 69 6e 74  sor to table int
246b0 6f 20 77 68 69 63 68 20 69 6e 73 65 72 74 20 69  o which insert i
246c0 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  s written */.  i
246d0 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20  nt seekResult;  
246e0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
246f0 69 6f 72 20 73 65 65 6b 20 6f 72 20 30 20 69 66  ior seek or 0 if
24700 20 6e 6f 20 55 53 45 53 45 45 4b 52 45 53 55 4c   no USESEEKRESUL
24710 54 20 66 6c 61 67 20 2a 2f 0a 20 20 63 6f 6e 73  T flag */.  cons
24720 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 2f 2a  t char *zDb;  /*
24730 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2d   database name -
24740 20 75 73 65 64 20 62 79 20 74 68 65 20 75 70 64   used by the upd
24750 61 74 65 20 68 6f 6f 6b 20 2a 2f 0a 20 20 54 61  ate hook */.  Ta
24760 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
24770 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
24780 72 65 20 2d 20 75 73 65 64 20 62 79 20 75 70 64  re - used by upd
24790 61 74 65 20 61 6e 64 20 70 72 65 2d 75 70 64 61  ate and pre-upda
247a0 74 65 20 68 6f 6f 6b 73 20 2a 2f 0a 20 20 69 6e  te hooks */.  in
247b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
247c0 2f 2a 20 4f 70 63 6f 64 65 20 66 6f 72 20 75 70  /* Opcode for up
247d0 64 61 74 65 20 68 6f 6f 6b 3a 20 53 51 4c 49 54  date hook: SQLIT
247e0 45 5f 55 50 44 41 54 45 20 6f 72 20 53 51 4c 49  E_UPDATE or SQLI
247f0 54 45 5f 49 4e 53 45 52 54 20 2a 2f 0a 20 20 42  TE_INSERT */.  B
24800 74 72 65 65 50 61 79 6c 6f 61 64 20 78 3b 20 20  treePayload x;  
24810 20 2f 2a 20 50 61 79 6c 6f 61 64 20 74 6f 20 62   /* Payload to b
24820 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  e inserted */.. 
24830 20 6f 70 20 3d 20 30 3b 0a 20 20 70 44 61 74 61   op = 0;.  pData
24840 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
24850 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
24860 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
24870 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
24880 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
24890 56 61 6c 69 64 28 70 44 61 74 61 29 20 29 3b 0a  Valid(pData) );.
248a0 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b    pC = p->apCsr[
248b0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
248c0 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61  rt( pC!=0 );.  a
248d0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
248e0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
248f0 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
24900 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  pC->uc.pCursor!=
24910 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
24920 43 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  C->isTable );.  
24930 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
24940 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 7c 7c  ype==P4_TABLE ||
24950 20 70 4f 70 2d 3e 70 34 74 79 70 65 3e 3d 50 34   pOp->p4type>=P4
24960 5f 53 54 41 54 49 43 20 29 3b 0a 20 20 52 45 47  _STATIC );.  REG
24970 49 53 54 45 52 5f 54 52 41 43 45 28 70 4f 70 2d  ISTER_TRACE(pOp-
24980 3e 70 32 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  >p2, pData);..  
24990 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
249a0 3d 4f 50 5f 49 6e 73 65 72 74 20 29 7b 0a 20 20  =OP_Insert ){.  
249b0 20 20 70 4b 65 79 20 3d 20 26 61 4d 65 6d 5b 70    pKey = &aMem[p
249c0 4f 70 2d 3e 70 33 5d 3b 0a 20 20 20 20 61 73 73  Op->p3];.    ass
249d0 65 72 74 28 20 70 4b 65 79 2d 3e 66 6c 61 67 73  ert( pKey->flags
249e0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
249f0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56    assert( memIsV
24a00 61 6c 69 64 28 70 4b 65 79 29 20 29 3b 0a 20 20  alid(pKey) );.  
24a10 20 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45    REGISTER_TRACE
24a20 28 70 4f 70 2d 3e 70 33 2c 20 70 4b 65 79 29 3b  (pOp->p3, pKey);
24a30 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d 20 70 4b  .    x.nKey = pK
24a40 65 79 2d 3e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65  ey->u.i;.  }else
24a50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  {.    assert( pO
24a60 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
24a70 73 65 72 74 49 6e 74 20 29 3b 0a 20 20 20 20 78  sertInt );.    x
24a80 2e 6e 4b 65 79 20 3d 20 70 4f 70 2d 3e 70 33 3b  .nKey = pOp->p3;
24a90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 70 2d  .  }..  if( pOp-
24aa0 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54 41 42 4c  >p4type==P4_TABL
24ab0 45 20 26 26 20 48 41 53 5f 55 50 44 41 54 45 5f  E && HAS_UPDATE_
24ac0 48 4f 4f 4b 28 64 62 29 20 29 7b 0a 20 20 20 20  HOOK(db) ){.    
24ad0 61 73 73 65 72 74 28 20 70 43 2d 3e 69 73 54 61  assert( pC->isTa
24ae0 62 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ble );.    asser
24af0 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29 3b  t( pC->iDb>=0 );
24b00 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  .    zDb = db->a
24b10 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53  Db[pC->iDb].zDbS
24b20 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d  Name;.    pTab =
24b30 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20   pOp->p4.pTab;. 
24b40 20 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f     assert( HasRo
24b50 77 69 64 28 70 54 61 62 29 20 29 3b 0a 20 20 20  wid(pTab) );.   
24b60 20 6f 70 20 3d 20 28 28 70 4f 70 2d 3e 70 35 20   op = ((pOp->p5 
24b70 26 20 4f 50 46 4c 41 47 5f 49 53 55 50 44 41 54  & OPFLAG_ISUPDAT
24b80 45 29 20 3f 20 53 51 4c 49 54 45 5f 55 50 44 41  E) ? SQLITE_UPDA
24b90 54 45 20 3a 20 53 51 4c 49 54 45 5f 49 4e 53 45  TE : SQLITE_INSE
24ba0 52 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RT);.  }else{.  
24bb0 20 20 70 54 61 62 20 3d 20 30 3b 20 2f 2a 20 4e    pTab = 0; /* N
24bc0 6f 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65  ot needed.  Sile
24bd0 6e 63 65 20 61 20 63 6f 6d 69 6c 65 72 20 77 61  nce a comiler wa
24be0 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 7a 44  rning. */.    zD
24bf0 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e  b = 0;  /* Not n
24c00 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65 20  eeded.  Silence 
24c10 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  a compiler warni
24c20 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 64  ng. */.  }..#ifd
24c30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24c40 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
24c50 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
24c60 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2c  pre-update hook,
24c70 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 66 28   if any */.  if(
24c80 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
24c90 61 6c 6c 62 61 63 6b 20 0a 20 20 20 26 26 20 70  allback .   && p
24ca0 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 54  Op->p4type==P4_T
24cb0 41 42 4c 45 0a 20 20 20 26 26 20 21 28 70 4f 70  ABLE.   && !(pOp
24cc0 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 49 53  ->p5 & OPFLAG_IS
24cd0 55 50 44 41 54 45 29 0a 20 20 29 7b 0a 20 20 20  UPDATE).  ){.   
24ce0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
24cf0 70 64 61 74 65 48 6f 6f 6b 28 70 2c 20 70 43 2c  pdateHook(p, pC,
24d00 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
24d10 7a 44 62 2c 20 70 54 61 62 2c 20 78 2e 6e 4b 65  zDb, pTab, x.nKe
24d20 79 2c 20 70 4f 70 2d 3e 70 32 29 3b 0a 20 20 7d  y, pOp->p2);.  }
24d30 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
24d40 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
24d50 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
24d60 61 6e 67 65 2b 2b 3b 0a 20 20 69 66 28 20 70 4f  ange++;.  if( pO
24d70 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 4c  p->p5 & OPFLAG_L
24d80 41 53 54 52 4f 57 49 44 20 29 20 64 62 2d 3e 6c  ASTROWID ) db->l
24d90 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73 74 52  astRowid = lastR
24da0 6f 77 69 64 20 3d 20 78 2e 6e 4b 65 79 3b 0a 20  owid = x.nKey;. 
24db0 20 69 66 28 20 70 44 61 74 61 2d 3e 66 6c 61 67   if( pData->flag
24dc0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
24dd0 20 20 20 20 78 2e 70 44 61 74 61 20 3d 20 30 3b      x.pData = 0;
24de0 0a 20 20 20 20 78 2e 6e 44 61 74 61 20 3d 20 30  .    x.nData = 0
24df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24e00 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 66 6c  ssert( pData->fl
24e10 61 67 73 20 26 20 28 4d 45 4d 5f 42 6c 6f 62 7c  ags & (MEM_Blob|
24e20 4d 45 4d 5f 53 74 72 29 20 29 3b 0a 20 20 20 20  MEM_Str) );.    
24e30 78 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61 2d  x.pData = pData-
24e40 3e 7a 3b 0a 20 20 20 20 78 2e 6e 44 61 74 61 20  >z;.    x.nData 
24e50 3d 20 70 44 61 74 61 2d 3e 6e 3b 0a 20 20 7d 0a  = pData->n;.  }.
24e60 20 20 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 28    seekResult = (
24e70 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41  (pOp->p5 & OPFLA
24e80 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
24e90 20 3f 20 70 43 2d 3e 73 65 65 6b 52 65 73 75 6c   ? pC->seekResul
24ea0 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 44  t : 0);.  if( pD
24eb0 61 74 61 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ata->flags & MEM
24ec0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 78 2e 6e  _Zero ){.    x.n
24ed0 5a 65 72 6f 20 3d 20 70 44 61 74 61 2d 3e 75 2e  Zero = pData->u.
24ee0 6e 5a 65 72 6f 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nZero;.  }else{.
24ef0 20 20 20 20 78 2e 6e 5a 65 72 6f 20 3d 20 30 3b      x.nZero = 0;
24f00 0a 20 20 7d 0a 20 20 78 2e 70 4b 65 79 20 3d 20  .  }.  x.pKey = 
24f10 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
24f20 33 42 74 72 65 65 49 6e 73 65 72 74 28 70 43 2d  3BtreeInsert(pC-
24f30 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 78 2c  >uc.pCursor, &x,
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f50 20 20 20 20 20 20 20 20 20 20 20 28 70 4f 70 2d             (pOp-
24f60 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 41 50 50  >p5 & OPFLAG_APP
24f70 45 4e 44 29 21 3d 30 2c 20 73 65 65 6b 52 65 73  END)!=0, seekRes
24f80 75 6c 74 0a 20 20 29 3b 0a 20 20 70 43 2d 3e 64  ult.  );.  pC->d
24f90 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
24fa0 30 3b 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74  0;.  pC->cacheSt
24fb0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
24fc0 4c 45 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  LE;..  /* Invoke
24fd0 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f 6f 6b   the update-hook
24fe0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
24ff0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
25000 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
25010 72 6f 72 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78  ror;.  if( db->x
25020 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26  UpdateCallback &
25030 26 20 6f 70 20 29 7b 0a 20 20 20 20 64 62 2d 3e  & op ){.    db->
25040 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  xUpdateCallback(
25050 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 2c 20  db->pUpdateArg, 
25060 6f 70 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a  op, zDb, pTab->z
25070 4e 61 6d 65 2c 20 78 2e 6e 4b 65 79 29 3b 0a 20  Name, x.nKey);. 
25080 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f   }.  break;.}../
25090 2a 20 4f 70 63 6f 64 65 3a 20 44 65 6c 65 74 65  * Opcode: Delete
250a0 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
250b0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
250c0 20 72 65 63 6f 72 64 20 61 74 20 77 68 69 63 68   record at which
250d0 20 74 68 65 20 50 31 20 63 75 72 73 6f 72 20 69   the P1 cursor i
250e0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
250f0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ting..**.** If t
25100 68 65 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  he OPFLAG_SAVEPO
25110 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 74 68  SITION bit of th
25120 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20 69  e P5 parameter i
25130 73 20 73 65 74 2c 20 74 68 65 6e 0a 2a 2a 20 74  s set, then.** t
25140 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 62  he cursor will b
25150 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  e left pointing 
25160 61 74 20 20 65 69 74 68 65 72 20 74 68 65 20 6e  at  either the n
25170 65 78 74 20 6f 72 20 74 68 65 20 70 72 65 76 69  ext or the previ
25180 6f 75 73 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e  ous.** record in
25190 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 69   the table. If i
251a0 74 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  t is left pointi
251b0 6e 67 20 61 74 20 74 68 65 20 6e 65 78 74 20 72  ng at the next r
251c0 65 63 6f 72 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ecord, then.** t
251d0 68 65 20 6e 65 78 74 20 4e 65 78 74 20 69 6e 73  he next Next ins
251e0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
251f0 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 20 61 20 72   a no-op. As a r
25200 65 73 75 6c 74 2c 20 69 6e 20 74 68 69 73 20 63  esult, in this c
25210 61 73 65 0a 2a 2a 20 69 74 20 69 73 20 6f 6b 20  ase.** it is ok 
25220 74 6f 20 64 65 6c 65 74 65 20 61 20 72 65 63 6f  to delete a reco
25230 72 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  rd from within a
25240 20 4e 65 78 74 20 6c 6f 6f 70 2e 20 49 66 20 0a   Next loop. If .
25250 2a 2a 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f  ** OPFLAG_SAVEPO
25260 53 49 54 49 4f 4e 20 62 69 74 20 6f 66 20 50 35  SITION bit of P5
25270 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
25280 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  the cursor will 
25290 62 65 0a 2a 2a 20 6c 65 66 74 20 69 6e 20 61 6e  be.** left in an
252a0 20 75 6e 64 65 66 69 6e 65 64 20 73 74 61 74 65   undefined state
252b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4f  ..**.** If the O
252c0 50 46 4c 41 47 5f 41 55 58 44 45 4c 45 54 45 20  PFLAG_AUXDELETE 
252d0 62 69 74 20 69 73 20 73 65 74 20 6f 6e 20 50 35  bit is set on P5
252e0 2c 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  , that indicates
252f0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 64 65   that this.** de
25300 6c 65 74 65 20 6f 6e 65 20 6f 66 20 73 65 76 65  lete one of seve
25310 72 61 6c 20 61 73 73 6f 63 69 61 74 65 64 20 77  ral associated w
25320 69 74 68 20 64 65 6c 65 74 69 6e 67 20 61 20 74  ith deleting a t
25330 61 62 6c 65 20 72 6f 77 20 61 6e 64 20 61 6c 6c  able row and all
25340 20 69 74 73 0a 2a 2a 20 61 73 73 6f 63 69 61 74   its.** associat
25350 65 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ed index entries
25360 2e 20 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  .  Exactly one o
25370 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 73 20  f those deletes 
25380 69 73 20 74 68 65 20 22 70 72 69 6d 61 72 79 22  is the "primary"
25390 0a 2a 2a 20 64 65 6c 65 74 65 2e 20 20 54 68 65  .** delete.  The
253a0 20 6f 74 68 65 72 73 20 61 72 65 20 61 6c 6c 20   others are all 
253b0 6f 6e 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c  on OPFLAG_FORDEL
253c0 45 54 45 20 63 75 72 73 6f 72 73 20 6f 72 20 65  ETE cursors or e
253d0 6c 73 65 20 61 72 65 0a 2a 2a 20 6d 61 72 6b 65  lse are.** marke
253e0 64 20 77 69 74 68 20 74 68 65 20 41 55 58 44 45  d with the AUXDE
253f0 4c 45 54 45 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  LETE flag..**.**
25400 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f 4e   If the OPFLAG_N
25410 43 48 41 4e 47 45 20 66 6c 61 67 20 6f 66 20 50  CHANGE flag of P
25420 32 20 28 4e 42 3a 20 50 32 20 6e 6f 74 20 50 35  2 (NB: P2 not P5
25430 29 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  ) is set, then t
25440 68 65 20 72 6f 77 0a 2a 2a 20 63 68 61 6e 67 65  he row.** change
25450 20 63 6f 75 6e 74 20 69 73 20 69 6e 63 72 65 6d   count is increm
25460 65 6e 74 65 64 20 28 6f 74 68 65 72 77 69 73 65  ented (otherwise
25470 20 6e 6f 74 29 2e 0a 2a 2a 0a 2a 2a 20 50 31 20   not)..**.** P1 
25480 6d 75 73 74 20 6e 6f 74 20 62 65 20 70 73 65 75  must not be pseu
25490 64 6f 2d 74 61 62 6c 65 2e 20 20 49 74 20 68 61  do-table.  It ha
254a0 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 74  s to be a real t
254b0 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 6d 75 6c  able with.** mul
254c0 74 69 70 6c 65 20 72 6f 77 73 2e 0a 2a 2a 0a 2a  tiple rows..**.*
254d0 2a 20 49 66 20 50 34 20 69 73 20 6e 6f 74 20 4e  * If P4 is not N
254e0 55 4c 4c 20 74 68 65 6e 20 69 74 20 70 6f 69 6e  ULL then it poin
254f0 74 73 20 74 6f 20 61 20 54 61 62 6c 65 20 6f 62  ts to a Table ob
25500 6a 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  ject. In this ca
25510 73 65 20 65 69 74 68 65 72 20 0a 2a 2a 20 74 68  se either .** th
25520 65 20 75 70 64 61 74 65 20 6f 72 20 70 72 65 2d  e update or pre-
25530 75 70 64 61 74 65 20 68 6f 6f 6b 2c 20 6f 72 20  update hook, or 
25540 62 6f 74 68 2c 20 6d 61 79 20 62 65 20 69 6e 76  both, may be inv
25550 6f 6b 65 64 2e 20 54 68 65 20 50 31 20 63 75 72  oked. The P1 cur
25560 73 6f 72 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65  sor must.** have
25570 20 62 65 65 6e 20 70 6f 73 69 74 69 6f 6e 65 64   been positioned
25580 20 75 73 69 6e 67 20 4f 50 5f 4e 6f 74 46 6f 75   using OP_NotFou
25590 6e 64 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  nd prior to invo
255a0 6b 69 6e 67 20 74 68 69 73 20 6f 70 63 6f 64 65  king this opcode
255b0 20 69 6e 20 0a 2a 2a 20 74 68 69 73 20 63 61 73   in .** this cas
255c0 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  e. Specifically,
255d0 20 69 66 20 6f 6e 65 20 69 73 20 63 6f 6e 66 69   if one is confi
255e0 67 75 72 65 64 2c 20 74 68 65 20 70 72 65 2d 75  gured, the pre-u
255f0 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 0a 2a  pdate hook is .*
25600 2a 20 69 6e 76 6f 6b 65 64 20 69 66 20 50 34 20  * invoked if P4 
25610 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 54 68 65  is not NULL. The
25620 20 75 70 64 61 74 65 2d 68 6f 6f 6b 20 69 73 20   update-hook is 
25630 69 6e 76 6f 6b 65 64 20 69 66 20 6f 6e 65 20 69  invoked if one i
25640 73 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 0a 2a  s configured, .*
25650 2a 20 50 34 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  * P4 is not NULL
25660 2c 20 61 6e 64 20 74 68 65 20 4f 50 46 4c 41 47  , and the OPFLAG
25670 5f 4e 43 48 41 4e 47 45 20 66 6c 61 67 20 69 73  _NCHANGE flag is
25680 20 73 65 74 20 69 6e 20 50 32 2e 0a 2a 2a 0a 2a   set in P2..**.*
25690 2a 20 49 66 20 74 68 65 20 4f 50 46 4c 41 47 5f  * If the OPFLAG_
256a0 49 53 55 50 44 41 54 45 20 66 6c 61 67 20 69 73  ISUPDATE flag is
256b0 20 73 65 74 20 69 6e 20 50 32 2c 20 74 68 65 6e   set in P2, then
256c0 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   P3 contains the
256d0 20 61 64 64 72 65 73 73 0a 2a 2a 20 6f 66 20 74   address.** of t
256e0 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  he memory cell t
256f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
25700 20 76 61 6c 75 65 20 74 68 61 74 20 74 68 65 20   value that the 
25710 72 6f 77 69 64 20 6f 66 20 74 68 65 20 72 6f 77  rowid of the row
25720 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 65 74 20   will.** be set 
25730 74 6f 20 62 79 20 74 68 65 20 75 70 64 61 74 65  to by the update
25740 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 44 65 6c  ..*/.case OP_Del
25750 65 74 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  ete: {.  VdbeCur
25760 73 6f 72 20 2a 70 43 3b 0a 20 20 63 6f 6e 73 74  sor *pC;.  const
25770 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 61   char *zDb;.  Ta
25780 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
25790 20 6f 70 66 6c 61 67 73 3b 0a 0a 20 20 6f 70 66   opflags;..  opf
257a0 6c 61 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  lags = pOp->p2;.
257b0 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
257c0 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c  1>=0 && pOp->p1<
257d0 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20  p->nCursor );.  
257e0 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f  pC = p->apCsr[pO
257f0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
25800 28 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( pC!=0 );.  ass
25810 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70  ert( pC->eCurTyp
25820 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
25830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25840 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
25850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  );.  assert( pC-
25860 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d  >deferredMoveto=
25870 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
25880 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
25890 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
258a0 5f 54 41 42 4c 45 20 26 26 20 48 61 73 52 6f 77  _TABLE && HasRow
258b0 69 64 28 70 4f 70 2d 3e 70 34 2e 70 54 61 62 29  id(pOp->p4.pTab)
258c0 20 26 26 20 70 4f 70 2d 3e 70 35 3d 3d 30 20 29   && pOp->p5==0 )
258d0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70 35 20 69  {.    /* If p5 i
258e0 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 65 65 6b  s zero, the seek
258f0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
25900 70 6f 73 69 74 69 6f 6e 65 64 20 74 68 65 20 63  positioned the c
25910 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 0a 20  ursor prior to. 
25920 20 20 20 2a 2a 20 4f 50 5f 44 65 6c 65 74 65 20     ** OP_Delete 
25930 77 69 6c 6c 20 68 61 76 65 20 61 6c 73 6f 20 73  will have also s
25940 65 74 20 74 68 65 20 70 43 2d 3e 6d 6f 76 65 74  et the pC->movet
25950 6f 54 61 72 67 65 74 20 66 69 65 6c 64 20 74 6f  oTarget field to
25960 20 74 68 65 20 72 6f 77 69 64 20 6f 66 0a 20 20   the rowid of.  
25970 20 20 2a 2a 20 74 68 65 20 72 6f 77 20 74 68 61    ** the row tha
25980 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
25990 65 64 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 4b  ed */.    i64 iK
259a0 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
259b0 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e  eIntegerKey(pC->
259c0 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
259d0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6d 6f 76   assert( pC->mov
259e0 65 74 6f 54 61 72 67 65 74 3d 3d 69 4b 65 79 20  etoTarget==iKey 
259f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
25a00 20 2f 2a 20 49 66 20 74 68 65 20 75 70 64 61 74   /* If the updat
25a10 65 2d 68 6f 6f 6b 20 6f 72 20 70 72 65 2d 75 70  e-hook or pre-up
25a20 64 61 74 65 2d 68 6f 6f 6b 20 77 69 6c 6c 20 62  date-hook will b
25a30 65 20 69 6e 76 6f 6b 65 64 2c 20 73 65 74 20 7a  e invoked, set z
25a40 44 62 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6e  Db to.  ** the n
25a50 61 6d 65 20 6f 66 20 74 68 65 20 64 62 20 74 6f  ame of the db to
25a60 20 70 61 73 73 20 61 73 20 74 6f 20 69 74 2e 20   pass as to it. 
25a70 41 6c 73 6f 20 73 65 74 20 6c 6f 63 61 6c 20 70  Also set local p
25a80 54 61 62 20 74 6f 20 61 20 63 6f 70 79 0a 20 20  Tab to a copy.  
25a90 2a 2a 20 6f 66 20 70 34 2e 70 54 61 62 2e 20 46  ** of p4.pTab. F
25aa0 69 6e 61 6c 6c 79 2c 20 69 66 20 70 35 20 69 73  inally, if p5 is
25ab0 20 74 72 75 65 2c 20 69 6e 64 69 63 61 74 69 6e   true, indicatin
25ac0 67 20 74 68 61 74 20 74 68 69 73 20 63 75 72 73  g that this curs
25ad0 6f 72 20 77 61 73 0a 20 20 2a 2a 20 6c 61 73 74  or was.  ** last
25ae0 20 6d 6f 76 65 64 20 77 69 74 68 20 4f 50 5f 4e   moved with OP_N
25af0 65 78 74 20 6f 72 20 4f 50 5f 50 72 65 76 2c 20  ext or OP_Prev, 
25b00 6e 6f 74 20 53 65 65 6b 20 6f 72 20 4e 6f 74 46  not Seek or NotF
25b10 6f 75 6e 64 2c 20 73 65 74 20 0a 20 20 2a 2a 20  ound, set .  ** 
25b20 56 64 62 65 43 75 72 73 6f 72 2e 6d 6f 76 65 74  VdbeCursor.movet
25b30 6f 54 61 72 67 65 74 20 74 6f 20 74 68 65 20 63  oTarget to the c
25b40 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 20 2a  urrent rowid.  *
25b50 2f 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  /.  if( pOp->p4t
25b60 79 70 65 3d 3d 50 34 5f 54 41 42 4c 45 20 26 26  ype==P4_TABLE &&
25b70 20 48 41 53 5f 55 50 44 41 54 45 5f 48 4f 4f 4b   HAS_UPDATE_HOOK
25b80 28 64 62 29 20 29 7b 0a 20 20 20 20 61 73 73 65  (db) ){.    asse
25b90 72 74 28 20 70 43 2d 3e 69 44 62 3e 3d 30 20 29  rt( pC->iDb>=0 )
25ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
25bb0 70 2d 3e 70 34 2e 70 54 61 62 21 3d 30 20 29 3b  p->p4.pTab!=0 );
25bc0 0a 20 20 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  .    zDb = db->a
25bd0 44 62 5b 70 43 2d 3e 69 44 62 5d 2e 7a 44 62 53  Db[pC->iDb].zDbS
25be0 4e 61 6d 65 3b 0a 20 20 20 20 70 54 61 62 20 3d  Name;.    pTab =
25bf0 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 3b 0a 20   pOp->p4.pTab;. 
25c00 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 70 35 20     if( (pOp->p5 
25c10 26 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53  & OPFLAG_SAVEPOS
25c20 49 54 49 4f 4e 29 21 3d 30 20 26 26 20 70 43 2d  ITION)!=0 && pC-
25c30 3e 69 73 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  >isTable ){.    
25c40 20 20 70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67    pC->movetoTarg
25c50 65 74 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  et = sqlite3Btre
25c60 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 2d 3e  eIntegerKey(pC->
25c70 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
25c80 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
25c90 7a 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 6f  zDb = 0;   /* No
25ca0 74 20 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e  t needed.  Silen
25cb0 63 65 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61  ce a compiler wa
25cc0 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 54  rning. */.    pT
25cd0 61 62 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20  ab = 0;  /* Not 
25ce0 6e 65 65 64 65 64 2e 20 20 53 69 6c 65 6e 63 65  needed.  Silence
25cf0 20 61 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e   a compiler warn
25d00 69 6e 67 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66  ing. */.  }..#if
25d10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25d20 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
25d30 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65  .  /* Invoke the
25d40 20 70 72 65 2d 75 70 64 61 74 65 2d 68 6f 6f 6b   pre-update-hook
25d50 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
25d60 0a 20 20 69 66 28 20 64 62 2d 3e 78 50 72 65 55  .  if( db->xPreU
25d70 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 26 26  pdateCallback &&
25d80 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 20 26 26   pOp->p4.pTab &&
25d90 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
25da0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
25db0 28 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41  (opflags & OPFLA
25dc0 47 5f 49 53 55 50 44 41 54 45 29 20 7c 7c 20 28  G_ISUPDATE) || (
25dd0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e 66 6c  aMem[pOp->p3].fl
25de0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
25df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25e00 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 70  ePreUpdateHook(p
25e10 2c 20 70 43 2c 0a 20 20 20 20 20 20 20 20 28 6f  , pC,.        (o
25e20 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  pflags & OPFLAG_
25e30 49 53 55 50 44 41 54 45 29 20 3f 20 53 51 4c 49  ISUPDATE) ? SQLI
25e40 54 45 5f 55 50 44 41 54 45 20 3a 20 53 51 4c 49  TE_UPDATE : SQLI
25e50 54 45 5f 44 45 4c 45 54 45 2c 20 0a 20 20 20 20  TE_DELETE, .    
25e60 20 20 20 20 7a 44 62 2c 20 70 54 61 62 2c 20 70      zDb, pTab, p
25e70 43 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  C->movetoTarget,
25e80 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
25e90 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
25ea0 28 20 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ( opflags & OPFL
25eb0 41 47 5f 49 53 4e 4f 4f 50 20 29 20 62 72 65 61  AG_ISNOOP ) brea
25ec0 6b 3b 0a 23 65 6e 64 69 66 0a 20 0a 20 20 2f 2a  k;.#endif. .  /*
25ed0 20 4f 6e 6c 79 20 66 6c 61 67 73 20 74 68 61 74   Only flags that
25ee0 20 63 61 6e 20 62 65 20 73 65 74 20 61 72 65 20   can be set are 
25ef0 53 41 56 45 50 4f 49 53 54 49 4f 4e 20 61 6e 64  SAVEPOISTION and
25f00 20 41 55 58 44 45 4c 45 54 45 20 2a 2f 20 0a 20   AUXDELETE */ . 
25f10 20 61 73 73 65 72 74 28 20 28 70 4f 70 2d 3e 70   assert( (pOp->p
25f20 35 20 26 20 7e 28 4f 50 46 4c 41 47 5f 53 41 56  5 & ~(OPFLAG_SAV
25f30 45 50 4f 53 49 54 49 4f 4e 7c 4f 50 46 4c 41 47  EPOSITION|OPFLAG
25f40 5f 41 55 58 44 45 4c 45 54 45 29 29 3d 3d 30 20  _AUXDELETE))==0 
25f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4f 50 46  );.  assert( OPF
25f60 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
25f70 3d 3d 42 54 52 45 45 5f 53 41 56 45 50 4f 53 49  ==BTREE_SAVEPOSI
25f80 54 49 4f 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  TION );.  assert
25f90 28 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c 45  ( OPFLAG_AUXDELE
25fa0 54 45 3d 3d 42 54 52 45 45 5f 41 55 58 44 45 4c  TE==BTREE_AUXDEL
25fb0 45 54 45 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  ETE );..#ifdef S
25fc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
25fd0 28 20 70 2d 3e 70 46 72 61 6d 65 3d 3d 30 20 29  ( p->pFrame==0 )
25fe0 7b 0a 20 20 20 20 69 66 28 20 70 43 2d 3e 69 73  {.    if( pC->is
25ff0 45 70 68 65 6d 65 72 61 6c 3d 3d 30 0a 20 20 20  Ephemeral==0.   
26000 20 20 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 35       && (pOp->p5
26010 20 26 20 4f 50 46 4c 41 47 5f 41 55 58 44 45 4c   & OPFLAG_AUXDEL
26020 45 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ETE)==0.        
26030 26 26 20 28 70 43 2d 3e 77 72 46 6c 61 67 20 26  && (pC->wrFlag &
26040 20 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54   OPFLAG_FORDELET
26050 45 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  E)==0.      ){. 
26060 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c 65 74       nExtraDelet
26070 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e++;.    }.    i
26080 66 28 20 70 4f 70 2d 3e 70 32 20 26 20 4f 50 46  f( pOp->p2 & OPF
26090 4c 41 47 5f 4e 43 48 41 4e 47 45 20 29 7b 0a 20  LAG_NCHANGE ){. 
260a0 20 20 20 20 20 6e 45 78 74 72 61 44 65 6c 65 74       nExtraDelet
260b0 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  e--;.    }.  }.#
260c0 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20 73 71  endif..  rc = sq
260d0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
260e0 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  (pC->uc.pCursor,
260f0 20 70 4f 70 2d 3e 70 35 29 3b 0a 20 20 70 43 2d   pOp->p5);.  pC-
26100 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
26110 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 70 43  ACHE_STALE;.  pC
26120 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3d 20 30  ->seekResult = 0
26130 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
26140 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
26150 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  rror;..  /* Invo
26160 6b 65 20 74 68 65 20 75 70 64 61 74 65 2d 68 6f  ke the update-ho
26170 6f 6b 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  ok if required. 
26180 2a 2f 0a 20 20 69 66 28 20 6f 70 66 6c 61 67 73  */.  if( opflags
26190 20 26 20 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47   & OPFLAG_NCHANG
261a0 45 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  E ){.    p->nCha
261b0 6e 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 64  nge++;.    if( d
261c0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
261d0 63 6b 20 26 26 20 48 61 73 52 6f 77 69 64 28 70  ck && HasRowid(p
261e0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 62  Tab) ){.      db
261f0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
26200 6b 28 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  k(db->pUpdateArg
26210 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
26220 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   zDb, pTab->zNam
26230 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 2d  e,.          pC-
26240 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a  >movetoTarget);.
26250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26260 2d 3e 69 44 62 3e 3d 30 20 29 3b 0a 20 20 20 20  ->iDb>=0 );.    
26270 7d 0a 20 20 7d 0a 0a 20 20 62 72 65 61 6b 3b 0a  }.  }..  break;.
26280 7d 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 52 65 73  }./* Opcode: Res
26290 65 74 43 6f 75 6e 74 20 2a 20 2a 20 2a 20 2a 20  etCount * * * * 
262a0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  *.**.** The valu
262b0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
262c0 63 6f 75 6e 74 65 72 20 69 73 20 63 6f 70 69 65  counter is copie
262d0 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
262e0 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 63 68 61 6e  e handle.** chan
262f0 67 65 20 63 6f 75 6e 74 65 72 20 28 72 65 74 75  ge counter (retu
26300 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
26310 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
26320 74 65 33 5f 63 68 61 6e 67 65 73 28 29 29 2e 0a  te3_changes())..
26330 2a 2a 20 54 68 65 6e 20 74 68 65 20 56 4d 73 20  ** Then the VMs 
26340 69 6e 74 65 72 6e 61 6c 20 63 68 61 6e 67 65 20  internal change 
26350 63 6f 75 6e 74 65 72 20 72 65 73 65 74 73 20 74  counter resets t
26360 6f 20 30 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  o 0..** This is 
26370 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 20  used by trigger 
26380 70 72 6f 67 72 61 6d 73 2e 0a 2a 2f 0a 63 61 73  programs..*/.cas
26390 65 20 4f 50 5f 52 65 73 65 74 43 6f 75 6e 74 3a  e OP_ResetCount:
263a0 20 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   {.  sqlite3Vdbe
263b0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
263c0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 70 2d  ->nChange);.  p-
263d0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
263e0 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
263f0 6f 64 65 3a 20 53 6f 72 74 65 72 43 6f 6d 70 61  ode: SorterCompa
26400 72 65 20 50 31 20 50 32 20 50 33 20 50 34 0a 2a  re P1 P2 P3 P4.*
26410 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20 6b  * Synopsis: if k
26420 65 79 28 50 31 29 21 3d 74 72 69 6d 28 72 5b 50  ey(P1)!=trim(r[P
26430 33 5d 2c 50 34 29 20 67 6f 74 6f 20 50 32 0a 2a  3],P4) goto P2.*
26440 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 73 6f 72  *.** P1 is a sor
26450 74 65 72 20 63 75 72 73 6f 72 2e 20 54 68 69 73  ter cursor. This
26460 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 6f 6d   instruction com
26470 70 61 72 65 73 20 61 20 70 72 65 66 69 78 20 6f  pares a prefix o
26480 66 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  f the.** record 
26490 62 6c 6f 62 20 69 6e 20 72 65 67 69 73 74 65 72  blob in register
264a0 20 50 33 20 61 67 61 69 6e 73 74 20 61 20 70 72   P3 against a pr
264b0 65 66 69 78 20 6f 66 20 74 68 65 20 65 6e 74 72  efix of the entr
264c0 79 20 74 68 61 74 20 0a 2a 2a 20 74 68 65 20 73  y that .** the s
264d0 6f 72 74 65 72 20 63 75 72 73 6f 72 20 63 75 72  orter cursor cur
264e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
264f0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
26500 74 20 50 34 20 66 69 65 6c 64 73 0a 2a 2a 20 6f  t P4 fields.** o
26510 66 20 72 5b 50 33 5d 20 61 6e 64 20 74 68 65 20  f r[P3] and the 
26520 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 61 72  sorter record ar
26530 65 20 63 6f 6d 70 61 72 65 64 2e 0a 2a 2a 0a 2a  e compared..**.*
26540 2a 20 49 66 20 65 69 74 68 65 72 20 50 33 20 6f  * If either P3 o
26550 72 20 74 68 65 20 73 6f 72 74 65 72 20 63 6f 6e  r the sorter con
26560 74 61 69 6e 73 20 61 20 4e 55 4c 4c 20 69 6e 20  tains a NULL in 
26570 6f 6e 65 20 6f 66 20 74 68 65 69 72 20 73 69 67  one of their sig
26580 6e 69 66 69 63 61 6e 74 0a 2a 2a 20 66 69 65 6c  nificant.** fiel
26590 64 73 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ds (not counting
265a0 20 74 68 65 20 50 34 20 66 69 65 6c 64 73 20 61   the P4 fields a
265b0 74 20 74 68 65 20 65 6e 64 20 77 68 69 63 68 20  t the end which 
265c0 61 72 65 20 69 67 6e 6f 72 65 64 29 20 74 68 65  are ignored) the
265d0 6e 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  n.** the compari
265e0 73 6f 6e 20 69 73 20 61 73 73 75 6d 65 64 20 74  son is assumed t
265f0 6f 20 62 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a  o be equal..**.*
26600 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * Fall through t
26610 6f 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  o next instructi
26620 6f 6e 20 69 66 20 74 68 65 20 74 77 6f 20 72 65  on if the two re
26630 63 6f 72 64 73 20 63 6f 6d 70 61 72 65 20 65 71  cords compare eq
26640 75 61 6c 20 74 6f 0a 2a 2a 20 65 61 63 68 20 6f  ual to.** each o
26650 74 68 65 72 2e 20 20 4a 75 6d 70 20 74 6f 20 50  ther.  Jump to P
26660 32 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69  2 if they are di
26670 66 66 65 72 65 6e 74 2e 0a 2a 2f 0a 63 61 73 65  fferent..*/.case
26680 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72   OP_SorterCompar
26690 65 3a 20 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  e: {.  VdbeCurso
266a0 72 20 2a 70 43 3b 0a 20 20 69 6e 74 20 72 65 73  r *pC;.  int res
266b0 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b  ;.  int nKeyCol;
266c0 0a 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ..  pC = p->apCs
266d0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
266e0 73 65 72 74 28 20 69 73 53 6f 72 74 65 72 28 70  sert( isSorter(p
266f0 43 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C) );.  assert( 
26700 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
26710 49 4e 54 33 32 20 29 3b 0a 20 20 70 49 6e 33 20  INT32 );.  pIn3 
26720 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d  = &aMem[pOp->p3]
26730 3b 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 4f  ;.  nKeyCol = pO
26740 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 73 20 3d  p->p4.i;.  res =
26750 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
26760 65 33 56 64 62 65 53 6f 72 74 65 72 43 6f 6d 70  e3VdbeSorterComp
26770 61 72 65 28 70 43 2c 20 70 49 6e 33 2c 20 6e 4b  are(pC, pIn3, nK
26780 65 79 43 6f 6c 2c 20 26 72 65 73 29 3b 0a 20 20  eyCol, &res);.  
26790 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
267a0 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 69 66 28  res!=0,2);.  if(
267b0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
267c0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
267d0 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20   if( res ) goto 
267e0 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72  jump_to_p2;.  br
267f0 65 61 6b 3b 0a 7d 3b 0a 0a 2f 2a 20 4f 70 63 6f  eak;.};../* Opco
26800 64 65 3a 20 53 6f 72 74 65 72 44 61 74 61 20 50  de: SorterData P
26810 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
26820 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 64  ynopsis: r[P2]=d
26830 61 74 61 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ata.**.** Write 
26840 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  into register P2
26850 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 6f 72   the current sor
26860 74 65 72 20 64 61 74 61 20 66 6f 72 20 73 6f 72  ter data for sor
26870 74 65 72 20 63 75 72 73 6f 72 20 50 31 2e 0a 2a  ter cursor P1..*
26880 2a 20 54 68 65 6e 20 63 6c 65 61 72 20 74 68 65  * Then clear the
26890 20 63 6f 6c 75 6d 6e 20 68 65 61 64 65 72 20 63   column header c
268a0 61 63 68 65 20 6f 6e 20 63 75 72 73 6f 72 20 50  ache on cursor P
268b0 33 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  3..**.** This op
268c0 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
268d0 20 75 73 65 20 74 6f 20 6d 6f 76 65 20 61 20 72   use to move a r
268e0 65 63 6f 72 64 20 6f 75 74 20 6f 66 20 74 68 65  ecord out of the
268f0 20 73 6f 72 74 65 72 20 61 6e 64 20 69 6e 74 6f   sorter and into
26900 0a 2a 2a 20 61 20 72 65 67 69 73 74 65 72 20 74  .** a register t
26910 68 61 74 20 69 73 20 74 68 65 20 73 6f 75 72 63  hat is the sourc
26920 65 20 66 6f 72 20 61 20 70 73 65 75 64 6f 2d 74  e for a pseudo-t
26930 61 62 6c 65 20 63 75 72 73 6f 72 20 63 72 65 61  able cursor crea
26940 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 4f 70 65  ted using.** Ope
26950 6e 50 73 65 75 64 6f 2e 20 20 54 68 61 74 20 70  nPseudo.  That p
26960 73 65 75 64 6f 2d 74 61 62 6c 65 20 63 75 72 73  seudo-table curs
26970 6f 72 20 69 73 20 74 68 65 20 6f 6e 65 20 74 68  or is the one th
26980 61 74 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  at is identified
26990 20 62 79 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72   by.** parameter
269a0 20 50 33 2e 20 20 43 6c 65 61 72 69 6e 67 20 74   P3.  Clearing t
269b0 68 65 20 50 33 20 63 6f 6c 75 6d 6e 20 63 61 63  he P3 column cac
269c0 68 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  he as part of th
269d0 69 73 20 6f 70 63 6f 64 65 20 73 61 76 65 73 0a  is opcode saves.
269e0 2a 2a 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  ** us from havin
269f0 67 20 74 6f 20 69 73 73 75 65 20 61 20 73 65 70  g to issue a sep
26a00 61 72 61 74 65 20 4e 75 6c 6c 52 6f 77 20 69 6e  arate NullRow in
26a10 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 63 6c 65  struction to cle
26a20 61 72 20 74 68 61 74 20 63 61 63 68 65 2e 0a 2a  ar that cache..*
26a30 2f 0a 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72  /.case OP_Sorter
26a40 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65 43 75  Data: {.  VdbeCu
26a50 72 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 70 4f 75  rsor *pC;..  pOu
26a60 74 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  t = &aMem[pOp->p
26a70 32 5d 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70  2];.  pC = p->ap
26a80 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
26a90 61 73 73 65 72 74 28 20 69 73 53 6f 72 74 65 72  assert( isSorter
26aa0 28 70 43 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  (pC) );.  rc = s
26ab0 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
26ac0 52 6f 77 6b 65 79 28 70 43 2c 20 70 4f 75 74 29  Rowkey(pC, pOut)
26ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
26ae0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4f  SQLITE_OK || (pO
26af0 75 74 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ut->flags & MEM_
26b00 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
26b10 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
26b20 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72   pOp->p1<p->nCur
26b30 73 6f 72 20 29 3b 0a 20 20 69 66 28 20 72 63 20  sor );.  if( rc 
26b40 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
26b50 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 2d 3e  _to_error;.  p->
26b60 61 70 43 73 72 5b 70 4f 70 2d 3e 70 33 5d 2d 3e  apCsr[pOp->p3]->
26b70 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
26b80 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 62 72 65  CHE_STALE;.  bre
26b90 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65  ak;.}../* Opcode
26ba0 3a 20 52 6f 77 44 61 74 61 20 50 31 20 50 32 20  : RowData P1 P2 
26bb0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
26bc0 73 3a 20 72 5b 50 32 5d 3d 64 61 74 61 0a 2a 2a  s: r[P2]=data.**
26bd0 0a 2a 2a 20 57 72 69 74 65 20 69 6e 74 6f 20 72  .** Write into r
26be0 65 67 69 73 74 65 72 20 50 32 20 74 68 65 20 63  egister P2 the c
26bf0 6f 6d 70 6c 65 74 65 20 72 6f 77 20 63 6f 6e 74  omplete row cont
26c00 65 6e 74 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ent for the row 
26c10 61 74 20 0a 2a 2a 20 77 68 69 63 68 20 63 75 72  at .** which cur
26c20 73 6f 72 20 50 31 20 69 73 20 63 75 72 72 65 6e  sor P1 is curren
26c30 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
26c40 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69 6e 74   There is no int
26c50 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66 20 74  erpretation of t
26c60 68 65 20 64 61 74 61 2e 20 20 0a 2a 2a 20 49 74  he data.  .** It
26c70 20 69 73 20 6a 75 73 74 20 63 6f 70 69 65 64 20   is just copied 
26c80 6f 6e 74 6f 20 74 68 65 20 50 32 20 72 65 67 69  onto the P2 regi
26c90 73 74 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ster exactly as 
26ca0 0a 2a 2a 20 69 74 20 69 73 20 66 6f 75 6e 64 20  .** it is found 
26cb0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26cc0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  file..**.** If c
26cd0 75 72 73 6f 72 20 50 31 20 69 73 20 61 6e 20 69  ursor P1 is an i
26ce0 6e 64 65 78 2c 20 74 68 65 6e 20 74 68 65 20 63  ndex, then the c
26cf0 6f 6e 74 65 6e 74 20 69 73 20 74 68 65 20 6b 65  ontent is the ke
26d00 79 20 6f 66 20 74 68 65 20 72 6f 77 2e 0a 2a 2a  y of the row..**
26d10 20 49 66 20 63 75 72 73 6f 72 20 50 32 20 69 73   If cursor P2 is
26d20 20 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74   a table, then t
26d30 68 65 20 63 6f 6e 74 65 6e 74 20 65 78 74 72 61  he content extra
26d40 63 74 65 64 20 69 73 20 74 68 65 20 64 61 74 61  cted is the data
26d50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
26d60 31 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  1 cursor must be
26d70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
26d80 61 6c 69 64 20 72 6f 77 20 28 6e 6f 74 20 61 20  alid row (not a 
26d90 4e 55 4c 4c 20 72 6f 77 29 0a 2a 2a 20 6f 66 20  NULL row).** of 
26da0 61 20 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f  a real table, no
26db0 74 20 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  t a pseudo-table
26dc0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77  ..*/.case OP_Row
26dd0 44 61 74 61 3a 20 7b 0a 20 20 56 64 62 65 43 75  Data: {.  VdbeCu
26de0 72 73 6f 72 20 2a 70 43 3b 0a 20 20 42 74 43 75  rsor *pC;.  BtCu
26df0 72 73 6f 72 20 2a 70 43 72 73 72 3b 0a 20 20 75  rsor *pCrsr;.  u
26e00 33 32 20 6e 3b 0a 0a 20 20 70 4f 75 74 20 3d 20  32 n;..  pOut = 
26e10 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a  &aMem[pOp->p2];.
26e20 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43 68 61 6e    memAboutToChan
26e30 67 65 28 70 2c 20 70 4f 75 74 29 3b 0a 0a 20 20  ge(p, pOut);..  
26e40 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
26e50 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
26e60 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
26e70 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
26e80 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
26e90 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
26ea0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
26eb0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
26ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
26ed0 72 74 65 72 28 70 43 29 3d 3d 30 20 29 3b 0a 20  rter(pC)==0 );. 
26ee0 20 61 73 73 65 72 74 28 20 70 43 2d 3e 6e 75 6c   assert( pC->nul
26ef0 6c 52 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  lRow==0 );.  ass
26f00 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43 75 72  ert( pC->uc.pCur
26f10 73 6f 72 21 3d 30 20 29 3b 0a 20 20 70 43 72 73  sor!=0 );.  pCrs
26f20 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73  r = pC->uc.pCurs
26f30 6f 72 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 50  or;..  /* The OP
26f40 5f 52 6f 77 44 61 74 61 20 6f 70 63 6f 64 65 73  _RowData opcodes
26f50 20 61 6c 77 61 79 73 20 66 6f 6c 6c 6f 77 20 4f   always follow O
26f60 50 5f 4e 6f 74 45 78 69 73 74 73 20 6f 72 0a 20  P_NotExists or. 
26f70 20 2a 2a 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64   ** OP_SeekRowid
26f80 20 6f 72 20 4f 50 5f 52 65 77 69 6e 64 2f 4f 70   or OP_Rewind/Op
26f90 5f 4e 65 78 74 20 77 69 74 68 20 6e 6f 20 69 6e  _Next with no in
26fa0 74 65 72 76 65 6e 69 6e 67 20 69 6e 73 74 72 75  tervening instru
26fb0 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 74 68 61 74  ctions.  ** that
26fc0 20 6d 69 67 68 74 20 69 6e 76 61 6c 69 64 61 74   might invalidat
26fd0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20 20  e the cursor..  
26fe0 2a 2a 20 49 66 20 74 68 69 73 20 77 68 65 72 65  ** If this where
26ff0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 6f   not the case, o
27000 6e 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n of the followi
27010 6e 67 20 61 73 73 65 72 74 28 29 73 0a 20 20 2a  ng assert()s.  *
27020 2a 20 77 6f 75 6c 64 20 66 61 69 6c 2e 20 20 53  * would fail.  S
27030 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65 72 20  hould this ever 
27040 63 68 61 6e 67 65 20 28 62 65 63 61 75 73 65 20  change (because 
27050 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  of changes in th
27060 65 20 63 6f 64 65 0a 20 20 2a 2a 20 67 65 6e 65  e code.  ** gene
27070 72 61 74 6f 72 29 20 74 68 65 6e 20 74 68 65 20  rator) then the 
27080 66 69 78 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  fix would be to 
27090 69 6e 73 65 72 74 20 61 20 63 61 6c 6c 20 74 6f  insert a call to
270a0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  .  ** sqlite3Vdb
270b0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 29 2e  eCursorMoveto().
270c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
270d0 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
270e0 74 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  to==0 );.  asser
270f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
27100 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 72  ursorIsValid(pCr
27110 73 72 29 20 29 3b 0a 23 69 66 20 30 20 20 2f 2a  sr) );.#if 0  /*
27120 20 4e 6f 74 20 72 65 71 75 69 72 65 64 20 64 75   Not required du
27130 65 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  e to the previou
27140 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 73 74  s to assert() st
27150 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 72 63  atements */.  rc
27160 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
27170 72 73 6f 72 4d 6f 76 65 74 6f 28 70 43 29 3b 0a  rsorMoveto(pC);.
27180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27190 5f 4f 4b 20 29 20 67 6f 74 6f 20 61 62 6f 72 74  _OK ) goto abort
271a0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 23  _due_to_error;.#
271b0 65 6e 64 69 66 0a 0a 20 20 6e 20 3d 20 73 71 6c  endif..  n = sql
271c0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
271d0 53 69 7a 65 28 70 43 72 73 72 29 3b 0a 20 20 69  Size(pCrsr);.  i
271e0 66 28 20 6e 3e 28 75 33 32 29 64 62 2d 3e 61 4c  f( n>(u32)db->aL
271f0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
27200 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20  T_LENGTH] ){.   
27210 20 67 6f 74 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20   goto too_big;. 
27220 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
27230 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==0 );.  if( sql
27240 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
27250 41 6e 64 52 65 73 69 7a 65 28 70 4f 75 74 2c 20  AndResize(pOut, 
27260 4d 41 58 28 6e 2c 33 32 29 29 20 29 7b 0a 20 20  MAX(n,32)) ){.  
27270 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
27280 20 7d 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 6e   }.  pOut->n = n
27290 3b 0a 20 20 4d 65 6d 53 65 74 54 79 70 65 46 6c  ;.  MemSetTypeFl
272a0 61 67 28 70 4f 75 74 2c 20 4d 45 4d 5f 42 6c 6f  ag(pOut, MEM_Blo
272b0 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
272c0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70  e3BtreePayload(p
272d0 43 72 73 72 2c 20 30 2c 20 6e 2c 20 70 4f 75 74  Crsr, 0, n, pOut
272e0 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ->z);.  if( rc )
272f0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
27300 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 70 4f 75 74  to_error;.  pOut
27310 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
27320 54 46 38 3b 20 20 2f 2a 20 49 6e 20 63 61 73 65  TF8;  /* In case
27330 20 74 68 65 20 62 6c 6f 62 20 69 73 20 65 76 65   the blob is eve
27340 72 20 63 61 73 74 20 74 6f 20 74 65 78 74 20 2a  r cast to text *
27350 2f 0a 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42  /.  UPDATE_MAX_B
27360 4c 4f 42 53 49 5a 45 28 70 4f 75 74 29 3b 0a 20  LOBSIZE(pOut);. 
27370 20 52 45 47 49 53 54 45 52 5f 54 52 41 43 45 28   REGISTER_TRACE(
27380 70 4f 70 2d 3e 70 32 2c 20 70 4f 75 74 29 3b 0a  pOp->p2, pOut);.
27390 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
273a0 70 63 6f 64 65 3a 20 52 6f 77 69 64 20 50 31 20  pcode: Rowid P1 
273b0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f  P2 * * *.** Syno
273c0 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f 77 69  psis: r[P2]=rowi
273d0 64 0a 2a 2a 0a 2a 2a 20 53 74 6f 72 65 20 69 6e  d.**.** Store in
273e0 20 72 65 67 69 73 74 65 72 20 50 32 20 61 6e 20   register P2 an 
273f0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
27400 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
27410 74 61 62 6c 65 20 65 6e 74 72 79 20 74 68 61 74  table entry that
27420 0a 2a 2a 20 50 31 20 69 73 20 63 75 72 72 65 6e  .** P1 is curren
27430 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2e 0a 2a 2a  tly point to..**
27440 0a 2a 2a 20 50 31 20 63 61 6e 20 62 65 20 65 69  .** P1 can be ei
27450 74 68 65 72 20 61 6e 20 6f 72 64 69 6e 61 72 79  ther an ordinary
27460 20 74 61 62 6c 65 20 6f 72 20 61 20 76 69 72 74   table or a virt
27470 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 72  ual table.  Ther
27480 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 62 65 20  e used to.** be 
27490 61 20 73 65 70 61 72 61 74 65 20 4f 50 5f 56 52  a separate OP_VR
274a0 6f 77 69 64 20 6f 70 63 6f 64 65 20 66 6f 72 20  owid opcode for 
274b0 75 73 65 20 77 69 74 68 20 76 69 72 74 75 61 6c  use with virtual
274c0 20 74 61 62 6c 65 73 2c 20 62 75 74 20 74 68 69   tables, but thi
274d0 73 0a 2a 2a 20 6f 6e 65 20 6f 70 63 6f 64 65 20  s.** one opcode 
274e0 6e 6f 77 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  now works for bo
274f0 74 68 20 74 61 62 6c 65 20 74 79 70 65 73 2e 0a  th table types..
27500 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 69 64  */.case OP_Rowid
27510 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  : {             
27520 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20      /* out2 */. 
27530 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b   VdbeCursor *pC;
27540 0a 20 20 69 36 34 20 76 3b 0a 20 20 73 71 6c 69  .  i64 v;.  sqli
27550 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b  te3_vtab *pVtab;
27560 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
27570 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
27580 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32  ;..  pOut = out2
27590 50 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f  Prerelease(p, pO
275a0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  p);.  assert( pO
275b0 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d  p->p1>=0 && pOp-
275c0 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29  >p1<p->nCursor )
275d0 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73  ;.  pC = p->apCs
275e0 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73  r[pOp->p1];.  as
275f0 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20  sert( pC!=0 );. 
27600 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
27610 72 54 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50  rType!=CURTYPE_P
27620 53 45 55 44 4f 20 7c 7c 20 70 43 2d 3e 6e 75 6c  SEUDO || pC->nul
27630 6c 52 6f 77 20 29 3b 0a 20 20 69 66 28 20 70 43  lRow );.  if( pC
27640 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20  ->nullRow ){.   
27650 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d   pOut->flags = M
27660 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 62 72 65  EM_Null;.    bre
27670 61 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ak;.  }else if( 
27680 70 43 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65  pC->deferredMove
27690 74 6f 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 43  to ){.    v = pC
276a0 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a  ->movetoTarget;.
276b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
276c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
276d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 2d  .  }else if( pC-
276e0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
276f0 50 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 61  PE_VTAB ){.    a
27700 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 56  ssert( pC->uc.pV
27710 43 75 72 21 3d 30 20 29 3b 0a 20 20 20 20 70 56  Cur!=0 );.    pV
27720 74 61 62 20 3d 20 70 43 2d 3e 75 63 2e 70 56 43  tab = pC->uc.pVC
27730 75 72 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 70  ur->pVtab;.    p
27740 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e  Module = pVtab->
27750 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
27760 65 72 74 28 20 70 4d 6f 64 75 6c 65 2d 3e 78 52  ert( pModule->xR
27770 6f 77 69 64 20 29 3b 0a 20 20 20 20 72 63 20 3d  owid );.    rc =
27780 20 70 4d 6f 64 75 6c 65 2d 3e 78 52 6f 77 69 64   pModule->xRowid
27790 28 70 43 2d 3e 75 63 2e 70 56 43 75 72 2c 20 26  (pC->uc.pVCur, &
277a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
277b0 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
277c0 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 69  p, pVtab);.    i
277d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f  f( rc ) goto abo
277e0 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b  rt_due_to_error;
277f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
27800 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27810 42 4c 45 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  BLE */.  }else{.
27820 20 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e      assert( pC->
27830 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
27840 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61  E_BTREE );.    a
27850 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70 43  ssert( pC->uc.pC
27860 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
27870 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
27880 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 43  CursorRestore(pC
27890 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
278a0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
278b0 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69 66 28  o_error;.    if(
278c0 20 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 29 7b 0a   pC->nullRow ){.
278d0 20 20 20 20 20 20 70 4f 75 74 2d 3e 66 6c 61 67        pOut->flag
278e0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
278f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27900 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
27910 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
27920 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b  pC->uc.pCursor);
27930 0a 20 20 7d 0a 20 20 70 4f 75 74 2d 3e 75 2e 69  .  }.  pOut->u.i
27940 20 3d 20 76 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d   = v;.  break;.}
27950 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4e 75 6c  ../* Opcode: Nul
27960 6c 52 6f 77 20 50 31 20 2a 20 2a 20 2a 20 2a 0a  lRow P1 * * * *.
27970 2a 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  **.** Move the c
27980 75 72 73 6f 72 20 50 31 20 74 6f 20 61 20 6e 75  ursor P1 to a nu
27990 6c 6c 20 72 6f 77 2e 20 20 41 6e 79 20 4f 50 5f  ll row.  Any OP_
279a0 43 6f 6c 75 6d 6e 20 6f 70 65 72 61 74 69 6f 6e  Column operation
279b0 73 0a 2a 2a 20 74 68 61 74 20 6f 63 63 75 72 20  s.** that occur 
279c0 77 68 69 6c 65 20 74 68 65 20 63 75 72 73 6f 72  while the cursor
279d0 20 69 73 20 6f 6e 20 74 68 65 20 6e 75 6c 6c 20   is on the null 
279e0 72 6f 77 20 77 69 6c 6c 20 61 6c 77 61 79 73 0a  row will always.
279f0 2a 2a 20 77 72 69 74 65 20 61 20 4e 55 4c 4c 2e  ** write a NULL.
27a00 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4e 75 6c 6c  .*/.case OP_Null
27a10 52 6f 77 3a 20 7b 0a 20 20 56 64 62 65 43 75 72  Row: {.  VdbeCur
27a20 73 6f 72 20 2a 70 43 3b 0a 0a 20 20 61 73 73 65  sor *pC;..  asse
27a30 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
27a40 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
27a50 72 73 6f 72 20 29 3b 0a 20 20 70 43 20 3d 20 70  rsor );.  pC = p
27a60 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
27a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 21 3d  ;.  assert( pC!=
27a80 30 20 29 3b 0a 20 20 70 43 2d 3e 6e 75 6c 6c 52  0 );.  pC->nullR
27a90 6f 77 20 3d 20 31 3b 0a 20 20 70 43 2d 3e 63 61  ow = 1;.  pC->ca
27aa0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
27ab0 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 70  E_STALE;.  if( p
27ac0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
27ad0 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20  TYPE_BTREE ){.  
27ae0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63    assert( pC->uc
27af0 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
27b00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
27b10 6c 65 61 72 43 75 72 73 6f 72 28 70 43 2d 3e 75  learCursor(pC->u
27b20 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  c.pCursor);.  }.
27b30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
27b40 70 63 6f 64 65 3a 20 4c 61 73 74 20 50 31 20 50  pcode: Last P1 P
27b50 32 20 50 33 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 54  2 P3 * *.**.** T
27b60 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20 74  he next use of t
27b70 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c 75  he Rowid or Colu
27b80 6d 6e 20 6f 72 20 50 72 65 76 20 69 6e 73 74 72  mn or Prev instr
27b90 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a 2a  uction for P1 .*
27ba0 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f 20  * will refer to 
27bb0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27bc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
27bd0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
27be0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6f  * If the table o
27bf0 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79  r index is empty
27c00 20 61 6e 64 20 50 32 3e 30 2c 20 74 68 65 6e 20   and P2>0, then 
27c10 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79  jump immediately
27c20 20 74 6f 20 50 32 2e 0a 2a 2a 20 49 66 20 50 32   to P2..** If P2
27c30 20 69 73 20 30 20 6f 72 20 69 66 20 74 68 65 20   is 0 or if the 
27c40 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
27c50 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 66 61 6c  s not empty, fal
27c60 6c 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 6f 20  l through.** to 
27c70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
27c80 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
27c90 20 54 68 69 73 20 6f 70 63 6f 64 65 20 6c 65 61   This opcode lea
27ca0 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 63  ves the cursor c
27cb0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 6d 6f 76  onfigured to mov
27cc0 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  e in reverse ord
27cd0 65 72 2c 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  er,.** from the 
27ce0 65 6e 64 20 74 6f 77 61 72 64 20 74 68 65 20 62  end toward the b
27cf0 65 67 69 6e 6e 69 6e 67 2e 20 20 49 6e 20 6f 74  eginning.  In ot
27d00 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
27d10 75 72 73 6f 72 20 69 73 0a 2a 2a 20 63 6f 6e 66  ursor is.** conf
27d20 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 50 72  igured to use Pr
27d30 65 76 2c 20 6e 6f 74 20 4e 65 78 74 2e 0a 2a 2a  ev, not Next..**
27d40 0a 2a 2a 20 49 66 20 50 33 20 69 73 20 2d 31 2c  .** If P3 is -1,
27d50 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
27d60 20 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 61   is positioned a
27d70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
27d80 20 62 74 72 65 65 0a 2a 2a 20 66 6f 72 20 74 68   btree.** for th
27d90 65 20 70 75 72 70 6f 73 65 20 6f 66 20 61 70 70  e purpose of app
27da0 65 6e 64 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  ending a new ent
27db0 72 79 20 6f 6e 74 6f 20 74 68 65 20 62 74 72 65  ry onto the btre
27dc0 65 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63  e.  In that.** c
27dd0 61 73 65 20 50 32 20 6d 75 73 74 20 62 65 20 30  ase P2 must be 0
27de0 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
27df0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
27e00 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f   is used only fo
27e10 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 61  r.** appending a
27e20 6e 64 20 73 6f 20 69 66 20 74 68 65 20 63 75 72  nd so if the cur
27e30 73 6f 72 20 69 73 20 76 61 6c 69 64 2c 20 74 68  sor is valid, th
27e40 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75  en the cursor mu
27e50 73 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  st already.** be
27e60 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
27e70 20 65 6e 64 20 6f 66 20 74 68 65 20 62 74 72 65   end of the btre
27e80 65 20 61 6e 64 20 73 6f 20 6e 6f 20 63 68 61 6e  e and so no chan
27e90 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 0a  ges are made to.
27ea0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  ** the cursor..*
27eb0 2f 0a 63 61 73 65 20 4f 50 5f 4c 61 73 74 3a 20  /.case OP_Last: 
27ec0 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  {        /* jump
27ed0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
27ee0 20 2a 70 43 3b 0a 20 20 42 74 43 75 72 73 6f 72   *pC;.  BtCursor
27ef0 20 2a 70 43 72 73 72 3b 0a 20 20 69 6e 74 20 72   *pCrsr;.  int r
27f00 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  es;..  assert( p
27f10 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
27f20 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
27f30 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
27f40 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
27f50 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
27f60 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
27f70 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
27f80 42 54 52 45 45 20 29 3b 0a 20 20 70 43 72 73 72  BTREE );.  pCrsr
27f90 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
27fa0 72 3b 0a 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  r;.  res = 0;.  
27fb0 61 73 73 65 72 74 28 20 70 43 72 73 72 21 3d 30  assert( pCrsr!=0
27fc0 20 29 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65   );.  pC->seekRe
27fd0 73 75 6c 74 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a  sult = pOp->p3;.
27fe0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
27ff0 42 55 47 0a 20 20 70 43 2d 3e 73 65 65 6b 4f 70  BUG.  pC->seekOp
28000 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 23 65 6e 64   = OP_Last;.#end
28010 69 66 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  if.  if( pOp->p3
28020 3d 3d 30 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  ==0 || !sqlite3B
28030 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
28040 64 4e 4e 28 70 43 72 73 72 29 20 29 7b 0a 20 20  dNN(pCrsr) ){.  
28050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
28060 72 65 65 4c 61 73 74 28 70 43 72 73 72 2c 20 26  reeLast(pCrsr, &
28070 72 65 73 29 3b 0a 20 20 20 20 70 43 2d 3e 6e 75  res);.    pC->nu
28080 6c 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b  llRow = (u8)res;
28090 0a 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65  .    pC->deferre
280a0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20  dMoveto = 0;.   
280b0 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73   pC->cacheStatus
280c0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
280d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
280e0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
280f0 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 4f  rror;.    if( pO
28100 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20  p->p2>0 ){.     
28110 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e   VdbeBranchTaken
28120 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20 20 20  (res!=0,2);.    
28130 20 20 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f    if( res ) goto
28140 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 20   jump_to_p2;.   
28150 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
28160 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
28170 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 62 72 65 61  =0 );.  }.  brea
28180 6b 3b 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65  k;.}.../* Opcode
28190 3a 20 53 6f 72 74 65 72 53 6f 72 74 20 50 31 20  : SorterSort P1 
281a0 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 41  P2 * * *.**.** A
281b0 66 74 65 72 20 61 6c 6c 20 72 65 63 6f 72 64 73  fter all records
281c0 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
281d0 74 65 64 20 69 6e 74 6f 20 74 68 65 20 53 6f 72  ted into the Sor
281e0 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 69 64  ter object.** id
281f0 65 6e 74 69 66 69 65 64 20 62 79 20 50 31 2c 20  entified by P1, 
28200 69 6e 76 6f 6b 65 20 74 68 69 73 20 6f 70 63 6f  invoke this opco
28210 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 64  de to actually d
28220 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 0a 2a  o the sorting..*
28230 2a 20 4a 75 6d 70 20 74 6f 20 50 32 20 69 66 20  * Jump to P2 if 
28240 74 68 65 72 65 20 61 72 65 20 6e 6f 20 72 65 63  there are no rec
28250 6f 72 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  ords to be sorte
28260 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  d..**.** This op
28270 63 6f 64 65 20 69 73 20 61 6e 20 61 6c 69 61 73  code is an alias
28280 20 66 6f 72 20 4f 50 5f 53 6f 72 74 20 61 6e 64   for OP_Sort and
28290 20 4f 50 5f 52 65 77 69 6e 64 20 74 68 61 74 20   OP_Rewind that 
282a0 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 53  is used.** for S
282b0 6f 72 74 65 72 20 6f 62 6a 65 63 74 73 2e 0a 2a  orter objects..*
282c0 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53 6f 72  /./* Opcode: Sor
282d0 74 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a  t P1 P2 * * *.**
282e0 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20  .** This opcode 
282f0 64 6f 65 73 20 65 78 61 63 74 6c 79 20 74 68 65  does exactly the
28300 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 4f   same thing as O
28310 50 5f 52 65 77 69 6e 64 20 65 78 63 65 70 74 20  P_Rewind except 
28320 74 68 61 74 0a 2a 2a 20 69 74 20 69 6e 63 72 65  that.** it incre
28330 6d 65 6e 74 73 20 61 6e 20 75 6e 64 6f 63 75 6d  ments an undocum
28340 65 6e 74 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ented global var
28350 69 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 74  iable used for t
28360 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 6f  esting..**.** So
28370 72 74 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c  rting is accompl
28380 69 73 68 65 64 20 62 79 20 77 72 69 74 69 6e 67  ished by writing
28390 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 20   records into a 
283a0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 0a 2a  sorting index,.*
283b0 2a 20 74 68 65 6e 20 72 65 77 69 6e 64 69 6e 67  * then rewinding
283c0 20 74 68 61 74 20 69 6e 64 65 78 20 61 6e 64 20   that index and 
283d0 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 20  playing it back 
283e0 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 74  from beginning t
283f0 6f 0a 2a 2a 20 65 6e 64 2e 20 20 57 65 20 75 73  o.** end.  We us
28400 65 20 74 68 65 20 4f 50 5f 53 6f 72 74 20 6f 70  e the OP_Sort op
28410 63 6f 64 65 20 69 6e 73 74 65 61 64 20 6f 66 20  code instead of 
28420 4f 50 5f 52 65 77 69 6e 64 20 74 6f 20 64 6f 20  OP_Rewind to do 
28430 74 68 65 0a 2a 2a 20 72 65 77 69 6e 64 69 6e 67  the.** rewinding
28440 20 73 6f 20 74 68 61 74 20 74 68 65 20 67 6c 6f   so that the glo
28450 62 61 6c 20 76 61 72 69 61 62 6c 65 20 77 69 6c  bal variable wil
28460 6c 20 62 65 20 69 6e 63 72 65 6d 65 6e 74 65 64  l be incremented
28470 20 61 6e 64 0a 2a 2a 20 72 65 67 72 65 73 73 69   and.** regressi
28480 6f 6e 20 74 65 73 74 73 20 63 61 6e 20 64 65 74  on tests can det
28490 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
284a0 72 20 6e 6f 74 20 74 68 65 20 6f 70 74 69 6d 69  r not the optimi
284b0 7a 65 72 20 69 73 0a 2a 2a 20 63 6f 72 72 65 63  zer is.** correc
284c0 74 6c 79 20 6f 70 74 69 6d 69 7a 69 6e 67 20 6f  tly optimizing o
284d0 75 74 20 73 6f 72 74 73 2e 0a 2a 2f 0a 63 61 73  ut sorts..*/.cas
284e0 65 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 3a  e OP_SorterSort:
284f0 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63      /* jump */.c
28500 61 73 65 20 4f 50 5f 53 6f 72 74 3a 20 7b 20 20  ase OP_Sort: {  
28510 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f        /* jump */
28520 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28530 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f  EST.  sqlite3_so
28540 72 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71  rt_count++;.  sq
28550 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
28560 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt--;.#endif.  p
28570 2d 3e 61 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54  ->aCounter[SQLIT
28580 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52  E_STMTSTATUS_SOR
28590 54 5d 2b 2b 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20  T]++;.  /* Fall 
285a0 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f  through into OP_
285b0 52 65 77 69 6e 64 20 2a 2f 0a 7d 0a 2f 2a 20 4f  Rewind */.}./* O
285c0 70 63 6f 64 65 3a 20 52 65 77 69 6e 64 20 50 31  pcode: Rewind P1
285d0 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20   P2 * * *.**.** 
285e0 54 68 65 20 6e 65 78 74 20 75 73 65 20 6f 66 20  The next use of 
285f0 74 68 65 20 52 6f 77 69 64 20 6f 72 20 43 6f 6c  the Rowid or Col
28600 75 6d 6e 20 6f 72 20 4e 65 78 74 20 69 6e 73 74  umn or Next inst
28610 72 75 63 74 69 6f 6e 20 66 6f 72 20 50 31 20 0a  ruction for P1 .
28620 2a 2a 20 77 69 6c 6c 20 72 65 66 65 72 20 74 6f  ** will refer to
28630 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
28640 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28650 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
28660 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
28670 20 6f 72 20 69 6e 64 65 78 20 69 73 20 65 6d 70   or index is emp
28680 74 79 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ty, jump immedia
28690 74 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 20 49  tely to P2..** I
286a0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
286b0 6e 64 65 78 20 69 73 20 6e 6f 74 20 65 6d 70 74  ndex is not empt
286c0 79 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  y, fall through 
286d0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
286e0 20 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e   .** instruction
286f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63  ..**.** This opc
28700 6f 64 65 20 6c 65 61 76 65 73 20 74 68 65 20 63  ode leaves the c
28710 75 72 73 6f 72 20 63 6f 6e 66 69 67 75 72 65 64  ursor configured
28720 20 74 6f 20 6d 6f 76 65 20 69 6e 20 66 6f 72 77   to move in forw
28730 61 72 64 20 6f 72 64 65 72 2c 0a 2a 2a 20 66 72  ard order,.** fr
28740 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
28750 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 2e   toward the end.
28760 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
28770 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 0a  , the cursor is.
28780 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  ** configured to
28790 20 75 73 65 20 4e 65 78 74 2c 20 6e 6f 74 20 50   use Next, not P
287a0 72 65 76 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  rev..*/.case OP_
287b0 52 65 77 69 6e 64 3a 20 7b 20 20 20 20 20 20 20  Rewind: {       
287c0 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56 64   /* jump */.  Vd
287d0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
287e0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
287f0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
28800 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
28810 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e  0 && pOp->p1<p->
28820 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43 20  nCursor );.  pC 
28830 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e  = p->apCsr[pOp->
28840 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
28850 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  C!=0 );.  assert
28860 28 20 69 73 53 6f 72 74 65 72 28 70 43 29 3d 3d  ( isSorter(pC)==
28870 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  (pOp->opcode==OP
28880 5f 53 6f 72 74 65 72 53 6f 72 74 29 20 29 3b 0a  _SorterSort) );.
28890 20 20 72 65 73 20 3d 20 31 3b 0a 23 69 66 64 65    res = 1;.#ifde
288a0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
288b0 20 70 43 2d 3e 73 65 65 6b 4f 70 20 3d 20 4f 50   pC->seekOp = OP
288c0 5f 52 65 77 69 6e 64 3b 0a 23 65 6e 64 69 66 0a  _Rewind;.#endif.
288d0 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
288e0 43 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  C) ){.    rc = s
288f0 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
28900 52 65 77 69 6e 64 28 70 43 2c 20 26 72 65 73 29  Rewind(pC, &res)
28910 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28920 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
28930 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
28940 45 45 20 29 3b 0a 20 20 20 20 70 43 72 73 72 20  EE );.    pCrsr 
28950 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
28960 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
28970 72 73 72 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rsr );.    rc = 
28980 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
28990 74 28 70 43 72 73 72 2c 20 26 72 65 73 29 3b 0a  t(pCrsr, &res);.
289a0 20 20 20 20 70 43 2d 3e 64 65 66 65 72 72 65 64      pC->deferred
289b0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
289c0 70 43 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20  pC->cacheStatus 
289d0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
289e0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f   }.  if( rc ) go
289f0 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
28a00 65 72 72 6f 72 3b 0a 20 20 70 43 2d 3e 6e 75 6c  error;.  pC->nul
28a10 6c 52 6f 77 20 3d 20 28 75 38 29 72 65 73 3b 0a  lRow = (u8)res;.
28a20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
28a30 32 3e 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 70  2>0 && pOp->p2<p
28a40 2d 3e 6e 4f 70 20 29 3b 0a 20 20 56 64 62 65 42  ->nOp );.  VdbeB
28a50 72 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 21 3d  ranchTaken(res!=
28a60 30 2c 32 29 3b 0a 20 20 69 66 28 20 72 65 73 20  0,2);.  if( res 
28a70 29 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70  ) goto jump_to_p
28a80 32 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f  2;.  break;.}../
28a90 2a 20 4f 70 63 6f 64 65 3a 20 4e 65 78 74 20 50  * Opcode: Next P
28aa0 31 20 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a  1 P2 P3 P4 P5.**
28ab0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 63 75 72 73  .** Advance curs
28ac0 6f 72 20 50 31 20 73 6f 20 74 68 61 74 20 69 74  or P1 so that it
28ad0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
28ae0 65 78 74 20 6b 65 79 2f 64 61 74 61 20 70 61 69  ext key/data pai
28af0 72 20 69 6e 20 69 74 73 0a 2a 2a 20 74 61 62 6c  r in its.** tabl
28b00 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 49 66 20  e or index.  If 
28b10 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
28b20 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  e key/value pair
28b30 73 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  s then fall thro
28b40 75 67 68 0a 2a 2a 20 74 6f 20 74 68 65 20 66 6f  ugh.** to the fo
28b50 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 72 75 63 74  llowing instruct
28b60 69 6f 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  ion.  But if the
28b70 20 63 75 72 73 6f 72 20 61 64 76 61 6e 63 65 20   cursor advance 
28b80 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 0a  was successful,.
28b90 2a 2a 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  ** jump immediat
28ba0 65 6c 79 20 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a  ely to P2..**.**
28bb0 20 54 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65   The Next opcode
28bc0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
28bd0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 53 65 65 6b  ollowing an Seek
28be0 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 0a 2a  GT, SeekGE, or.*
28bf0 2a 20 4f 50 5f 52 65 77 69 6e 64 20 6f 70 63 6f  * OP_Rewind opco
28c00 64 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  de used to posit
28c10 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ion the cursor. 
28c20 20 4e 65 78 74 20 69 73 20 6e 6f 74 20 61 6c 6c   Next is not all
28c30 6f 77 65 64 0a 2a 2a 20 74 6f 20 66 6f 6c 6c 6f  owed.** to follo
28c40 77 20 53 65 65 6b 4c 54 2c 20 53 65 65 6b 4c 45  w SeekLT, SeekLE
28c50 2c 20 6f 72 20 4f 50 5f 4c 61 73 74 2e 0a 2a 2a  , or OP_Last..**
28c60 0a 2a 2a 20 54 68 65 20 50 31 20 63 75 72 73 6f  .** The P1 curso
28c70 72 20 6d 75 73 74 20 62 65 20 66 6f 72 20 61 20  r must be for a 
28c80 72 65 61 6c 20 74 61 62 6c 65 2c 20 6e 6f 74 20  real table, not 
28c90 61 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20  a pseudo-table. 
28ca0 20 50 31 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a   P1 must have.**
28cb0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 70 72 69   been opened pri
28cc0 6f 72 20 74 6f 20 74 68 69 73 20 6f 70 63 6f 64  or to this opcod
28cd0 65 20 6f 72 20 74 68 65 20 70 72 6f 67 72 61 6d  e or the program
28ce0 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
28cf0 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76 61 6c  **.** The P3 val
28d00 75 65 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  ue is a hint to 
28d10 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  the btree implem
28d20 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50 33 3d  entation. If P3=
28d30 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  =1, that.** mean
28d40 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c 20 69  s P1 is an SQL i
28d50 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20 74 68  ndex and that th
28d60 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  is instruction c
28d70 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
28d80 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 61  * omitted if tha
28d90 74 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  t index had been
28da0 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69 73 20   unique.  P3 is 
28db0 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33 20 69  usually 0.  P3 i
28dc0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69 74 68  s.** always eith
28dd0 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a 2a 2a  er 0 or 1..**.**
28de0 20 50 34 20 69 73 20 61 6c 77 61 79 73 20 6f 66   P4 is always of
28df0 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e 43 45   type P4_ADVANCE
28e00 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  . The function p
28e10 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  ointer points to
28e20 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
28e30 4e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Next()..**.** If
28e40 20 50 35 20 69 73 20 70 6f 73 69 74 69 76 65 20   P5 is positive 
28e50 61 6e 64 20 74 68 65 20 6a 75 6d 70 20 69 73 20  and the jump is 
28e60 74 61 6b 65 6e 2c 20 74 68 65 6e 20 65 76 65 6e  taken, then even
28e70 74 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 6e 75 6d  t counter.** num
28e80 62 65 72 20 50 35 2d 31 20 69 6e 20 74 68 65 20  ber P5-1 in the 
28e90 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
28ea0 6e 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  nt is incremente
28eb0 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  d..**.** See als
28ec0 6f 3a 20 50 72 65 76 2c 20 4e 65 78 74 49 66 4f  o: Prev, NextIfO
28ed0 70 65 6e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  pen.*/./* Opcode
28ee0 3a 20 4e 65 78 74 49 66 4f 70 65 6e 20 50 31 20  : NextIfOpen P1 
28ef0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
28f00 2a 20 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f  * This opcode wo
28f10 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 4e 65  rks just like Ne
28f20 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20 69  xt except that i
28f30 66 20 63 75 72 73 6f 72 20 50 31 20 69 73 20 6e  f cursor P1 is n
28f40 6f 74 0a 2a 2a 20 6f 70 65 6e 20 69 74 20 62 65  ot.** open it be
28f50 68 61 76 65 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  haves a no-op..*
28f60 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50 72 65  /./* Opcode: Pre
28f70 76 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  v P1 P2 P3 P4 P5
28f80 0a 2a 2a 0a 2a 2a 20 42 61 63 6b 20 75 70 20 63  .**.** Back up c
28f90 75 72 73 6f 72 20 50 31 20 73 6f 20 74 68 61 74  ursor P1 so that
28fa0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
28fb0 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f 64  e previous key/d
28fc0 61 74 61 20 70 61 69 72 20 69 6e 20 69 74 73 0a  ata pair in its.
28fd0 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ** table or inde
28fe0 78 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  x.  If there is 
28ff0 6e 6f 20 70 72 65 76 69 6f 75 73 20 6b 65 79 2f  no previous key/
29000 76 61 6c 75 65 20 70 61 69 72 73 20 74 68 65 6e  value pairs then
29010 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 2a 2a   fall through.**
29020 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
29030 67 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  g instruction.  
29040 42 75 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  But if the curso
29050 72 20 62 61 63 6b 75 70 20 77 61 73 20 73 75 63  r backup was suc
29060 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 6a 75 6d 70  cessful,.** jump
29070 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
29080 50 32 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  P2..**.**.** The
29090 20 50 72 65 76 20 6f 70 63 6f 64 65 20 69 73 20   Prev opcode is 
290a0 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 6c 6c 6f  only valid follo
290b0 77 69 6e 67 20 61 6e 20 53 65 65 6b 4c 54 2c 20  wing an SeekLT, 
290c0 53 65 65 6b 4c 45 2c 20 6f 72 0a 2a 2a 20 4f 50  SeekLE, or.** OP
290d0 5f 4c 61 73 74 20 6f 70 63 6f 64 65 20 75 73 65  _Last opcode use
290e0 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
290f0 65 20 63 75 72 73 6f 72 2e 20 20 50 72 65 76 20  e cursor.  Prev 
29100 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 2a  is not allowed.*
29110 2a 20 74 6f 20 66 6f 6c 6c 6f 77 20 53 65 65 6b  * to follow Seek
29120 47 54 2c 20 53 65 65 6b 47 45 2c 20 6f 72 20 4f  GT, SeekGE, or O
29130 50 5f 52 65 77 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  P_Rewind..**.** 
29140 54 68 65 20 50 31 20 63 75 72 73 6f 72 20 6d 75  The P1 cursor mu
29150 73 74 20 62 65 20 66 6f 72 20 61 20 72 65 61 6c  st be for a real
29160 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 70 73   table, not a ps
29170 65 75 64 6f 2d 74 61 62 6c 65 2e 20 20 49 66 20  eudo-table.  If 
29180 50 31 20 69 73 0a 2a 2a 20 6e 6f 74 20 6f 70 65  P1 is.** not ope
29190 6e 20 74 68 65 6e 20 74 68 65 20 62 65 68 61 76  n then the behav
291a0 69 6f 72 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ior is undefined
291b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 33 20 76  ..**.** The P3 v
291c0 61 6c 75 65 20 69 73 20 61 20 68 69 6e 74 20 74  alue is a hint t
291d0 6f 20 74 68 65 20 62 74 72 65 65 20 69 6d 70 6c  o the btree impl
291e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 49 66 20 50  ementation. If P
291f0 33 3d 3d 31 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  3==1, that.** me
29200 61 6e 73 20 50 31 20 69 73 20 61 6e 20 53 51 4c  ans P1 is an SQL
29210 20 69 6e 64 65 78 20 61 6e 64 20 74 68 61 74 20   index and that 
29220 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
29230 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
29240 0a 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74  .** omitted if t
29250 68 61 74 20 69 6e 64 65 78 20 68 61 64 20 62 65  hat index had be
29260 65 6e 20 75 6e 69 71 75 65 2e 20 20 50 33 20 69  en unique.  P3 i
29270 73 20 75 73 75 61 6c 6c 79 20 30 2e 20 20 50 33  s usually 0.  P3
29280 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 65 69   is.** always ei
29290 74 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2a 0a  ther 0 or 1..**.
292a0 2a 2a 20 50 34 20 69 73 20 61 6c 77 61 79 73 20  ** P4 is always 
292b0 6f 66 20 74 79 70 65 20 50 34 5f 41 44 56 41 4e  of type P4_ADVAN
292c0 43 45 2e 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  CE. The function
292d0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
292e0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
292f0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 0a 2a 2a  eePrevious()..**
29300 0a 2a 2a 20 49 66 20 50 35 20 69 73 20 70 6f 73  .** If P5 is pos
29310 69 74 69 76 65 20 61 6e 64 20 74 68 65 20 6a 75  itive and the ju
29320 6d 70 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  mp is taken, the
29330 6e 20 65 76 65 6e 74 20 63 6f 75 6e 74 65 72 0a  n event counter.
29340 2a 2a 20 6e 75 6d 62 65 72 20 50 35 2d 31 20 69  ** number P5-1 i
29350 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
29360 74 61 74 65 6d 65 6e 74 20 69 73 20 69 6e 63 72  tatement is incr
29370 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 2f 2a 20 4f  emented..*/./* O
29380 70 63 6f 64 65 3a 20 50 72 65 76 49 66 4f 70 65  pcode: PrevIfOpe
29390 6e 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  n P1 P2 P3 P4 P5
293a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
293b0 64 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  de works just li
293c0 6b 65 20 50 72 65 76 20 65 78 63 65 70 74 20 74  ke Prev except t
293d0 68 61 74 20 69 66 20 63 75 72 73 6f 72 20 50 31  hat if cursor P1
293e0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6f 70 65 6e 20   is not.** open 
293f0 69 74 20 62 65 68 61 76 65 73 20 61 20 6e 6f 2d  it behaves a no-
29400 6f 70 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65  op..*/./* Opcode
29410 3a 20 53 6f 72 74 65 72 4e 65 78 74 20 50 31 20  : SorterNext P1 
29420 50 32 20 2a 20 2a 20 50 35 0a 2a 2a 0a 2a 2a 20  P2 * * P5.**.** 
29430 54 68 69 73 20 6f 70 63 6f 64 65 20 77 6f 72 6b  This opcode work
29440 73 20 6a 75 73 74 20 6c 69 6b 65 20 4f 50 5f 4e  s just like OP_N
29450 65 78 74 20 65 78 63 65 70 74 20 74 68 61 74 20  ext except that 
29460 50 31 20 6d 75 73 74 20 62 65 20 61 0a 2a 2a 20  P1 must be a.** 
29470 73 6f 72 74 65 72 20 6f 62 6a 65 63 74 20 66 6f  sorter object fo
29480 72 20 77 68 69 63 68 20 74 68 65 20 4f 50 5f 53  r which the OP_S
29490 6f 72 74 65 72 53 6f 72 74 20 6f 70 63 6f 64 65  orterSort opcode
294a0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 69 6e 76   has been.** inv
294b0 6f 6b 65 64 2e 20 20 54 68 69 73 20 6f 70 63 6f  oked.  This opco
294c0 64 65 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  de advances the 
294d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
294e0 78 74 20 73 6f 72 74 65 64 0a 2a 2a 20 72 65 63  xt sorted.** rec
294f0 6f 72 64 2c 20 6f 72 20 6a 75 6d 70 73 20 74 6f  ord, or jumps to
29500 20 50 32 20 69 66 20 74 68 65 72 65 20 61 72 65   P2 if there are
29510 20 6e 6f 20 6d 6f 72 65 20 73 6f 72 74 65 64 20   no more sorted 
29520 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 63 61 73 65  records..*/.case
29530 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
29540 7b 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20  {  /* jump */.  
29550 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a  VdbeCursor *pC;.
29560 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 70 43    int res;..  pC
29570 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
29580 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
29590 69 73 53 6f 72 74 65 72 28 70 43 29 20 29 3b 0a  isSorter(pC) );.
295a0 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 72 63 20    res = 0;.  rc 
295b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72  = sqlite3VdbeSor
295c0 74 65 72 4e 65 78 74 28 64 62 2c 20 70 43 2c 20  terNext(db, pC, 
295d0 26 72 65 73 29 3b 0a 20 20 67 6f 74 6f 20 6e 65  &res);.  goto ne
295e0 78 74 5f 74 61 69 6c 3b 0a 63 61 73 65 20 4f 50  xt_tail;.case OP
295f0 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 20 20 20  _PrevIfOpen:    
29600 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20  /* jump */.case 
29610 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 20 20  OP_NextIfOpen:  
29620 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69    /* jump */.  i
29630 66 28 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d  f( p->apCsr[pOp-
29640 3e 70 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  >p1]==0 ) break;
29650 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75  .  /* Fall throu
29660 67 68 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 72  gh */.case OP_Pr
29670 65 76 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev:          /* 
29680 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f  jump */.case OP_
29690 4e 65 78 74 3a 20 20 20 20 20 20 20 20 20 20 2f  Next:          /
296a0 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 61 73 73 65  * jump */.  asse
296b0 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26  rt( pOp->p1>=0 &
296c0 26 20 70 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75  & pOp->p1<p->nCu
296d0 72 73 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rsor );.  assert
296e0 28 20 70 4f 70 2d 3e 70 35 3c 41 72 72 61 79 53  ( pOp->p5<ArrayS
296f0 69 7a 65 28 70 2d 3e 61 43 6f 75 6e 74 65 72 29  ize(p->aCounter)
29700 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70   );.  pC = p->ap
29710 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20  Csr[pOp->p1];.  
29720 72 65 73 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20  res = pOp->p3;. 
29730 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
29740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
29750 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
29760 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
29770 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
29780 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
29790 61 73 73 65 72 74 28 20 72 65 73 3d 3d 30 20 7c  assert( res==0 |
297a0 7c 20 28 72 65 73 3d 3d 31 20 26 26 20 70 43 2d  | (res==1 && pC-
297b0 3e 69 73 54 61 62 6c 65 3d 3d 30 29 20 29 3b 0a  >isTable==0) );.
297c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 73 3d    testcase( res=
297d0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
297e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f  pOp->opcode!=OP_
297f0 4e 65 78 74 20 7c 7c 20 70 4f 70 2d 3e 70 34 2e  Next || pOp->p4.
29800 78 41 64 76 61 6e 63 65 3d 3d 73 71 6c 69 74 65  xAdvance==sqlite
29810 33 42 74 72 65 65 4e 65 78 74 20 29 3b 0a 20 20  3BtreeNext );.  
29820 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63  assert( pOp->opc
29830 6f 64 65 21 3d 4f 50 5f 50 72 65 76 20 7c 7c 20  ode!=OP_Prev || 
29840 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
29850 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
29860 65 76 69 6f 75 73 20 29 3b 0a 20 20 61 73 73 65  evious );.  asse
29870 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21  rt( pOp->opcode!
29880 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 20 7c  =OP_NextIfOpen |
29890 7c 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  | pOp->p4.xAdvan
298a0 63 65 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  ce==sqlite3Btree
298b0 4e 65 78 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Next );.  assert
298c0 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 21 3d 4f  ( pOp->opcode!=O
298d0 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 7c 7c 20  P_PrevIfOpen || 
298e0 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
298f0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  ==sqlite3BtreePr
29900 65 76 69 6f 75 73 29 3b 0a 0a 20 20 2f 2a 20 54  evious);..  /* T
29910 68 65 20 4e 65 78 74 20 6f 70 63 6f 64 65 20 69  he Next opcode i
29920 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 66 74 65  s only used afte
29930 72 20 53 65 65 6b 47 54 2c 20 53 65 65 6b 47 45  r SeekGT, SeekGE
29940 2c 20 61 6e 64 20 52 65 77 69 6e 64 2e 0a 20 20  , and Rewind..  
29950 2a 2a 20 54 68 65 20 50 72 65 76 20 6f 70 63 6f  ** The Prev opco
29960 64 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  de is only used 
29970 61 66 74 65 72 20 53 65 65 6b 4c 54 2c 20 53 65  after SeekLT, Se
29980 65 6b 4c 45 2c 20 61 6e 64 20 4c 61 73 74 2e 20  ekLE, and Last. 
29990 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  */.  assert( pOp
299a0 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 4e 65 78  ->opcode!=OP_Nex
299b0 74 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  t || pOp->opcode
299c0 21 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 0a  !=OP_NextIfOpen.
299d0 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
299e0 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ekOp==OP_SeekGT 
299f0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29a00 50 5f 53 65 65 6b 47 45 0a 20 20 20 20 20 20 20  P_SeekGE.       
29a10 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29a20 50 5f 52 65 77 69 6e 64 20 7c 7c 20 70 43 2d 3e  P_Rewind || pC->
29a30 73 65 65 6b 4f 70 3d 3d 4f 50 5f 46 6f 75 6e 64  seekOp==OP_Found
29a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  );.  assert( pOp
29a50 2d 3e 6f 70 63 6f 64 65 21 3d 4f 50 5f 50 72 65  ->opcode!=OP_Pre
29a60 76 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  v || pOp->opcode
29a70 21 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 0a  !=OP_PrevIfOpen.
29a80 20 20 20 20 20 20 20 7c 7c 20 70 43 2d 3e 73 65         || pC->se
29a90 65 6b 4f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 20  ekOp==OP_SeekLT 
29aa0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29ab0 50 5f 53 65 65 6b 4c 45 0a 20 20 20 20 20 20 20  P_SeekLE.       
29ac0 7c 7c 20 70 43 2d 3e 73 65 65 6b 4f 70 3d 3d 4f  || pC->seekOp==O
29ad0 50 5f 4c 61 73 74 20 29 3b 0a 0a 20 20 72 63 20  P_Last );..  rc 
29ae0 3d 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e  = pOp->p4.xAdvan
29af0 63 65 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f  ce(pC->uc.pCurso
29b00 72 2c 20 26 72 65 73 29 3b 0a 6e 65 78 74 5f 74  r, &res);.next_t
29b10 61 69 6c 3a 0a 20 20 70 43 2d 3e 63 61 63 68 65  ail:.  pC->cache
29b20 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
29b30 54 41 4c 45 3b 0a 20 20 56 64 62 65 42 72 61 6e  TALE;.  VdbeBran
29b40 63 68 54 61 6b 65 6e 28 72 65 73 3d 3d 30 2c 32  chTaken(res==0,2
29b50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29b60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
29b70 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65 73  error;.  if( res
29b80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 2d 3e 6e  ==0 ){.    pC->n
29b90 75 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ullRow = 0;.    
29ba0 70 2d 3e 61 43 6f 75 6e 74 65 72 5b 70 4f 70 2d  p->aCounter[pOp-
29bb0 3e 70 35 5d 2b 2b 3b 0a 23 69 66 64 65 66 20 53  >p5]++;.#ifdef S
29bc0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
29bd0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
29be0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
29bf0 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
29c00 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
29c10 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c  interrupt;.  }el
29c20 73 65 7b 0a 20 20 20 20 70 43 2d 3e 6e 75 6c 6c  se{.    pC->null
29c30 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 67  Row = 1;.  }.  g
29c40 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f 69 6e  oto check_for_in
29c50 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 20 4f  terrupt;.}../* O
29c60 70 63 6f 64 65 3a 20 49 64 78 49 6e 73 65 72 74  pcode: IdxInsert
29c70 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35 0a   P1 P2 P3 P4 P5.
29c80 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 6b 65 79  ** Synopsis: key
29c90 3d 72 5b 50 32 5d 0a 2a 2a 0a 2a 2a 20 52 65 67  =r[P2].**.** Reg
29ca0 69 73 74 65 72 20 50 32 20 68 6f 6c 64 73 20 61  ister P2 holds a
29cb0 6e 20 53 51 4c 20 69 6e 64 65 78 20 6b 65 79 20  n SQL index key 
29cc0 6d 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 2a  made using the.*
29cd0 2a 20 4d 61 6b 65 52 65 63 6f 72 64 20 69 6e 73  * MakeRecord ins
29ce0 74 72 75 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  tructions.  This
29cf0 20 6f 70 63 6f 64 65 20 77 72 69 74 65 73 20 74   opcode writes t
29d00 68 61 74 20 6b 65 79 0a 2a 2a 20 69 6e 74 6f 20  hat key.** into 
29d10 74 68 65 20 69 6e 64 65 78 20 50 31 2e 20 20 44  the index P1.  D
29d20 61 74 61 20 66 6f 72 20 74 68 65 20 65 6e 74 72  ata for the entr
29d30 79 20 69 73 20 6e 69 6c 2e 0a 2a 2a 0a 2a 2a 20  y is nil..**.** 
29d40 49 66 20 50 34 20 69 73 20 6e 6f 74 20 7a 65 72  If P4 is not zer
29d50 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
29d60 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 75  e number of valu
29d70 65 73 20 69 6e 20 74 68 65 20 75 6e 70 61 63 6b  es in the unpack
29d80 65 64 0a 2a 2a 20 6b 65 79 20 6f 66 20 72 65 67  ed.** key of reg
29d90 28 50 32 29 2e 20 20 49 6e 20 74 68 61 74 20 63  (P2).  In that c
29da0 61 73 65 2c 20 50 33 20 69 73 20 74 68 65 20 69  ase, P3 is the i
29db0 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
29dc0 74 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 66 6f  t register.** fo
29dd0 72 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 6b  r the unpacked k
29de0 65 79 2e 20 20 54 68 65 20 61 76 61 69 6c 61 62  ey.  The availab
29df0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 75 6e 70  ility of the unp
29e00 61 63 6b 65 64 20 6b 65 79 20 63 61 6e 20 73 6f  acked key can so
29e10 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65 20 61 6e  metimes.** be an
29e20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
29e30 2a 0a 2a 2a 20 49 66 20 50 35 20 68 61 73 20 74  *.** If P5 has t
29e40 68 65 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  he OPFLAG_APPEND
29e50 20 62 69 74 20 73 65 74 2c 20 74 68 61 74 20 69   bit set, that i
29e60 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
29e70 62 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20  b-tree layer.** 
29e80 74 68 61 74 20 74 68 69 73 20 69 6e 73 65 72 74  that this insert
29e90 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 65   is likely to be
29ea0 20 61 6e 20 61 70 70 65 6e 64 2e 0a 2a 2a 0a 2a   an append..**.*
29eb0 2a 20 49 66 20 50 35 20 68 61 73 20 74 68 65 20  * If P5 has the 
29ec0 4f 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62  OPFLAG_NCHANGE b
29ed0 69 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  it set, then the
29ee0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
29ef0 69 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65  is.** incremente
29f00 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 72 75  d by this instru
29f10 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 4f  ction.  If the O
29f20 50 46 4c 41 47 5f 4e 43 48 41 4e 47 45 20 62 69  PFLAG_NCHANGE bi
29f30 74 20 69 73 20 63 6c 65 61 72 2c 0a 2a 2a 20 74  t is clear,.** t
29f40 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 20 63  hen the change c
29f50 6f 75 6e 74 65 72 20 69 73 20 75 6e 63 68 61 6e  ounter is unchan
29f60 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
29f70 65 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  e OPFLAG_USESEEK
29f80 52 45 53 55 4c 54 20 66 6c 61 67 20 6f 66 20 50  RESULT flag of P
29f90 35 20 69 73 20 73 65 74 2c 20 74 68 65 20 69 6d  5 is set, the im
29fa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 69 67  plementation mig
29fb0 68 74 0a 2a 2a 20 72 75 6e 20 66 61 73 74 65 72  ht.** run faster
29fc0 20 62 79 20 61 76 6f 69 64 69 6e 67 20 61 6e 20   by avoiding an 
29fd0 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65 65 6b  unnecessary seek
29fe0 20 6f 6e 20 63 75 72 73 6f 72 20 50 31 2e 20 20   on cursor P1.  
29ff0 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 74 68 65 20  However,.** the 
2a000 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
2a010 53 55 4c 54 20 66 6c 61 67 20 6d 75 73 74 20 6f  SULT flag must o
2a020 6e 6c 79 20 62 65 20 73 65 74 20 69 66 20 74 68  nly be set if th
2a030 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2a040 20 70 72 69 6f 72 0a 2a 2a 20 73 65 65 6b 73 20   prior.** seeks 
2a050 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6f 72  on the cursor or
2a060 20 69 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   if the most rec
2a070 65 6e 74 20 73 65 65 6b 20 75 73 65 64 20 61 20  ent seek used a 
2a080 6b 65 79 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a  key equivalent.*
2a090 2a 20 74 6f 20 50 32 2e 20 0a 2a 2a 0a 2a 2a 20  * to P2. .**.** 
2a0a0 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
2a0b0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
2a0c0 69 6e 64 69 63 65 73 2e 20 20 54 68 65 20 65 71  indices.  The eq
2a0d0 75 69 76 61 6c 65 6e 74 20 69 6e 73 74 72 75 63  uivalent instruc
2a0e0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 61 62 6c  tion.** for tabl
2a0f0 65 73 20 69 73 20 4f 50 5f 49 6e 73 65 72 74 2e  es is OP_Insert.
2a100 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .*/./* Opcode: S
2a110 6f 72 74 65 72 49 6e 73 65 72 74 20 50 31 20 50  orterInsert P1 P
2a120 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
2a130 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 5d 0a 2a  sis: key=r[P2].*
2a140 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 32  *.** Register P2
2a150 20 68 6f 6c 64 73 20 61 6e 20 53 51 4c 20 69 6e   holds an SQL in
2a160 64 65 78 20 6b 65 79 20 6d 61 64 65 20 75 73 69  dex key made usi
2a170 6e 67 20 74 68 65 0a 2a 2a 20 4d 61 6b 65 52 65  ng the.** MakeRe
2a180 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  cord instruction
2a190 73 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65 20  s.  This opcode 
2a1a0 77 72 69 74 65 73 20 74 68 61 74 20 6b 65 79 0a  writes that key.
2a1b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ** into the sort
2a1c0 65 72 20 50 31 2e 20 20 44 61 74 61 20 66 6f 72  er P1.  Data for
2a1d0 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 6e 69   the entry is ni
2a1e0 6c 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 53 6f  l..*/.case OP_So
2a1f0 72 74 65 72 49 6e 73 65 72 74 3a 20 20 20 20 20  rterInsert:     
2a200 20 20 2f 2a 20 69 6e 32 20 2a 2f 0a 63 61 73 65    /* in2 */.case
2a210 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3a 20 7b   OP_IdxInsert: {
2a220 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 32 20 2a          /* in2 *
2a230 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
2a240 70 43 3b 0a 20 20 42 74 72 65 65 50 61 79 6c 6f  pC;.  BtreePaylo
2a250 61 64 20 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad x;..  assert(
2a260 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2a270 4f 70 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f  Op->p1<p->nCurso
2a280 72 20 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61  r );.  pC = p->a
2a290 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  pCsr[pOp->p1];. 
2a2a0 20 61 73 73 65 72 74 28 20 70 43 21 3d 30 20 29   assert( pC!=0 )
2a2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 6f  ;.  assert( isSo
2a2c0 72 74 65 72 28 70 43 29 3d 3d 28 70 4f 70 2d 3e  rter(pC)==(pOp->
2a2d0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65  opcode==OP_Sorte
2a2e0 72 49 6e 73 65 72 74 29 20 29 3b 0a 20 20 70 49  rInsert) );.  pI
2a2f0 6e 32 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n2 = &aMem[pOp->
2a300 70 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p2];.  assert( p
2a310 49 6e 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In2->flags & MEM
2a320 5f 42 6c 6f 62 20 29 3b 0a 20 20 69 66 28 20 70  _Blob );.  if( p
2a330 4f 70 2d 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f  Op->p5 & OPFLAG_
2a340 4e 43 48 41 4e 47 45 20 29 20 70 2d 3e 6e 43 68  NCHANGE ) p->nCh
2a350 61 6e 67 65 2b 2b 3b 0a 20 20 61 73 73 65 72 74  ange++;.  assert
2a360 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
2a370 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 7c 7c  CURTYPE_BTREE ||
2a380 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2a390 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 3b  _SorterInsert );
2a3a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 69  .  assert( pC->i
2a3b0 73 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 72  sTable==0 );.  r
2a3c0 63 20 3d 20 45 78 70 61 6e 64 42 6c 6f 62 28 70  c = ExpandBlob(p
2a3d0 49 6e 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29  In2);.  if( rc )
2a3e0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2a3f0 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20  to_error;.  if( 
2a400 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2a410 53 6f 72 74 65 72 49 6e 73 65 72 74 20 29 7b 0a  SorterInsert ){.
2a420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a430 56 64 62 65 53 6f 72 74 65 72 57 72 69 74 65 28  VdbeSorterWrite(
2a440 70 43 2c 20 70 49 6e 32 29 3b 0a 20 20 7d 65 6c  pC, pIn2);.  }el
2a450 73 65 7b 0a 20 20 20 20 78 2e 6e 4b 65 79 20 3d  se{.    x.nKey =
2a460 20 70 49 6e 32 2d 3e 6e 3b 0a 20 20 20 20 78 2e   pIn2->n;.    x.
2a470 70 4b 65 79 20 3d 20 70 49 6e 32 2d 3e 7a 3b 0a  pKey = pIn2->z;.
2a480 20 20 20 20 78 2e 61 4d 65 6d 20 3d 20 61 4d 65      x.aMem = aMe
2a490 6d 20 2b 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20  m + pOp->p3;.   
2a4a0 20 78 2e 6e 4d 65 6d 20 3d 20 28 75 31 36 29 70   x.nMem = (u16)p
2a4b0 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 20 20 72 63  Op->p4.i;.    rc
2a4c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2a4d0 6e 73 65 72 74 28 70 43 2d 3e 75 63 2e 70 43 75  nsert(pC->uc.pCu
2a4e0 72 73 6f 72 2c 20 26 78 2c 0a 20 20 20 20 20 20  rsor, &x,.      
2a4f0 20 20 20 28 70 4f 70 2d 3e 70 35 20 26 20 4f 50     (pOp->p5 & OP
2a500 46 4c 41 47 5f 41 50 50 45 4e 44 29 21 3d 30 2c  FLAG_APPEND)!=0,
2a510 20 0a 20 20 20 20 20 20 20 20 28 28 70 4f 70 2d   .        ((pOp-
2a520 3e 70 35 20 26 20 4f 50 46 4c 41 47 5f 55 53 45  >p5 & OPFLAG_USE
2a530 53 45 45 4b 52 45 53 55 4c 54 29 20 3f 20 70 43  SEEKRESULT) ? pC
2a540 2d 3e 73 65 65 6b 52 65 73 75 6c 74 20 3a 20 30  ->seekResult : 0
2a550 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2a560 20 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66   assert( pC->def
2a570 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29  erredMoveto==0 )
2a580 3b 0a 20 20 20 20 70 43 2d 3e 63 61 63 68 65 53  ;.    pC->cacheS
2a590 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
2a5a0 41 4c 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ALE;.  }.  if( r
2a5b0 63 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75  c) goto abort_du
2a5c0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72  e_to_error;.  br
2a5d0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2a5e0 65 3a 20 49 64 78 44 65 6c 65 74 65 20 50 31 20  e: IdxDelete P1 
2a5f0 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e  P2 P3 * *.** Syn
2a600 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 32 40  opsis: key=r[P2@
2a610 50 33 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  P3].**.** The co
2a620 6e 74 65 6e 74 20 6f 66 20 50 33 20 72 65 67 69  ntent of P3 regi
2a630 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
2a640 74 20 72 65 67 69 73 74 65 72 20 50 32 20 66 6f  t register P2 fo
2a650 72 6d 0a 2a 2a 20 61 6e 20 75 6e 70 61 63 6b 65  rm.** an unpacke
2a660 64 20 69 6e 64 65 78 20 6b 65 79 2e 20 54 68 69  d index key. Thi
2a670 73 20 6f 70 63 6f 64 65 20 72 65 6d 6f 76 65 73  s opcode removes
2a680 20 74 68 61 74 20 65 6e 74 72 79 20 66 72 6f 6d   that entry from
2a690 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 6f   the .** index o
2a6a0 70 65 6e 65 64 20 62 79 20 63 75 72 73 6f 72 20  pened by cursor 
2a6b0 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  P1..*/.case OP_I
2a6c0 64 78 44 65 6c 65 74 65 3a 20 7b 0a 20 20 56 64  dxDelete: {.  Vd
2a6d0 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20 20  beCursor *pC;.  
2a6e0 42 74 43 75 72 73 6f 72 20 2a 70 43 72 73 72 3b  BtCursor *pCrsr;
2a6f0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e  .  int res;.  Un
2a700 70 61 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a  packedRecord r;.
2a710 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2a720 70 33 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p3>0 );.  assert
2a730 28 20 70 4f 70 2d 3e 70 32 3e 30 20 26 26 20 70  ( pOp->p2>0 && p
2a740 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 3c 3d  Op->p2+pOp->p3<=
2a750 28 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e  (p->nMem+1 - p->
2a760 6e 43 75 72 73 6f 72 29 2b 31 20 29 3b 0a 20 20  nCursor)+1 );.  
2a770 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e  assert( pOp->p1>
2a780 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70 2d  =0 && pOp->p1<p-
2a790 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70 43  >nCursor );.  pC
2a7a0 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d   = p->apCsr[pOp-
2a7b0 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  >p1];.  assert( 
2a7c0 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pC!=0 );.  asser
2a7d0 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d  t( pC->eCurType=
2a7e0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
2a7f0 3b 0a 20 20 70 43 72 73 72 20 3d 20 70 43 2d 3e  ;.  pCrsr = pC->
2a800 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
2a810 73 65 72 74 28 20 70 43 72 73 72 21 3d 30 20 29  sert( pCrsr!=0 )
2a820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
2a830 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 72 2e 70 4b  >p5==0 );.  r.pK
2a840 65 79 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65  eyInfo = pC->pKe
2a850 79 49 6e 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c  yInfo;.  r.nFiel
2a860 64 20 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 33  d = (u16)pOp->p3
2a870 3b 0a 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63  ;.  r.default_rc
2a880 20 3d 20 30 3b 0a 20 20 72 2e 61 4d 65 6d 20 3d   = 0;.  r.aMem =
2a890 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b   &aMem[pOp->p2];
2a8a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2a8b0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2a8c0 65 64 28 70 43 72 73 72 2c 20 26 72 2c 20 30 2c  ed(pCrsr, &r, 0,
2a8d0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
2a8e0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
2a8f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
2a900 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
2a910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2a920 74 72 65 65 44 65 6c 65 74 65 28 70 43 72 73 72  treeDelete(pCrsr
2a930 2c 20 42 54 52 45 45 5f 41 55 58 44 45 4c 45 54  , BTREE_AUXDELET
2a940 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  E);.    if( rc )
2a950 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
2a960 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  to_error;.  }.  
2a970 61 73 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65  assert( pC->defe
2a980 72 72 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b  rredMoveto==0 );
2a990 0a 20 20 70 43 2d 3e 63 61 63 68 65 53 74 61 74  .  pC->cacheStat
2a9a0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
2a9b0 3b 0a 20 20 70 43 2d 3e 73 65 65 6b 52 65 73 75  ;.  pC->seekResu
2a9c0 6c 74 20 3d 20 30 3b 0a 20 20 62 72 65 61 6b 3b  lt = 0;.  break;
2a9d0 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 53  .}../* Opcode: S
2a9e0 65 65 6b 20 50 31 20 2a 20 50 33 20 50 34 20 2a  eek P1 * P3 P4 *
2a9f0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 4d 6f  .** Synopsis: Mo
2aa00 76 65 20 50 33 20 74 6f 20 50 31 2e 72 6f 77 69  ve P3 to P1.rowi
2aa10 64 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73 20 61 6e  d.**.** P1 is an
2aa20 20 6f 70 65 6e 20 69 6e 64 65 78 20 63 75 72 73   open index curs
2aa30 6f 72 20 61 6e 64 20 50 33 20 69 73 20 61 20 63  or and P3 is a c
2aa40 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 63 6f 72  ursor on the cor
2aa50 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61  responding.** ta
2aa60 62 6c 65 2e 20 20 54 68 69 73 20 6f 70 63 6f 64  ble.  This opcod
2aa70 65 20 64 6f 65 73 20 61 20 64 65 66 65 72 72 65  e does a deferre
2aa80 64 20 73 65 65 6b 20 6f 66 20 74 68 65 20 50 33  d seek of the P3
2aa90 20 74 61 62 6c 65 20 63 75 72 73 6f 72 0a 2a 2a   table cursor.**
2aaa0 20 74 6f 20 74 68 65 20 72 6f 77 20 74 68 61 74   to the row that
2aab0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2aac0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
2aad0 6f 66 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  of P1..**.** Thi
2aae0 73 20 69 73 20 61 20 64 65 66 65 72 72 65 64 20  s is a deferred 
2aaf0 73 65 65 6b 2e 20 20 4e 6f 74 68 69 6e 67 20 61  seek.  Nothing a
2ab00 63 74 75 61 6c 6c 79 20 68 61 70 70 65 6e 73 20  ctually happens 
2ab10 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 63 75 72  until.** the cur
2ab20 73 6f 72 20 69 73 20 75 73 65 64 20 74 6f 20 72  sor is used to r
2ab30 65 61 64 20 61 20 72 65 63 6f 72 64 2e 20 20 54  ead a record.  T
2ab40 68 61 74 20 77 61 79 2c 20 69 66 20 6e 6f 20 72  hat way, if no r
2ab50 65 61 64 73 0a 2a 2a 20 6f 63 63 75 72 2c 20 6e  eads.** occur, n
2ab60 6f 20 75 6e 6e 65 63 65 73 73 61 72 79 20 49 2f  o unnecessary I/
2ab70 4f 20 68 61 70 70 65 6e 73 2e 0a 2a 2a 0a 2a 2a  O happens..**.**
2ab80 20 50 34 20 6d 61 79 20 62 65 20 61 6e 20 61 72   P4 may be an ar
2ab90 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
2aba0 28 74 79 70 65 20 50 34 5f 49 4e 54 41 52 52 41  (type P4_INTARRA
2abb0 59 29 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  Y) containing.**
2abc0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
2abd0 61 63 68 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ach column in th
2abe0 65 20 50 33 20 74 61 62 6c 65 2e 20 20 49 66 20  e P3 table.  If 
2abf0 61 72 72 61 79 20 65 6e 74 72 79 20 61 28 69 29  array entry a(i)
2ac00 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  .** is non-zero,
2ac10 20 74 68 65 6e 20 72 65 61 64 69 6e 67 20 63 6f   then reading co
2ac20 6c 75 6d 6e 20 61 28 69 29 2d 31 20 66 72 6f 6d  lumn a(i)-1 from
2ac30 20 63 75 72 73 6f 72 20 50 33 20 69 73 20 0a 2a   cursor P3 is .*
2ac40 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
2ac50 70 65 72 66 6f 72 6d 69 6e 67 20 74 68 65 20 64  performing the d
2ac60 65 66 65 72 72 65 64 20 73 65 65 6b 20 61 6e 64  eferred seek and
2ac70 20 74 68 65 6e 20 72 65 61 64 69 6e 67 20 63 6f   then reading co
2ac80 6c 75 6d 6e 20 69 20 0a 2a 2a 20 66 72 6f 6d 20  lumn i .** from 
2ac90 50 31 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  P1.  This inform
2aca0 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
2acb0 69 6e 20 50 33 20 61 6e 64 20 75 73 65 64 20 74  in P3 and used t
2acc0 6f 20 72 65 64 69 72 65 63 74 0a 2a 2a 20 72 65  o redirect.** re
2acd0 61 64 73 20 61 67 61 69 6e 73 74 20 50 33 20 6f  ads against P3 o
2ace0 76 65 72 20 74 6f 20 50 31 2c 20 74 68 75 73 20  ver to P1, thus 
2acf0 70 6f 73 73 69 62 6c 79 20 61 76 6f 69 64 69 6e  possibly avoidin
2ad00 67 20 74 68 65 20 6e 65 65 64 20 74 6f 0a 2a 2a  g the need to.**
2ad10 20 73 65 65 6b 20 61 6e 64 20 72 65 61 64 20 63   seek and read c
2ad20 75 72 73 6f 72 20 50 33 2e 0a 2a 2f 0a 2f 2a 20  ursor P3..*/./* 
2ad30 4f 70 63 6f 64 65 3a 20 49 64 78 52 6f 77 69 64  Opcode: IdxRowid
2ad40 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20   P1 P2 * * *.** 
2ad50 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d  Synopsis: r[P2]=
2ad60 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 57 72 69 74  rowid.**.** Writ
2ad70 65 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  e into register 
2ad80 50 32 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  P2 an integer wh
2ad90 69 63 68 20 69 73 20 74 68 65 20 6c 61 73 74 20  ich is the last 
2ada0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 63  entry in the rec
2adb0 6f 72 64 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ord at.** the en
2adc0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6b  d of the index k
2add0 65 79 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ey pointed to by
2ade0 20 63 75 72 73 6f 72 20 50 31 2e 20 20 54 68 69   cursor P1.  Thi
2adf0 73 20 69 6e 74 65 67 65 72 20 73 68 6f 75 6c 64  s integer should
2ae00 20 62 65 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64   be.** the rowid
2ae10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 65 6e   of the table en
2ae20 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 69  try to which thi
2ae30 73 20 69 6e 64 65 78 20 65 6e 74 72 79 20 70 6f  s index entry po
2ae40 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ints..**.** See 
2ae50 61 6c 73 6f 3a 20 52 6f 77 69 64 2c 20 4d 61 6b  also: Rowid, Mak
2ae60 65 52 65 63 6f 72 64 2e 0a 2a 2f 0a 63 61 73 65  eRecord..*/.case
2ae70 20 4f 50 5f 53 65 65 6b 3a 0a 63 61 73 65 20 4f   OP_Seek:.case O
2ae80 50 5f 49 64 78 52 6f 77 69 64 3a 20 7b 20 20 20  P_IdxRowid: {   
2ae90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75             /* ou
2aea0 74 32 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  t2 */.  VdbeCurs
2aeb0 6f 72 20 2a 70 43 3b 20 20 20 20 20 20 20 20 20  or *pC;         
2aec0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
2aed0 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 2a 2f   index cursor */
2aee0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2aef0 54 61 62 43 75 72 3b 20 20 20 20 20 20 20 20 20  TabCur;         
2af00 20 20 2f 2a 20 54 68 65 20 50 32 20 74 61 62 6c    /* The P2 tabl
2af10 65 20 63 75 72 73 6f 72 20 28 4f 50 5f 53 65 65  e cursor (OP_See
2af20 6b 20 6f 6e 6c 79 29 20 2a 2f 0a 20 20 69 36 34  k only) */.  i64
2af30 20 72 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20   rowid;         
2af40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2af50 6f 77 69 64 20 74 68 61 74 20 50 31 20 63 75 72  owid that P1 cur
2af60 72 65 6e 74 20 70 6f 69 6e 74 73 20 74 6f 20 2a  rent points to *
2af70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  /..  assert( pOp
2af80 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1>=0 && pOp->
2af90 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b  p1<p->nCursor );
2afa0 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  .  pC = p->apCsr
2afb0 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73  [pOp->p1];.  ass
2afc0 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a 20 20  ert( pC!=0 );.  
2afd0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
2afe0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
2aff0 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
2b000 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21   pC->uc.pCursor!
2b010 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b020 70 43 2d 3e 69 73 54 61 62 6c 65 3d 3d 30 20 29  pC->isTable==0 )
2b030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e  ;.  assert( pC->
2b040 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 3d 3d  deferredMoveto==
2b050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
2b060 70 43 2d 3e 6e 75 6c 6c 52 6f 77 20 7c 7c 20 70  pC->nullRow || p
2b070 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
2b080 64 78 52 6f 77 69 64 20 29 3b 0a 0a 20 20 2f 2a  dxRowid );..  /*
2b090 20 54 68 65 20 49 64 78 52 6f 77 69 64 20 61 6e   The IdxRowid an
2b0a0 64 20 53 65 65 6b 20 6f 70 63 6f 64 65 73 20 61  d Seek opcodes a
2b0b0 72 65 20 63 6f 6d 62 69 6e 65 64 20 62 65 63 61  re combined beca
2b0c0 75 73 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  use of the commo
2b0d0 6e 61 6c 69 74 79 0a 20 20 2a 2a 20 6f 66 20 73  nality.  ** of s
2b0e0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
2b0f0 52 65 73 74 6f 72 65 28 29 20 61 6e 64 20 73 71  Restore() and sq
2b100 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
2b110 64 28 29 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d(). */.  rc = s
2b120 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
2b130 52 65 73 74 6f 72 65 28 70 43 29 3b 0a 0a 20 20  Restore(pC);..  
2b140 2f 2a 20 73 71 6c 69 74 65 33 56 62 65 43 75 72  /* sqlite3VbeCur
2b150 73 6f 72 52 65 73 74 6f 72 65 28 29 20 63 61 6e  sorRestore() can
2b160 20 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 74 68   only fail if th
2b170 65 20 72 65 63 6f 72 64 20 68 61 73 20 62 65 65  e record has bee
2b180 6e 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 6f  n deleted.  ** o
2b190 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
2b1a0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 61 74 20  e cursor.  That 
2b1b0 77 69 6c 6c 20 6e 65 76 65 72 20 68 61 70 70 65  will never happe
2b1c0 6e 73 20 66 6f 72 20 61 6e 20 49 64 78 52 6f 77  ns for an IdxRow
2b1d0 69 64 0a 20 20 2a 2a 20 6f 72 20 53 65 65 6b 20  id.  ** or Seek 
2b1e0 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  opcode */.  if( 
2b1f0 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
2b200 5f 4f 4b 29 20 29 20 67 6f 74 6f 20 61 62 6f 72  _OK) ) goto abor
2b210 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2b220 0a 20 20 69 66 28 20 21 70 43 2d 3e 6e 75 6c 6c  .  if( !pC->null
2b230 52 6f 77 20 29 7b 0a 20 20 20 20 72 6f 77 69 64  Row ){.    rowid
2b240 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 6e 65   = 0;  /* Not ne
2b250 65 64 65 64 2e 20 20 4f 6e 6c 79 20 75 73 65 64  eded.  Only used
2b260 20 74 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61   to silence a wa
2b270 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  rning. */.    rc
2b280 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64   = sqlite3VdbeId
2b290 78 52 6f 77 69 64 28 64 62 2c 20 70 43 2d 3e 75  xRowid(db, pC->u
2b2a0 63 2e 70 43 75 72 73 6f 72 2c 20 26 72 6f 77 69  c.pCursor, &rowi
2b2b0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
2b2c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b2d0 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
2b2e0 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20  e_to_error;.    
2b2f0 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  }.    if( pOp->o
2b300 70 63 6f 64 65 3d 3d 4f 50 5f 53 65 65 6b 20 29  pcode==OP_Seek )
2b310 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2b320 70 4f 70 2d 3e 70 33 3e 3d 30 20 26 26 20 70 4f  pOp->p3>=0 && pO
2b330 70 2d 3e 70 33 3c 70 2d 3e 6e 43 75 72 73 6f 72  p->p3<p->nCursor
2b340 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75   );.      pTabCu
2b350 72 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  r = p->apCsr[pOp
2b360 2d 3e 70 33 5d 3b 0a 20 20 20 20 20 20 61 73 73  ->p3];.      ass
2b370 65 72 74 28 20 70 54 61 62 43 75 72 21 3d 30 20  ert( pTabCur!=0 
2b380 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2b390 20 70 54 61 62 43 75 72 2d 3e 65 43 75 72 54 79   pTabCur->eCurTy
2b3a0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
2b3b0 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
2b3c0 74 28 20 70 54 61 62 43 75 72 2d 3e 75 63 2e 70  t( pTabCur->uc.p
2b3d0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
2b3e0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 43     assert( pTabC
2b3f0 75 72 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20  ur->isTable );. 
2b400 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 6e 75       pTabCur->nu
2b410 6c 6c 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20  llRow = 0;.     
2b420 20 70 54 61 62 43 75 72 2d 3e 6d 6f 76 65 74 6f   pTabCur->moveto
2b430 54 61 72 67 65 74 20 3d 20 72 6f 77 69 64 3b 0a  Target = rowid;.
2b440 20 20 20 20 20 20 70 54 61 62 43 75 72 2d 3e 64        pTabCur->d
2b450 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
2b460 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
2b470 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
2b480 5f 49 4e 54 41 52 52 41 59 20 7c 7c 20 70 4f 70  _INTARRAY || pOp
2b490 2d 3e 70 34 2e 61 69 3d 3d 30 20 29 3b 0a 20 20  ->p4.ai==0 );.  
2b4a0 20 20 20 20 70 54 61 62 43 75 72 2d 3e 61 41 6c      pTabCur->aAl
2b4b0 74 4d 61 70 20 3d 20 70 4f 70 2d 3e 70 34 2e 61  tMap = pOp->p4.a
2b4c0 69 3b 0a 20 20 20 20 20 20 70 54 61 62 43 75 72  i;.      pTabCur
2b4d0 2d 3e 70 41 6c 74 43 75 72 73 6f 72 20 3d 20 70  ->pAltCursor = p
2b4e0 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
2b4f0 20 20 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50      pOut = out2P
2b500 72 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70  rerelease(p, pOp
2b510 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 75  );.      pOut->u
2b520 2e 69 20 3d 20 72 6f 77 69 64 3b 0a 20 20 20 20  .i = rowid;.    
2b530 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20    pOut->flags = 
2b540 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  MEM_Int;.    }. 
2b550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2b560 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  rt( pOp->opcode=
2b570 3d 4f 50 5f 49 64 78 52 6f 77 69 64 20 29 3b 0a  =OP_IdxRowid );.
2b580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
2b590 65 6d 53 65 74 4e 75 6c 6c 28 26 61 4d 65 6d 5b  emSetNull(&aMem[
2b5a0 70 4f 70 2d 3e 70 32 5d 29 3b 0a 20 20 7d 0a 20  pOp->p2]);.  }. 
2b5b0 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70   break;.}../* Op
2b5c0 63 6f 64 65 3a 20 49 64 78 47 45 20 50 31 20 50  code: IdxGE P1 P
2b5d0 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 20 53 79  2 P3 P4 P5.** Sy
2b5e0 6e 6f 70 73 69 73 3a 20 6b 65 79 3d 72 5b 50 33  nopsis: key=r[P3
2b5f0 40 50 34 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  @P4].**.** The P
2b600 34 20 72 65 67 69 73 74 65 72 20 76 61 6c 75 65  4 register value
2b610 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
2b620 20 50 33 20 66 6f 72 6d 20 61 6e 20 75 6e 70 61   P3 form an unpa
2b630 63 6b 65 64 20 69 6e 64 65 78 20 0a 2a 2a 20 6b  cked index .** k
2b640 65 79 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68  ey that omits th
2b650 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20  e PRIMARY KEY.  
2b660 43 6f 6d 70 61 72 65 20 74 68 69 73 20 6b 65 79  Compare this key
2b670 20 76 61 6c 75 65 20 61 67 61 69 6e 73 74 20 74   value against t
2b680 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 74 68 61  he index .** tha
2b690 74 20 50 31 20 69 73 20 63 75 72 72 65 6e 74 6c  t P1 is currentl
2b6a0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c 20 69  y pointing to, i
2b6b0 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52 49 4d  gnoring the PRIM
2b6c0 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44  ARY KEY or ROWID
2b6d0 20 0a 2a 2a 20 66 69 65 6c 64 73 20 61 74 20 74   .** fields at t
2b6e0 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  he end..**.** If
2b6f0 20 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e   the P1 index en
2b700 74 72 79 20 69 73 20 67 72 65 61 74 65 72 20 74  try is greater t
2b710 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2b720 74 68 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a  the key value.**
2b730 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32   then jump to P2
2b740 2e 20 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  .  Otherwise fal
2b750 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
2b760 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2b770 6e 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a  n..*/./* Opcode:
2b780 20 49 64 78 47 54 20 50 31 20 50 32 20 50 33 20   IdxGT P1 P2 P3 
2b790 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69  P4 P5.** Synopsi
2b7a0 73 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a  s: key=r[P3@P4].
2b7b0 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67  **.** The P4 reg
2b7c0 69 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67  ister values beg
2b7d0 69 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66  inning with P3 f
2b7e0 6f 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20  orm an unpacked 
2b7f0 69 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68  index .** key th
2b800 61 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49  at omits the PRI
2b810 4d 41 52 59 20 4b 45 59 2e 20 20 43 6f 6d 70 61  MARY KEY.  Compa
2b820 72 65 20 74 68 69 73 20 6b 65 79 20 76 61 6c 75  re this key valu
2b830 65 20 61 67 61 69 6e 73 74 20 74 68 65 20 69 6e  e against the in
2b840 64 65 78 20 0a 2a 2a 20 74 68 61 74 20 50 31 20  dex .** that P1 
2b850 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2b860 6e 74 69 6e 67 20 74 6f 2c 20 69 67 6e 6f 72 69  nting to, ignori
2b870 6e 67 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  ng the PRIMARY K
2b880 45 59 20 6f 72 20 52 4f 57 49 44 20 0a 2a 2a 20  EY or ROWID .** 
2b890 66 69 65 6c 64 73 20 61 74 20 74 68 65 20 65 6e  fields at the en
2b8a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2b8b0 50 31 20 69 6e 64 65 78 20 65 6e 74 72 79 20 69  P1 index entry i
2b8c0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
2b8d0 68 65 20 6b 65 79 20 76 61 6c 75 65 0a 2a 2a 20  he key value.** 
2b8e0 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e  then jump to P2.
2b8f0 20 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c    Otherwise fall
2b900 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2b910 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2b920 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2b930 49 64 78 4c 54 20 50 31 20 50 32 20 50 33 20 50  IdxLT P1 P2 P3 P
2b940 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2b950 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
2b960 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69  *.** The P4 regi
2b970 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69  ster values begi
2b980 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f  nning with P3 fo
2b990 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  rm an unpacked i
2b9a0 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61  ndex .** key tha
2b9b0 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d  t omits the PRIM
2b9c0 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44  ARY KEY or ROWID
2b9d0 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20  .  Compare this 
2b9e0 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73  key value agains
2b9f0 74 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74  t.** the index t
2ba00 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e  hat P1 is curren
2ba10 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c  tly pointing to,
2ba20 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52   ignoring the PR
2ba30 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20  IMARY KEY or.** 
2ba40 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20  ROWID on the P1 
2ba50 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  index..**.** If 
2ba60 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
2ba70 72 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ry is less than 
2ba80 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68  the key value th
2ba90 65 6e 20 6a 75 6d 70 20 74 6f 20 50 32 2e 0a 2a  en jump to P2..*
2baa0 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c  * Otherwise fall
2bab0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
2bac0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2bad0 2e 0a 2a 2f 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ..*/./* Opcode: 
2bae0 49 64 78 4c 45 20 50 31 20 50 32 20 50 33 20 50  IdxLE P1 P2 P3 P
2baf0 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73 69 73  4 P5.** Synopsis
2bb00 3a 20 6b 65 79 3d 72 5b 50 33 40 50 34 5d 0a 2a  : key=r[P3@P4].*
2bb10 2a 0a 2a 2a 20 54 68 65 20 50 34 20 72 65 67 69  *.** The P4 regi
2bb20 73 74 65 72 20 76 61 6c 75 65 73 20 62 65 67 69  ster values begi
2bb30 6e 6e 69 6e 67 20 77 69 74 68 20 50 33 20 66 6f  nning with P3 fo
2bb40 72 6d 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 69  rm an unpacked i
2bb50 6e 64 65 78 20 0a 2a 2a 20 6b 65 79 20 74 68 61  ndex .** key tha
2bb60 74 20 6f 6d 69 74 73 20 74 68 65 20 50 52 49 4d  t omits the PRIM
2bb70 41 52 59 20 4b 45 59 20 6f 72 20 52 4f 57 49 44  ARY KEY or ROWID
2bb80 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 69 73 20  .  Compare this 
2bb90 6b 65 79 20 76 61 6c 75 65 20 61 67 61 69 6e 73  key value agains
2bba0 74 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 74  t.** the index t
2bbb0 68 61 74 20 50 31 20 69 73 20 63 75 72 72 65 6e  hat P1 is curren
2bbc0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2c  tly pointing to,
2bbd0 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 50 52   ignoring the PR
2bbe0 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 2a 2a 20  IMARY KEY or.** 
2bbf0 52 4f 57 49 44 20 6f 6e 20 74 68 65 20 50 31 20  ROWID on the P1 
2bc00 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  index..**.** If 
2bc10 74 68 65 20 50 31 20 69 6e 64 65 78 20 65 6e 74  the P1 index ent
2bc20 72 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ry is less than 
2bc30 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
2bc40 6b 65 79 20 76 61 6c 75 65 20 74 68 65 6e 20 6a  key value then j
2bc50 75 6d 70 0a 2a 2a 20 74 6f 20 50 32 2e 20 4f 74  ump.** to P2. Ot
2bc60 68 65 72 77 69 73 65 20 66 61 6c 6c 20 74 68 72  herwise fall thr
2bc70 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
2bc80 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2bc90 0a 63 61 73 65 20 4f 50 5f 49 64 78 4c 45 3a 20  .case OP_IdxLE: 
2bca0 20 20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70           /* jump
2bcb0 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49 64 78 47   */.case OP_IdxG
2bcc0 54 3a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6a  T:          /* j
2bcd0 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  ump */.case OP_I
2bce0 64 78 4c 54 3a 20 20 20 20 20 20 20 20 20 20 2f  dxLT:          /
2bcf0 2a 20 6a 75 6d 70 20 2a 2f 0a 63 61 73 65 20 4f  * jump */.case O
2bd00 50 5f 49 64 78 47 45 3a 20 20 7b 20 20 20 20 20  P_IdxGE:  {     
2bd10 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 56    /* jump */.  V
2bd20 64 62 65 43 75 72 73 6f 72 20 2a 70 43 3b 0a 20  dbeCursor *pC;. 
2bd30 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 6e 70 61   int res;.  Unpa
2bd40 63 6b 65 64 52 65 63 6f 72 64 20 72 3b 0a 0a 20  ckedRecord r;.. 
2bd50 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31   assert( pOp->p1
2bd60 3e 3d 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 70  >=0 && pOp->p1<p
2bd70 2d 3e 6e 43 75 72 73 6f 72 20 29 3b 0a 20 20 70  ->nCursor );.  p
2bd80 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 70 4f 70  C = p->apCsr[pOp
2bd90 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2bda0 20 70 43 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   pC!=0 );.  asse
2bdb0 72 74 28 20 70 43 2d 3e 69 73 4f 72 64 65 72 65  rt( pC->isOrdere
2bdc0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
2bdd0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
2bde0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
2bdf0 61 73 73 65 72 74 28 20 70 43 2d 3e 75 63 2e 70  assert( pC->uc.p
2be00 43 75 72 73 6f 72 21 3d 30 29 3b 0a 20 20 61 73  Cursor!=0);.  as
2be10 73 65 72 74 28 20 70 43 2d 3e 64 65 66 65 72 72  sert( pC->deferr
2be20 65 64 4d 6f 76 65 74 6f 3d 3d 30 20 29 3b 0a 20  edMoveto==0 );. 
2be30 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 35   assert( pOp->p5
2be40 3d 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d  ==0 || pOp->p5==
2be50 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2be60 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
2be70 4e 54 33 32 20 29 3b 0a 20 20 72 2e 70 4b 65 79  NT32 );.  r.pKey
2be80 49 6e 66 6f 20 3d 20 70 43 2d 3e 70 4b 65 79 49  Info = pC->pKeyI
2be90 6e 66 6f 3b 0a 20 20 72 2e 6e 46 69 65 6c 64 20  nfo;.  r.nField 
2bea0 3d 20 28 75 31 36 29 70 4f 70 2d 3e 70 34 2e 69  = (u16)pOp->p4.i
2beb0 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
2bec0 6f 64 65 3c 4f 50 5f 49 64 78 4c 54 20 29 7b 0a  ode<OP_IdxLT ){.
2bed0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d      assert( pOp-
2bee0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c  >opcode==OP_IdxL
2bef0 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  E || pOp->opcode
2bf00 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20  ==OP_IdxGT );.  
2bf10 20 20 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d    r.default_rc =
2bf20 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
2bf30 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f    assert( pOp->o
2bf40 70 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20  pcode==OP_IdxGE 
2bf50 7c 7c 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  || pOp->opcode==
2bf60 4f 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20  OP_IdxLT );.    
2bf70 72 2e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  r.default_rc = 0
2bf80 3b 0a 20 20 7d 0a 20 20 72 2e 61 4d 65 6d 20 3d  ;.  }.  r.aMem =
2bf90 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2bfa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2bfb0 45 42 55 47 0a 20 20 7b 20 69 6e 74 20 69 3b 20  EBUG.  { int i; 
2bfc0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 2e 6e 46 69  for(i=0; i<r.nFi
2bfd0 65 6c 64 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  eld; i++) assert
2bfe0 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 72 2e  ( memIsValid(&r.
2bff0 61 4d 65 6d 5b 69 5d 29 20 29 3b 20 7d 0a 23 65  aMem[i]) ); }.#e
2c000 6e 64 69 66 0a 20 20 72 65 73 20 3d 20 30 3b 20  ndif.  res = 0; 
2c010 20 2f 2a 20 4e 6f 74 20 6e 65 65 64 65 64 2e 20   /* Not needed. 
2c020 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f 20 73 69   Only used to si
2c030 6c 65 6e 63 65 20 61 20 77 61 72 6e 69 6e 67 2e  lence a warning.
2c040 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2c050 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
2c060 61 72 65 28 64 62 2c 20 70 43 2c 20 26 72 2c 20  are(db, pC, &r, 
2c070 26 72 65 73 29 3b 0a 20 20 61 73 73 65 72 74 28  &res);.  assert(
2c080 20 28 4f 50 5f 49 64 78 4c 45 26 31 29 3d 3d 28   (OP_IdxLE&1)==(
2c090 4f 50 5f 49 64 78 4c 54 26 31 29 20 26 26 20 28  OP_IdxLT&1) && (
2c0a0 4f 50 5f 49 64 78 47 45 26 31 29 3d 3d 28 4f 50  OP_IdxGE&1)==(OP
2c0b0 5f 49 64 78 47 54 26 31 29 20 29 3b 0a 20 20 69  _IdxGT&1) );.  i
2c0c0 66 28 20 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 26  f( (pOp->opcode&
2c0d0 31 29 3d 3d 28 4f 50 5f 49 64 78 4c 54 26 31 29  1)==(OP_IdxLT&1)
2c0e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c0f0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c100 49 64 78 4c 45 20 7c 7c 20 70 4f 70 2d 3e 6f 70  IdxLE || pOp->op
2c110 63 6f 64 65 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  code==OP_IdxLT )
2c120 3b 0a 20 20 20 20 72 65 73 20 3d 20 2d 72 65 73  ;.    res = -res
2c130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2c140 73 73 65 72 74 28 20 70 4f 70 2d 3e 6f 70 63 6f  ssert( pOp->opco
2c150 64 65 3d 3d 4f 50 5f 49 64 78 47 45 20 7c 7c 20  de==OP_IdxGE || 
2c160 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
2c170 49 64 78 47 54 20 29 3b 0a 20 20 20 20 72 65 73  IdxGT );.    res
2c180 2b 2b 3b 0a 20 20 7d 0a 20 20 56 64 62 65 42 72  ++;.  }.  VdbeBr
2c190 61 6e 63 68 54 61 6b 65 6e 28 72 65 73 3e 30 2c  anchTaken(res>0,
2c1a0 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  2);.  if( rc ) g
2c1b0 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2c1c0 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 72 65  _error;.  if( re
2c1d0 73 3e 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70 5f  s>0 ) goto jump_
2c1e0 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b 0a  to_p2;.  break;.
2c1f0 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 65  }../* Opcode: De
2c200 73 74 72 6f 79 20 50 31 20 50 32 20 50 33 20 2a  stroy P1 P2 P3 *
2c210 20 2a 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20   *.**.** Delete 
2c220 61 6e 20 65 6e 74 69 72 65 20 64 61 74 61 62 61  an entire databa
2c230 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  se table or inde
2c240 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67  x whose root pag
2c250 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2c260 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 67 69 76  e.** file is giv
2c270 65 6e 20 62 79 20 50 31 2e 0a 2a 2a 0a 2a 2a 20  en by P1..**.** 
2c280 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
2c290 64 65 73 74 72 6f 79 65 64 20 69 73 20 69 6e 20  destroyed is in 
2c2a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2c2b0 65 20 66 69 6c 65 20 69 66 20 50 33 3d 3d 30 2e  e file if P3==0.
2c2c0 20 20 49 66 0a 2a 2a 20 50 33 3d 3d 31 20 74 68    If.** P3==1 th
2c2d0 65 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  en the table to 
2c2e0 62 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  be clear is in t
2c2f0 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2c300 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68  abase file.** th
2c310 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  at is used to st
2c320 6f 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74  ore tables creat
2c330 65 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54  e using CREATE T
2c340 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a  EMPORARY TABLE..
2c350 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
2c360 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 74  UUM is enabled t
2c370 68 65 6e 20 69 74 20 69 73 20 70 6f 73 73 69 62  hen it is possib
2c380 6c 65 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  le that another 
2c390 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 6d 69 67  root page.** mig
2c3a0 68 74 20 62 65 20 6d 6f 76 65 64 20 69 6e 74 6f  ht be moved into
2c3b0 20 74 68 65 20 6e 65 77 6c 79 20 64 65 6c 65 74   the newly delet
2c3c0 65 64 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ed root page in 
2c3d0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 61 6c  order to keep al
2c3e0 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20  l.** root pages 
2c3f0 63 6f 6e 74 69 67 75 6f 75 73 20 61 74 20 74 68  contiguous at th
2c400 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2c410 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
2c420 65 20 66 6f 72 6d 65 72 0a 2a 2a 20 76 61 6c 75  e former.** valu
2c430 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 70 61  e of the root pa
2c440 67 65 20 74 68 61 74 20 6d 6f 76 65 64 20 2d 20  ge that moved - 
2c450 69 74 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  its value before
2c460 20 74 68 65 20 6d 6f 76 65 20 6f 63 63 75 72 72   the move occurr
2c470 65 64 20 2d 0a 2a 2a 20 69 73 20 73 74 6f 72 65  ed -.** is store
2c480 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50 32  d in register P2
2c490 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 0a 2a  .  If no page .*
2c4a0 2a 20 6d 6f 76 65 6d 65 6e 74 20 77 61 73 20 72  * movement was r
2c4b0 65 71 75 69 72 65 64 20 28 62 65 63 61 75 73 65  equired (because
2c4c0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2c4d0 20 64 72 6f 70 70 65 64 20 77 61 73 20 61 6c 72   dropped was alr
2c4e0 65 61 64 79 20 0a 2a 2a 20 74 68 65 20 6c 61 73  eady .** the las
2c4f0 74 20 6f 6e 65 20 69 6e 20 74 68 65 20 64 61 74  t one in the dat
2c500 61 62 61 73 65 29 20 74 68 65 6e 20 61 20 7a 65  abase) then a ze
2c510 72 6f 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ro is stored in 
2c520 72 65 67 69 73 74 65 72 20 50 32 2e 0a 2a 2a 20  register P2..** 
2c530 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
2c540 20 64 69 73 61 62 6c 65 64 20 74 68 65 6e 20 61   disabled then a
2c550 20 7a 65 72 6f 20 69 73 20 73 74 6f 72 65 64 20   zero is stored 
2c560 69 6e 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  in register P2..
2c570 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2c580 43 6c 65 61 72 0a 2a 2f 0a 63 61 73 65 20 4f 50  Clear.*/.case OP
2c590 5f 44 65 73 74 72 6f 79 3a 20 7b 20 20 20 20 20  _Destroy: {     
2c5a0 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 69 6e 74  /* out2 */.  int
2c5b0 20 69 4d 6f 76 65 64 3b 0a 20 20 69 6e 74 20 69   iMoved;.  int i
2c5c0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
2c5d0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
2c5e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
2c5f0 70 31 3e 31 20 29 3b 0a 20 20 70 4f 75 74 20 3d  p1>1 );.  pOut =
2c600 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73 65 28   out2Prerelease(
2c610 70 2c 20 70 4f 70 29 3b 0a 20 20 70 4f 75 74 2d  p, pOp);.  pOut-
2c620 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
2c630 6c 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  l;.  if( db->nVd
2c640 62 65 52 65 61 64 20 3e 20 64 62 2d 3e 6e 56 44  beRead > db->nVD
2c650 65 73 74 72 6f 79 2b 31 20 29 7b 0a 20 20 20 20  estroy+1 ){.    
2c660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
2c670 45 44 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  ED;.    p->error
2c680 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
2c690 74 3b 0a 20 20 20 20 67 6f 74 6f 20 61 62 6f 72  t;.    goto abor
2c6a0 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a  t_due_to_error;.
2c6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 44 62    }else{.    iDb
2c6c0 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
2c6d0 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65  assert( DbMaskTe
2c6e0 73 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  st(p->btreeMask,
2c6f0 20 69 44 62 29 20 29 3b 0a 20 20 20 20 69 4d 6f   iDb) );.    iMo
2c700 76 65 64 20 3d 20 30 3b 20 20 2f 2a 20 4e 6f 74  ved = 0;  /* Not
2c710 20 6e 65 65 64 65 64 2e 20 20 4f 6e 6c 79 20 74   needed.  Only t
2c720 6f 20 73 69 6c 65 6e 63 65 20 61 20 77 61 72 6e  o silence a warn
2c730 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
2c740 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
2c750 70 54 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 69  pTable(db->aDb[i
2c760 44 62 5d 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 31  Db].pBt, pOp->p1
2c770 2c 20 26 69 4d 6f 76 65 64 29 3b 0a 20 20 20 20  , &iMoved);.    
2c780 70 4f 75 74 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pOut->flags = ME
2c790 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4f 75 74 2d  M_Int;.    pOut-
2c7a0 3e 75 2e 69 20 3d 20 69 4d 6f 76 65 64 3b 0a 20  >u.i = iMoved;. 
2c7b0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c7c0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2c7d0 72 6f 72 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ror;.#ifndef SQL
2c7e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2c7f0 55 55 4d 0a 20 20 20 20 69 66 28 20 69 4d 6f 76  UUM.    if( iMov
2c800 65 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed!=0 ){.      s
2c810 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
2c820 76 65 64 28 64 62 2c 20 69 44 62 2c 20 69 4d 6f  ved(db, iDb, iMo
2c830 76 65 64 2c 20 70 4f 70 2d 3e 70 31 29 3b 0a 20  ved, pOp->p1);. 
2c840 20 20 20 20 20 2f 2a 20 41 6c 6c 20 4f 50 5f 44       /* All OP_D
2c850 65 73 74 72 6f 79 20 6f 70 65 72 61 74 69 6f 6e  estroy operation
2c860 73 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 73  s occur on the s
2c870 61 6d 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20  ame btree */.   
2c880 20 20 20 61 73 73 65 72 74 28 20 72 65 73 65 74     assert( reset
2c890 53 63 68 65 6d 61 4f 6e 46 61 75 6c 74 3d 3d 30  SchemaOnFault==0
2c8a0 20 7c 7c 20 72 65 73 65 74 53 63 68 65 6d 61 4f   || resetSchemaO
2c8b0 6e 46 61 75 6c 74 3d 3d 69 44 62 2b 31 20 29 3b  nFault==iDb+1 );
2c8c0 0a 20 20 20 20 20 20 72 65 73 65 74 53 63 68 65  .      resetSche
2c8d0 6d 61 4f 6e 46 61 75 6c 74 20 3d 20 69 44 62 2b  maOnFault = iDb+
2c8e0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2c8f0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
2c900 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 6c 65 61 72  /* Opcode: Clear
2c910 20 50 31 20 50 32 20 50 33 0a 2a 2a 0a 2a 2a 20   P1 P2 P3.**.** 
2c920 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65  Delete all conte
2c930 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c940 61 73 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ase table or ind
2c950 65 78 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  ex whose root pa
2c960 67 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  ge.** in the dat
2c970 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 69  abase file is gi
2c980 76 65 6e 20 62 79 20 50 31 2e 20 20 42 75 74 2c  ven by P1.  But,
2c990 20 75 6e 6c 69 6b 65 20 44 65 73 74 72 6f 79 2c   unlike Destroy,
2c9a0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 6d 6f 76   do not.** remov
2c9b0 65 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  e the table or i
2c9c0 6e 64 65 78 20 66 72 6f 6d 20 74 68 65 20 64 61  ndex from the da
2c9d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2c9e0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  ** The table bei
2c9f0 6e 67 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74  ng clear is in t
2ca00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2ca10 20 66 69 6c 65 20 69 66 20 50 32 3d 3d 30 2e 20   file if P2==0. 
2ca20 20 49 66 0a 2a 2a 20 50 32 3d 3d 31 20 74 68 65   If.** P2==1 the
2ca30 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  n the table to b
2ca40 65 20 63 6c 65 61 72 20 69 73 20 69 6e 20 74 68  e clear is in th
2ca50 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
2ca60 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 74 68 61  base file.** tha
2ca70 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
2ca80 72 65 20 74 61 62 6c 65 73 20 63 72 65 61 74 65  re tables create
2ca90 20 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45   using CREATE TE
2caa0 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 2e 0a 2a  MPORARY TABLE..*
2cab0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 76  *.** If the P3 v
2cac0 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
2cad0 2c 20 74 68 65 6e 20 74 68 65 20 74 61 62 6c 65  , then the table
2cae0 20 72 65 66 65 72 72 65 64 20 74 6f 20 6d 75 73   referred to mus
2caf0 74 20 62 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65  t be an.** intke
2cb00 79 20 74 61 62 6c 65 20 28 61 6e 20 53 51 4c 20  y table (an SQL 
2cb10 74 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 69 6e  table, not an in
2cb20 64 65 78 29 2e 20 49 6e 20 74 68 69 73 20 63 61  dex). In this ca
2cb30 73 65 20 74 68 65 20 72 6f 77 20 63 68 61 6e 67  se the row chang
2cb40 65 20 0a 2a 2a 20 63 6f 75 6e 74 20 69 73 20 69  e .** count is i
2cb50 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
2cb60 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2cb70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65   in the table be
2cb80 69 6e 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2a  ing cleared. .**
2cb90 20 49 66 20 50 33 20 69 73 20 67 72 65 61 74 65   If P3 is greate
2cba0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
2cbb0 6e 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  n the value stor
2cbc0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ed in register P
2cbd0 33 20 69 73 0a 2a 2a 20 61 6c 73 6f 20 69 6e 63  3 is.** also inc
2cbe0 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
2cbf0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2cc00 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  n the table bein
2cc10 67 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  g cleared..**.**
2cc20 20 53 65 65 20 61 6c 73 6f 3a 20 44 65 73 74 72   See also: Destr
2cc30 6f 79 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 43 6c  oy.*/.case OP_Cl
2cc40 65 61 72 3a 20 7b 0a 20 20 69 6e 74 20 6e 43 68  ear: {.  int nCh
2cc50 61 6e 67 65 3b 0a 20 0a 20 20 6e 43 68 61 6e 67  ange;. .  nChang
2cc60 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  e = 0;.  assert(
2cc70 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
2cc80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  );.  assert( DbM
2cc90 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65  askTest(p->btree
2cca0 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 32 29 20 29  Mask, pOp->p2) )
2ccb0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2ccc0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
2ccd0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 70  .      db->aDb[p
2cce0 4f 70 2d 3e 70 32 5d 2e 70 42 74 2c 20 70 4f 70  Op->p2].pBt, pOp
2ccf0 2d 3e 70 31 2c 20 28 70 4f 70 2d 3e 70 33 20 3f  ->p1, (pOp->p3 ?
2cd00 20 26 6e 43 68 61 6e 67 65 20 3a 20 30 29 0a 20   &nChange : 0). 
2cd10 20 29 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70   );.  if( pOp->p
2cd20 33 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 43 68 61  3 ){.    p->nCha
2cd30 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
2cd40 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 3e      if( pOp->p3>
2cd50 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
2cd60 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 26 61  t( memIsValid(&a
2cd70 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 29 20 29 3b  Mem[pOp->p3]) );
2cd80 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74 54  .      memAboutT
2cd90 6f 43 68 61 6e 67 65 28 70 2c 20 26 61 4d 65 6d  oChange(p, &aMem
2cda0 5b 70 4f 70 2d 3e 70 33 5d 29 3b 0a 20 20 20 20  [pOp->p3]);.    
2cdb0 20 20 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 2e    aMem[pOp->p3].
2cdc0 75 2e 69 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  u.i += nChange;.
2cdd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2cde0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
2cdf0 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
2ce00 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63  break;.}../* Opc
2ce10 6f 64 65 3a 20 52 65 73 65 74 53 6f 72 74 65 72  ode: ResetSorter
2ce20 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a   P1 * * * *.**.*
2ce30 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f 6e  * Delete all con
2ce40 74 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 65  tents from the e
2ce50 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
2ce60 72 20 73 6f 72 74 65 72 0a 2a 2a 20 74 68 61 74  r sorter.** that
2ce70 20 69 73 20 6f 70 65 6e 20 6f 6e 20 63 75 72 73   is open on curs
2ce80 6f 72 20 50 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  or P1..**.** Thi
2ce90 73 20 6f 70 63 6f 64 65 20 6f 6e 6c 79 20 77 6f  s opcode only wo
2cea0 72 6b 73 20 66 6f 72 20 63 75 72 73 6f 72 73 20  rks for cursors 
2ceb0 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
2cec0 20 61 6e 64 0a 2a 2a 20 6f 70 65 6e 65 64 20 77   and.** opened w
2ced0 69 74 68 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ith OP_OpenEphem
2cee0 65 72 61 6c 20 6f 72 20 4f 50 5f 53 6f 72 74 65  eral or OP_Sorte
2cef0 72 4f 70 65 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f  rOpen..*/.case O
2cf00 50 5f 52 65 73 65 74 53 6f 72 74 65 72 3a 20 7b  P_ResetSorter: {
2cf10 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
2cf20 43 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 70  C;. .  assert( p
2cf30 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70 4f 70  Op->p1>=0 && pOp
2cf40 2d 3e 70 31 3c 70 2d 3e 6e 43 75 72 73 6f 72 20  ->p1<p->nCursor 
2cf50 29 3b 0a 20 20 70 43 20 3d 20 70 2d 3e 61 70 43  );.  pC = p->apC
2cf60 73 72 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61  sr[pOp->p1];.  a
2cf70 73 73 65 72 74 28 20 70 43 21 3d 30 20 29 3b 0a  ssert( pC!=0 );.
2cf80 20 20 69 66 28 20 69 73 53 6f 72 74 65 72 28 70    if( isSorter(p
2cf90 43 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C) ){.    sqlite
2cfa0 33 56 64 62 65 53 6f 72 74 65 72 52 65 73 65 74  3VdbeSorterReset
2cfb0 28 64 62 2c 20 70 43 2d 3e 75 63 2e 70 53 6f 72  (db, pC->uc.pSor
2cfc0 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ter);.  }else{. 
2cfd0 20 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65     assert( pC->e
2cfe0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
2cff0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 61 73  _BTREE );.    as
2d000 73 65 72 74 28 20 70 43 2d 3e 69 73 45 70 68 65  sert( pC->isEphe
2d010 6d 65 72 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  meral );.    rc 
2d020 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2d030 65 61 72 54 61 62 6c 65 4f 66 43 75 72 73 6f 72  earTableOfCursor
2d040 28 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  (pC->uc.pCursor)
2d050 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d060 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f  oto abort_due_to
2d070 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 62 72  _error;.  }.  br
2d080 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2d090 65 3a 20 43 72 65 61 74 65 54 61 62 6c 65 20 50  e: CreateTable P
2d0a0 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79  1 P2 * * *.** Sy
2d0b0 6e 6f 70 73 69 73 3a 20 72 5b 50 32 5d 3d 72 6f  nopsis: r[P2]=ro
2d0c0 6f 74 20 69 44 62 3d 50 31 0a 2a 2a 0a 2a 2a 20  ot iDb=P1.**.** 
2d0d0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 74  Allocate a new t
2d0e0 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
2d0f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d100 66 20 50 31 3d 3d 30 20 6f 72 20 69 6e 20 74 68  f P1==0 or in th
2d110 65 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  e.** auxiliary d
2d120 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
2d130 50 31 3d 3d 31 20 6f 72 20 69 6e 20 61 6e 20 61  P1==1 or in an a
2d140 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
2d150 20 69 66 0a 2a 2a 20 50 31 3e 31 2e 20 20 57 72   if.** P1>1.  Wr
2d160 69 74 65 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ite the root pag
2d170 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2d180 6e 65 77 20 74 61 62 6c 65 20 69 6e 74 6f 0a 2a  new table into.*
2d190 2a 20 72 65 67 69 73 74 65 72 20 50 32 0a 2a 2a  * register P2.**
2d1a0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d1b0 63 65 20 62 65 74 77 65 65 6e 20 61 20 74 61 62  ce between a tab
2d1c0 6c 65 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20  le and an index 
2d1d0 69 73 20 74 68 69 73 3a 20 20 41 20 74 61 62 6c  is this:  A tabl
2d1e0 65 20 6d 75 73 74 0a 2a 2a 20 68 61 76 65 20 61  e must.** have a
2d1f0 20 34 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   4-byte integer 
2d200 6b 65 79 20 61 6e 64 20 63 61 6e 20 68 61 76 65  key and can have
2d210 20 61 72 62 69 74 72 61 72 79 20 64 61 74 61 2e   arbitrary data.
2d220 20 20 41 6e 20 69 6e 64 65 78 0a 2a 2a 20 68 61    An index.** ha
2d230 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6b  s an arbitrary k
2d240 65 79 20 62 75 74 20 6e 6f 20 64 61 74 61 2e 0a  ey but no data..
2d250 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
2d260 43 72 65 61 74 65 49 6e 64 65 78 0a 2a 2f 0a 2f  CreateIndex.*/./
2d270 2a 20 4f 70 63 6f 64 65 3a 20 43 72 65 61 74 65  * Opcode: Create
2d280 49 6e 64 65 78 20 50 31 20 50 32 20 2a 20 2a 20  Index P1 P2 * * 
2d290 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72  *.** Synopsis: r
2d2a0 5b 50 32 5d 3d 72 6f 6f 74 20 69 44 62 3d 50 31  [P2]=root iDb=P1
2d2b0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  .**.** Allocate 
2d2c0 61 20 6e 65 77 20 69 6e 64 65 78 20 69 6e 20 74  a new index in t
2d2d0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2d2e0 20 66 69 6c 65 20 69 66 20 50 31 3d 3d 30 20 6f   file if P1==0 o
2d2f0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 61 75 78 69  r in the.** auxi
2d300 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
2d310 69 6c 65 20 69 66 20 50 31 3d 3d 31 20 6f 72 20  ile if P1==1 or 
2d320 69 6e 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  in an attached d
2d330 61 74 61 62 61 73 65 20 69 66 0a 2a 2a 20 50 31  atabase if.** P1
2d340 3e 31 2e 20 20 57 72 69 74 65 20 74 68 65 20 72  >1.  Write the r
2d350 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
2d360 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2d370 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65   into.** registe
2d380 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  r P2..**.** See 
2d390 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e  documentation on
2d3a0 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
2d3b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
2d3c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 63  nformation..*/.c
2d3d0 61 73 65 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  ase OP_CreateInd
2d3e0 65 78 3a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ex:            /
2d3f0 2a 20 6f 75 74 32 20 2a 2f 0a 63 61 73 65 20 4f  * out2 */.case O
2d400 50 5f 43 72 65 61 74 65 54 61 62 6c 65 3a 20 7b  P_CreateTable: {
2d410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 75 74            /* out
2d420 32 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 3b  2 */.  int pgno;
2d430 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20  .  int flags;.  
2d440 44 62 20 2a 70 44 62 3b 0a 0a 20 20 70 4f 75 74  Db *pDb;..  pOut
2d450 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61 73   = out2Prereleas
2d460 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 67 6e  e(p, pOp);.  pgn
2d470 6f 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  o = 0;.  assert(
2d480 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
2d490 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
2d4a0 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  ;.  assert( DbMa
2d4b0 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65 65 4d  skTest(p->btreeM
2d4c0 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20 29 3b  ask, pOp->p1) );
2d4d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
2d4e0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 70  adOnly==0 );.  p
2d4f0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 70 4f  Db = &db->aDb[pO
2d500 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
2d510 28 20 70 44 62 2d 3e 70 42 74 21 3d 30 20 29 3b  ( pDb->pBt!=0 );
2d520 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
2d530 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62  de==OP_CreateTab
2d540 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 66 6c 61  le ){.    /* fla
2d550 67 73 20 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45  gs = BTREE_INTKE
2d560 59 3b 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  Y; */.    flags 
2d570 3d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 3b 0a  = BTREE_INTKEY;.
2d580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
2d590 67 73 20 3d 20 42 54 52 45 45 5f 42 4c 4f 42 4b  gs = BTREE_BLOBK
2d5a0 45 59 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EY;.  }.  rc = s
2d5b0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
2d5c0 65 54 61 62 6c 65 28 70 44 62 2d 3e 70 42 74 2c  eTable(pDb->pBt,
2d5d0 20 26 70 67 6e 6f 2c 20 66 6c 61 67 73 29 3b 0a   &pgno, flags);.
2d5e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2d5f0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
2d600 6f 72 3b 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20  or;.  pOut->u.i 
2d610 3d 20 70 67 6e 6f 3b 0a 20 20 62 72 65 61 6b 3b  = pgno;.  break;
2d620 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  .}../* Opcode: P
2d630 61 72 73 65 53 63 68 65 6d 61 20 50 31 20 2a 20  arseSchema P1 * 
2d640 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61  * P4 *.**.** Rea
2d650 64 20 61 6e 64 20 70 61 72 73 65 20 61 6c 6c 20  d and parse all 
2d660 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
2d670 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
2d680 61 62 6c 65 20 6f 66 20 64 61 74 61 62 61 73 65  able of database
2d690 20 50 31 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63   P1.** that matc
2d6a0 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
2d6b0 73 65 20 50 34 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  se P4. .**.** Th
2d6c0 69 73 20 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65  is opcode invoke
2d6d0 73 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  s the parser to 
2d6e0 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  create a new vir
2d6f0 74 75 61 6c 20 6d 61 63 68 69 6e 65 2c 0a 2a 2a  tual machine,.**
2d700 20 74 68 65 6e 20 72 75 6e 73 20 74 68 65 20 6e   then runs the n
2d710 65 77 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ew virtual machi
2d720 6e 65 2e 20 20 49 74 20 69 73 20 74 68 75 73 20  ne.  It is thus 
2d730 61 20 72 65 2d 65 6e 74 72 61 6e 74 20 6f 70 63  a re-entrant opc
2d740 6f 64 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f  ode..*/.case OP_
2d750 50 61 72 73 65 53 63 68 65 6d 61 3a 20 7b 0a 20  ParseSchema: {. 
2d760 20 69 6e 74 20 69 44 62 3b 0a 20 20 63 6f 6e 73   int iDb;.  cons
2d770 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 3b  t char *zMaster;
2d780 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
2d790 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61   InitData initDa
2d7a0 74 61 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 70 72  ta;..  /* Any pr
2d7b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
2d7c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 74 68   that invokes th
2d7d0 69 73 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 68  is opcode will h
2d7e0 6f 6c 64 20 6d 75 74 65 78 65 73 0a 20 20 2a 2a  old mutexes.  **
2d7f0 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 2e   on every btree.
2d800 20 20 54 68 69 73 20 69 73 20 61 20 70 72 65 72    This is a prer
2d810 65 71 75 69 73 69 74 65 20 66 6f 72 20 69 6e 76  equisite for inv
2d820 6f 6b 69 6e 67 20 0a 20 20 2a 2a 20 73 71 6c 69  oking .  ** sqli
2d830 74 65 33 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28  te3InitCallback(
2d840 29 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  )..  */.#ifdef S
2d850 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
2d860 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
2d870 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
2d880 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 31    assert( iDb==1
2d890 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
2d8a0 48 6f 6c 64 73 4d 75 74 65 78 28 64 62 2d 3e 61  HoldsMutex(db->a
2d8b0 44 62 5b 69 44 62 5d 2e 70 42 74 29 20 29 3b 0a  Db[iDb].pBt) );.
2d8c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 44    }.#endif..  iD
2d8d0 62 20 3d 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 61  b = pOp->p1;.  a
2d8e0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
2d8f0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
2d900 20 20 61 73 73 65 72 74 28 20 44 62 48 61 73 50    assert( DbHasP
2d910 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
2d920 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
2d930 29 20 29 3b 0a 20 20 2f 2a 20 55 73 65 64 20 74  ) );.  /* Used t
2d940 6f 20 62 65 20 61 20 63 6f 6e 64 69 74 69 6f 6e  o be a condition
2d950 61 6c 20 2a 2f 20 7b 0a 20 20 20 20 7a 4d 61 73  al */ {.    zMas
2d960 74 65 72 20 3d 20 4d 41 53 54 45 52 5f 4e 41 4d  ter = MASTER_NAM
2d970 45 3b 0a 20 20 20 20 69 6e 69 74 44 61 74 61 2e  E;.    initData.
2d980 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69  db = db;.    ini
2d990 74 44 61 74 61 2e 69 44 62 20 3d 20 70 4f 70 2d  tData.iDb = pOp-
2d9a0 3e 70 31 3b 0a 20 20 20 20 69 6e 69 74 44 61 74  >p1;.    initDat
2d9b0 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 70 2d  a.pzErrMsg = &p-
2d9c0 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 7a 53  >zErrMsg;.    zS
2d9d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  ql = sqlite3MPri
2d9e0 6e 74 66 28 64 62 2c 0a 20 20 20 20 20 20 20 22  ntf(db,.       "
2d9f0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72 6f 6f  SELECT name, roo
2da00 74 70 61 67 65 2c 20 73 71 6c 20 46 52 4f 4d 20  tpage, sql FROM 
2da10 27 25 71 27 2e 25 73 20 57 48 45 52 45 20 25 73  '%q'.%s WHERE %s
2da20 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22   ORDER BY rowid"
2da30 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ,.       db->aDb
2da40 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
2da50 7a 4d 61 73 74 65 72 2c 20 70 4f 70 2d 3e 70 34  zMaster, pOp->p4
2da60 2e 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  .z);.    if( zSq
2da70 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
2da80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2da90 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2daa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
2dab0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
2dac0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
2dad0 74 2e 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  t.busy = 1;.    
2dae0 20 20 69 6e 69 74 44 61 74 61 2e 72 63 20 3d 20    initData.rc = 
2daf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2db00 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
2db10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
2db20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2db30 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
2db40 73 71 6c 69 74 65 33 49 6e 69 74 43 61 6c 6c 62  sqlite3InitCallb
2db50 61 63 6b 2c 20 26 69 6e 69 74 44 61 74 61 2c 20  ack, &initData, 
2db60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2db70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
2db80 20 3d 20 69 6e 69 74 44 61 74 61 2e 72 63 3b 0a   = initData.rc;.
2db90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2dba0 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
2dbb0 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
2dbc0 73 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sy = 0;.    }.  
2dbd0 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
2dbe0 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c    sqlite3ResetAl
2dbf0 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
2dc00 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tion(db);.    if
2dc10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2dc20 45 4d 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  EM ){.      goto
2dc30 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20   no_mem;.    }. 
2dc40 20 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75     goto abort_du
2dc50 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  e_to_error;.  }.
2dc60 20 20 62 72 65 61 6b 3b 20 20 0a 7d 0a 0a 23 69    break;  .}..#i
2dc70 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2dc80 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 29 0a  E_OMIT_ANALYZE).
2dc90 2f 2a 20 4f 70 63 6f 64 65 3a 20 4c 6f 61 64 41  /* Opcode: LoadA
2dca0 6e 61 6c 79 73 69 73 20 50 31 20 2a 20 2a 20 2a  nalysis P1 * * *
2dcb0 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 61 64 20 74 68   *.**.** Read th
2dcc0 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
2dcd0 61 62 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  able for databas
2dce0 65 20 50 31 20 61 6e 64 20 6c 6f 61 64 20 74 68  e P1 and load th
2dcf0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
2dd00 74 68 61 74 20 74 61 62 6c 65 20 69 6e 74 6f 20  that table into 
2dd10 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 69 6e 64  the internal ind
2dd20 65 78 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  ex hash table.  
2dd30 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  This will cause.
2dd40 2a 2a 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  ** the analysis 
2dd50 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
2dd60 70 72 65 70 61 72 69 6e 67 20 61 6c 6c 20 73 75  preparing all su
2dd70 62 73 65 71 75 65 6e 74 20 71 75 65 72 69 65 73  bsequent queries
2dd80 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4c 6f 61  ..*/.case OP_Loa
2dd90 64 41 6e 61 6c 79 73 69 73 3a 20 7b 0a 20 20 61  dAnalysis: {.  a
2dda0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 31 3e 3d  ssert( pOp->p1>=
2ddb0 30 20 26 26 20 70 4f 70 2d 3e 70 31 3c 64 62 2d  0 && pOp->p1<db-
2ddc0 3e 6e 44 62 20 29 3b 0a 20 20 72 63 20 3d 20 73  >nDb );.  rc = s
2ddd0 71 6c 69 74 65 33 41 6e 61 6c 79 73 69 73 4c 6f  qlite3AnalysisLo
2dde0 61 64 28 64 62 2c 20 70 4f 70 2d 3e 70 31 29 3b  ad(db, pOp->p1);
2ddf0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2de00 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
2de10 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 20 20 0a  ror;.  break;  .
2de20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2de30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2de40 5f 41 4e 41 4c 59 5a 45 29 20 2a 2f 0a 0a 2f 2a  _ANALYZE) */../*
2de50 20 4f 70 63 6f 64 65 3a 20 44 72 6f 70 54 61 62   Opcode: DropTab
2de60 6c 65 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a  le P1 * * P4 *.*
2de70 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2de80 69 6e 74 65 72 6e 61 6c 20 28 69 6e 2d 6d 65 6d  internal (in-mem
2de90 6f 72 79 29 20 64 61 74 61 20 73 74 72 75 63 74  ory) data struct
2dea0 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
2deb0 62 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  be.** the table 
2dec0 6e 61 6d 65 64 20 50 34 20 69 6e 20 64 61 74 61  named P4 in data
2ded0 62 61 73 65 20 50 31 2e 20 20 54 68 69 73 20 69  base P1.  This i
2dee0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
2def0 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 64 72 6f   table.** is dro
2df00 70 70 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28  pped from disk (
2df10 75 73 69 6e 67 20 74 68 65 20 44 65 73 74 72 6f  using the Destro
2df20 79 20 6f 70 63 6f 64 65 29 20 69 6e 20 6f 72 64  y opcode) in ord
2df30 65 72 20 74 6f 20 6b 65 65 70 20 0a 2a 2a 20 74  er to keep .** t
2df40 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
2df50 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2df60 65 0a 2a 2a 20 73 63 68 65 6d 61 20 63 6f 6e 73  e.** schema cons
2df70 69 73 74 65 6e 74 20 77 69 74 68 20 77 68 61 74  istent with what
2df80 20 69 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a   is on disk..*/.
2df90 63 61 73 65 20 4f 50 5f 44 72 6f 70 54 61 62 6c  case OP_DropTabl
2dfa0 65 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 55 6e  e: {.  sqlite3Un
2dfb0 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
2dfc0 6c 65 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20  le(db, pOp->p1, 
2dfd0 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72  pOp->p4.z);.  br
2dfe0 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64  eak;.}../* Opcod
2dff0 65 3a 20 44 72 6f 70 49 6e 64 65 78 20 50 31 20  e: DropIndex P1 
2e000 2a 20 2a 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52  * * P4 *.**.** R
2e010 65 6d 6f 76 65 20 74 68 65 20 69 6e 74 65 72 6e  emove the intern
2e020 61 6c 20 28 69 6e 2d 6d 65 6d 6f 72 79 29 20 64  al (in-memory) d
2e030 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
2e040 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
2e050 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
2e060 50 34 20 69 6e 20 64 61 74 61 62 61 73 65 20 50  P4 in database P
2e070 31 2e 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c  1.  This is call
2e080 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e 64 65  ed after an inde
2e090 78 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20  x.** is dropped 
2e0a0 66 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e 67  from disk (using
2e0b0 20 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 63   the Destroy opc
2e0c0 6f 64 65 29 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  ode).** in order
2e0d0 20 74 6f 20 6b 65 65 70 20 74 68 65 20 69 6e 74   to keep the int
2e0e0 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
2e0f0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
2e100 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
2e110 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
2e120 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
2e130 50 5f 44 72 6f 70 49 6e 64 65 78 3a 20 7b 0a 20  P_DropIndex: {. 
2e140 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
2e150 64 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c  dDeleteIndex(db,
2e160 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
2e170 34 2e 7a 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  4.z);.  break;.}
2e180 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 44 72 6f  ../* Opcode: Dro
2e190 70 54 72 69 67 67 65 72 20 50 31 20 2a 20 2a 20  pTrigger P1 * * 
2e1a0 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  P4 *.**.** Remov
2e1b0 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 28  e the internal (
2e1c0 69 6e 2d 6d 65 6d 6f 72 79 29 20 64 61 74 61 20  in-memory) data 
2e1d0 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
2e1e0 64 65 73 63 72 69 62 65 0a 2a 2a 20 74 68 65 20  describe.** the 
2e1f0 74 72 69 67 67 65 72 20 6e 61 6d 65 64 20 50 34  trigger named P4
2e200 20 69 6e 20 64 61 74 61 62 61 73 65 20 50 31 2e   in database P1.
2e210 20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64    This is called
2e220 20 61 66 74 65 72 20 61 20 74 72 69 67 67 65 72   after a trigger
2e230 0a 2a 2a 20 69 73 20 64 72 6f 70 70 65 64 20 66  .** is dropped f
2e240 72 6f 6d 20 64 69 73 6b 20 28 75 73 69 6e 67 20  rom disk (using 
2e250 74 68 65 20 44 65 73 74 72 6f 79 20 6f 70 63 6f  the Destroy opco
2e260 64 65 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  de) in order to 
2e270 6b 65 65 70 20 0a 2a 2a 20 74 68 65 20 69 6e 74  keep .** the int
2e280 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61  ernal representa
2e290 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73  tion of the.** s
2e2a0 63 68 65 6d 61 20 63 6f 6e 73 69 73 74 65 6e 74  chema consistent
2e2b0 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
2e2c0 20 64 69 73 6b 2e 0a 2a 2f 0a 63 61 73 65 20 4f   disk..*/.case O
2e2d0 50 5f 44 72 6f 70 54 72 69 67 67 65 72 3a 20 7b  P_DropTrigger: {
2e2e0 0a 20 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  .  sqlite3Unlink
2e2f0 41 6e 64 44 65 6c 65 74 65 54 72 69 67 67 65 72  AndDeleteTrigger
2e300 28 64 62 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  (db, pOp->p1, pO
2e310 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 62 72 65 61  p->p4.z);.  brea
2e320 6b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  k;.}...#ifndef S
2e330 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2e340 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 20 4f 70  RITY_CHECK./* Op
2e350 63 6f 64 65 3a 20 49 6e 74 65 67 72 69 74 79 43  code: IntegrityC
2e360 6b 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  k P1 P2 P3 P4 P5
2e370 0a 2a 2a 0a 2a 2a 20 44 6f 20 61 6e 20 61 6e 61  .**.** Do an ana
2e380 6c 79 73 69 73 20 6f 66 20 74 68 65 20 63 75 72  lysis of the cur
2e390 72 65 6e 74 6c 79 20 6f 70 65 6e 20 64 61 74 61  rently open data
2e3a0 62 61 73 65 2e 20 20 53 74 6f 72 65 20 69 6e 0a  base.  Store in.
2e3b0 2a 2a 20 72 65 67 69 73 74 65 72 20 50 31 20 74  ** register P1 t
2e3c0 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 72  he text of an er
2e3d0 72 6f 72 20 6d 65 73 73 61 67 65 20 64 65 73 63  ror message desc
2e3e0 72 69 62 69 6e 67 20 61 6e 79 20 70 72 6f 62 6c  ribing any probl
2e3f0 65 6d 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 70 72  ems..** If no pr
2e400 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
2e410 2c 20 73 74 6f 72 65 20 61 20 4e 55 4c 4c 20 69  , store a NULL i
2e420 6e 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a  n register P1..*
2e430 2a 0a 2a 2a 20 54 68 65 20 72 65 67 69 73 74 65  *.** The registe
2e440 72 20 50 33 20 63 6f 6e 74 61 69 6e 73 20 74 68  r P3 contains th
2e450 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2e460 20 6f 66 20 61 6c 6c 6f 77 65 64 20 65 72 72 6f   of allowed erro
2e470 72 73 2e 0a 2a 2a 20 41 74 20 6d 6f 73 74 20 72  rs..** At most r
2e480 65 67 28 50 33 29 20 65 72 72 6f 72 73 20 77 69  eg(P3) errors wi
2e490 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 2e 0a  ll be reported..
2e4a0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
2e4b0 73 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  s, the analysis 
2e4c0 73 74 6f 70 73 20 61 73 20 73 6f 6f 6e 20 61 73  stops as soon as
2e4d0 20 72 65 67 28 50 31 29 20 65 72 72 6f 72 73 20   reg(P1) errors 
2e4e0 61 72 65 20 0a 2a 2a 20 73 65 65 6e 2e 20 20 52  are .** seen.  R
2e4f0 65 67 28 50 31 29 20 69 73 20 75 70 64 61 74 65  eg(P1) is update
2e500 64 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65  d with the numbe
2e510 72 20 6f 66 20 65 72 72 6f 72 73 20 72 65 6d 61  r of errors rema
2e520 69 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ining..**.** The
2e530 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
2e540 72 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  rs of all tables
2e550 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2e560 20 61 72 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a   are integers.**
2e570 20 73 74 6f 72 65 64 20 69 6e 20 50 34 5f 49 4e   stored in P4_IN
2e580 54 41 52 52 41 59 20 61 72 67 75 6d 65 6e 74 2e  TARRAY argument.
2e590 0a 2a 2a 0a 2a 2a 20 49 66 20 50 35 20 69 73 20  .**.** If P5 is 
2e5a0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 20 63 68  not zero, the ch
2e5b0 65 63 6b 20 69 73 20 64 6f 6e 65 20 6f 6e 20 74  eck is done on t
2e5c0 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
2e5d0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2c 20 6e  abase.** file, n
2e5e0 6f 74 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ot the main data
2e5f0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2e600 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
2e610 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
2e620 74 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 5f  t the integrity_
2e630 63 68 65 63 6b 20 70 72 61 67 6d 61 2e 0a 2a 2f  check pragma..*/
2e640 0a 63 61 73 65 20 4f 50 5f 49 6e 74 65 67 72 69  .case OP_Integri
2e650 74 79 43 6b 3a 20 7b 0a 20 20 69 6e 74 20 6e 52  tyCk: {.  int nR
2e660 6f 6f 74 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  oot;      /* Num
2e670 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ber of tables to
2e680 20 63 68 65 63 6b 2e 20 20 28 4e 75 6d 62 65 72   check.  (Number
2e690 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 2e 29   of root pages.)
2e6a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
2e6b0 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2e6c0 66 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  f rootpage numbe
2e6d0 72 73 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  rs for tables to
2e6e0 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
2e6f0 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20   int nErr;      
2e700 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
2e710 72 6f 72 73 20 72 65 70 6f 72 74 65 64 20 2a 2f  rors reported */
2e720 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
2e730 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
2e740 65 20 65 72 72 6f 72 20 72 65 70 6f 72 74 20 2a  e error report *
2e750 2f 0a 20 20 4d 65 6d 20 2a 70 6e 45 72 72 3b 20  /.  Mem *pnErr; 
2e760 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
2e770 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
2e780 20 65 72 72 6f 72 73 20 72 65 6d 61 69 6e 69 6e   errors remainin
2e790 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
2e7a0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a  p->bIsReader );.
2e7b0 20 20 6e 52 6f 6f 74 20 3d 20 70 4f 70 2d 3e 70    nRoot = pOp->p
2e7c0 32 3b 0a 20 20 61 52 6f 6f 74 20 3d 20 70 4f 70  2;.  aRoot = pOp
2e7d0 2d 3e 70 34 2e 61 69 3b 0a 20 20 61 73 73 65 72  ->p4.ai;.  asser
2e7e0 74 28 20 6e 52 6f 6f 74 3e 30 20 29 3b 0a 20 20  t( nRoot>0 );.  
2e7f0 61 73 73 65 72 74 28 20 61 52 6f 6f 74 5b 6e 52  assert( aRoot[nR
2e800 6f 6f 74 5d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  oot]==0 );.  ass
2e810 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26  ert( pOp->p3>0 &
2e820 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e  & pOp->p3<=(p->n
2e830 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73  Mem+1 - p->nCurs
2e840 6f 72 29 20 29 3b 0a 20 20 70 6e 45 72 72 20 3d  or) );.  pnErr =
2e850 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
2e860 0a 20 20 61 73 73 65 72 74 28 20 28 70 6e 45 72  .  assert( (pnEr
2e870 72 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  r->flags & MEM_I
2e880 6e 74 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  nt)!=0 );.  asse
2e890 72 74 28 20 28 70 6e 45 72 72 2d 3e 66 6c 61 67  rt( (pnErr->flag
2e8a0 73 20 26 20 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  s & (MEM_Str|MEM
2e8b0 5f 42 6c 6f 62 29 29 3d 3d 30 20 29 3b 0a 20 20  _Blob))==0 );.  
2e8c0 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70  pIn1 = &aMem[pOp
2e8d0 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ->p1];.  assert(
2e8e0 20 70 4f 70 2d 3e 70 35 3c 64 62 2d 3e 6e 44 62   pOp->p5<db->nDb
2e8f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
2e900 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
2e910 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 35 29 20  eMask, pOp->p5) 
2e920 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
2e930 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43 68  BtreeIntegrityCh
2e940 65 63 6b 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d  eck(db->aDb[pOp-
2e950 3e 70 35 5d 2e 70 42 74 2c 20 61 52 6f 6f 74 2c  >p5].pBt, aRoot,
2e960 20 6e 52 6f 6f 74 2c 0a 20 20 20 20 20 20 20 20   nRoot,.        
2e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e980 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 6e           (int)pn
2e990 45 72 72 2d 3e 75 2e 69 2c 20 26 6e 45 72 72 29  Err->u.i, &nErr)
2e9a0 3b 0a 20 20 70 6e 45 72 72 2d 3e 75 2e 69 20 2d  ;.  pnErr->u.i -
2e9b0 3d 20 6e 45 72 72 3b 0a 20 20 73 71 6c 69 74 65  = nErr;.  sqlite
2e9c0 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28  3VdbeMemSetNull(
2e9d0 70 49 6e 31 29 3b 0a 20 20 69 66 28 20 6e 45 72  pIn1);.  if( nEr
2e9e0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  r==0 ){.    asse
2e9f0 72 74 28 20 7a 3d 3d 30 20 29 3b 0a 20 20 7d 65  rt( z==0 );.  }e
2ea00 6c 73 65 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  lse if( z==0 ){.
2ea10 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
2ea20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2ea30 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
2ea40 74 72 28 70 49 6e 31 2c 20 7a 2c 20 2d 31 2c 20  tr(pIn1, z, -1, 
2ea50 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
2ea60 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
2ea70 20 20 55 50 44 41 54 45 5f 4d 41 58 5f 42 4c 4f    UPDATE_MAX_BLO
2ea80 42 53 49 5a 45 28 70 49 6e 31 29 3b 0a 20 20 73  BSIZE(pIn1);.  s
2ea90 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2eaa0 45 6e 63 6f 64 69 6e 67 28 70 49 6e 31 2c 20 65  Encoding(pIn1, e
2eab0 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 62 72 65 61  ncoding);.  brea
2eac0 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  k;.}.#endif /* S
2ead0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2eae0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f  RITY_CHECK */../
2eaf0 2a 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74  * Opcode: RowSet
2eb00 41 64 64 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  Add P1 P2 * * *.
2eb10 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 72 6f 77  ** Synopsis: row
2eb20 73 65 74 28 50 31 29 3d 72 5b 50 32 5d 0a 2a 2a  set(P1)=r[P2].**
2eb30 0a 2a 2a 20 49 6e 73 65 72 74 20 74 68 65 20 69  .** Insert the i
2eb40 6e 74 65 67 65 72 20 76 61 6c 75 65 20 68 65 6c  nteger value hel
2eb50 64 20 62 79 20 72 65 67 69 73 74 65 72 20 50 32  d by register P2
2eb60 20 69 6e 74 6f 20 61 20 62 6f 6f 6c 65 61 6e 20   into a boolean 
2eb70 69 6e 64 65 78 0a 2a 2a 20 68 65 6c 64 20 69 6e  index.** held in
2eb80 20 72 65 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a   register P1..**
2eb90 0a 2a 2a 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  .** An assertion
2eba0 20 66 61 69 6c 73 20 69 66 20 50 32 20 69 73 20   fails if P2 is 
2ebb0 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a  not an integer..
2ebc0 2a 2f 0a 63 61 73 65 20 4f 50 5f 52 6f 77 53 65  */.case OP_RowSe
2ebd0 74 41 64 64 3a 20 7b 20 20 20 20 20 20 20 2f 2a  tAdd: {       /*
2ebe0 20 69 6e 31 2c 20 69 6e 32 20 2a 2f 0a 20 20 70   in1, in2 */.  p
2ebf0 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d  In1 = &aMem[pOp-
2ec00 3e 70 31 5d 3b 0a 20 20 70 49 6e 32 20 3d 20 26  >p1];.  pIn2 = &
2ec10 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32 5d 3b 0a 20  aMem[pOp->p2];. 
2ec20 20 61 73 73 65 72 74 28 20 28 70 49 6e 32 2d 3e   assert( (pIn2->
2ec30 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
2ec40 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 49  !=0 );.  if( (pI
2ec50 6e 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  n1->flags & MEM_
2ec60 52 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20  RowSet)==0 ){.  
2ec70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
2ec80 53 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b  SetRowSet(pIn1);
2ec90 0a 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e  .    if( (pIn1->
2eca0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
2ecb0 65 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f  et)==0 ) goto no
2ecc0 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  _mem;.  }.  sqli
2ecd0 74 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28  te3RowSetInsert(
2ece0 70 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c  pIn1->u.pRowSet,
2ecf0 20 70 49 6e 32 2d 3e 75 2e 69 29 3b 0a 20 20 62   pIn2->u.i);.  b
2ed00 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f  reak;.}../* Opco
2ed10 64 65 3a 20 52 6f 77 53 65 74 52 65 61 64 20 50  de: RowSetRead P
2ed20 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a 20 53  1 P2 P3 * *.** S
2ed30 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d 3d 72  ynopsis: r[P3]=r
2ed40 6f 77 73 65 74 28 50 31 29 0a 2a 2a 0a 2a 2a 20  owset(P1).**.** 
2ed50 45 78 74 72 61 63 74 20 74 68 65 20 73 6d 61 6c  Extract the smal
2ed60 6c 65 73 74 20 76 61 6c 75 65 20 66 72 6f 6d 20  lest value from 
2ed70 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50 31  boolean index P1
2ed80 20 61 6e 64 20 70 75 74 20 74 68 61 74 20 76 61   and put that va
2ed90 6c 75 65 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  lue into.** regi
2eda0 73 74 65 72 20 50 33 2e 20 20 4f 72 2c 20 69 66  ster P3.  Or, if
2edb0 20 62 6f 6f 6c 65 61 6e 20 69 6e 64 65 78 20 50   boolean index P
2edc0 31 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 65  1 is initially e
2edd0 6d 70 74 79 2c 20 6c 65 61 76 65 20 50 33 0a 2a  mpty, leave P3.*
2ede0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
2edf0 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74  jump to instruct
2ee00 69 6f 6e 20 50 32 2e 0a 2a 2f 0a 63 61 73 65 20  ion P2..*/.case 
2ee10 4f 50 5f 52 6f 77 53 65 74 52 65 61 64 3a 20 7b  OP_RowSetRead: {
2ee20 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2ee30 69 6e 31 2c 20 6f 75 74 33 20 2a 2f 0a 20 20 69  in1, out3 */.  i
2ee40 36 34 20 76 61 6c 3b 0a 0a 20 20 70 49 6e 31 20  64 val;..  pIn1 
2ee50 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d  = &aMem[pOp->p1]
2ee60 3b 0a 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66  ;.  if( (pIn1->f
2ee70 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
2ee80 74 29 3d 3d 30 20 0a 20 20 20 7c 7c 20 73 71 6c  t)==0 .   || sql
2ee90 69 74 65 33 52 6f 77 53 65 74 4e 65 78 74 28 70  ite3RowSetNext(p
2eea0 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
2eeb0 26 76 61 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  &val)==0.  ){.  
2eec0 20 20 2f 2a 20 54 68 65 20 62 6f 6f 6c 65 61 6e    /* The boolean
2eed0 20 69 6e 64 65 78 20 69 73 20 65 6d 70 74 79 20   index is empty 
2eee0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
2eef0 62 65 4d 65 6d 53 65 74 4e 75 6c 6c 28 70 49 6e  beMemSetNull(pIn
2ef00 31 29 3b 0a 20 20 20 20 56 64 62 65 42 72 61 6e  1);.    VdbeBran
2ef10 63 68 54 61 6b 65 6e 28 31 2c 32 29 3b 0a 20 20  chTaken(1,2);.  
2ef20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70    goto jump_to_p
2ef30 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f 72 5f  2_and_check_for_
2ef40 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d 65 6c  interrupt;.  }el
2ef50 73 65 7b 0a 20 20 20 20 2f 2a 20 41 20 76 61 6c  se{.    /* A val
2ef60 75 65 20 77 61 73 20 70 75 6c 6c 65 64 20 66 72  ue was pulled fr
2ef70 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  om the index */.
2ef80 20 20 20 20 56 64 62 65 42 72 61 6e 63 68 54 61      VdbeBranchTa
2ef90 6b 65 6e 28 30 2c 32 29 3b 0a 20 20 20 20 73 71  ken(0,2);.    sq
2efa0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 49  lite3VdbeMemSetI
2efb0 6e 74 36 34 28 26 61 4d 65 6d 5b 70 4f 70 2d 3e  nt64(&aMem[pOp->
2efc0 70 33 5d 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20  p3], val);.  }. 
2efd0 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f 72 5f   goto check_for_
2efe0 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a  interrupt;.}../*
2eff0 20 4f 70 63 6f 64 65 3a 20 52 6f 77 53 65 74 54   Opcode: RowSetT
2f000 65 73 74 20 50 31 20 50 32 20 50 33 20 50 34 0a  est P1 P2 P3 P4.
2f010 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
2f020 72 5b 50 33 5d 20 69 6e 20 72 6f 77 73 65 74 28  r[P3] in rowset(
2f030 50 31 29 20 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a  P1) goto P2.**.*
2f040 2a 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73  * Register P3 is
2f050 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64   assumed to hold
2f060 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
2f070 72 20 76 61 6c 75 65 2e 20 49 66 20 72 65 67 69  r value. If regi
2f080 73 74 65 72 20 50 31 0a 2a 2a 20 63 6f 6e 74 61  ster P1.** conta
2f090 69 6e 73 20 61 20 52 6f 77 53 65 74 20 6f 62 6a  ins a RowSet obj
2f0a0 65 63 74 20 61 6e 64 20 74 68 61 74 20 52 6f 77  ect and that Row
2f0b0 53 65 74 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  Set object conta
2f0c0 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
2f0d0 20 68 65 6c 64 20 69 6e 20 50 33 2c 20 6a 75 6d   held in P3, jum
2f0e0 70 20 74 6f 20 72 65 67 69 73 74 65 72 20 50 32  p to register P2
2f0f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 73  . Otherwise, ins
2f100 65 72 74 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67  ert the.** integ
2f110 65 72 20 69 6e 20 50 33 20 69 6e 74 6f 20 74 68  er in P3 into th
2f120 65 20 52 6f 77 53 65 74 20 61 6e 64 20 63 6f 6e  e RowSet and con
2f130 74 69 6e 75 65 20 6f 6e 20 74 6f 20 74 68 65 0a  tinue on to the.
2f140 2a 2a 20 6e 65 78 74 20 6f 70 63 6f 64 65 2e 0a  ** next opcode..
2f150 2a 2a 0a 2a 2a 20 54 68 65 20 52 6f 77 53 65 74  **.** The RowSet
2f160 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 74 69 6d   object is optim
2f170 69 7a 65 64 20 66 6f 72 20 74 68 65 20 63 61 73  ized for the cas
2f180 65 20 77 68 65 72 65 20 73 75 63 63 65 73 73 69  e where successi
2f190 76 65 20 73 65 74 73 0a 2a 2a 20 6f 66 20 69 6e  ve sets.** of in
2f1a0 74 65 67 65 72 73 2c 20 77 68 65 72 65 20 65 61  tegers, where ea
2f1b0 63 68 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  ch set contains 
2f1c0 6e 6f 20 64 75 70 6c 69 63 61 74 65 73 2e 20 45  no duplicates. E
2f1d0 61 63 68 20 73 65 74 0a 2a 2a 20 6f 66 20 76 61  ach set.** of va
2f1e0 6c 75 65 73 20 69 73 20 69 64 65 6e 74 69 66 69  lues is identifi
2f1f0 65 64 20 62 79 20 61 20 75 6e 69 71 75 65 20 50  ed by a unique P
2f200 34 20 76 61 6c 75 65 2e 20 54 68 65 20 66 69 72  4 value. The fir
2f210 73 74 20 73 65 74 0a 2a 2a 20 6d 75 73 74 20 68  st set.** must h
2f220 61 76 65 20 50 34 3d 3d 30 2c 20 74 68 65 20 66  ave P4==0, the f
2f230 69 6e 61 6c 20 73 65 74 20 50 34 3d 2d 31 2e 20  inal set P4=-1. 
2f240 20 50 34 20 6d 75 73 74 20 62 65 20 65 69 74 68   P4 must be eith
2f250 65 72 20 2d 31 20 6f 72 0a 2a 2a 20 6e 6f 6e 2d  er -1 or.** non-
2f260 6e 65 67 61 74 69 76 65 2e 20 20 46 6f 72 20 6e  negative.  For n
2f270 6f 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75  on-negative valu
2f280 65 73 20 6f 66 20 50 34 20 6f 6e 6c 79 20 74 68  es of P4 only th
2f290 65 20 6c 6f 77 65 72 20 34 0a 2a 2a 20 62 69 74  e lower 4.** bit
2f2a0 73 20 61 72 65 20 73 69 67 6e 69 66 69 63 61 6e  s are significan
2f2b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  t..**.** This al
2f2c0 6c 6f 77 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  lows optimizatio
2f2d0 6e 73 3a 20 28 61 29 20 77 68 65 6e 20 50 34 3d  ns: (a) when P4=
2f2e0 3d 30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  =0 there is no n
2f2f0 65 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  eed to test.** t
2f300 68 65 20 72 6f 77 73 65 74 20 6f 62 6a 65 63 74  he rowset object
2f310 20 66 6f 72 20 50 33 2c 20 61 73 20 69 74 20 69   for P3, as it i
2f320 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e 6f 74  s guaranteed not
2f330 20 74 6f 20 63 6f 6e 74 61 69 6e 20 69 74 2c 0a   to contain it,.
2f340 2a 2a 20 28 62 29 20 77 68 65 6e 20 50 34 3d 3d  ** (b) when P4==
2f350 2d 31 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  -1 there is no n
2f360 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  eed to insert th
2f370 65 20 76 61 6c 75 65 2c 20 61 73 20 69 74 20 77  e value, as it w
2f380 69 6c 6c 0a 2a 2a 20 6e 65 76 65 72 20 62 65 20  ill.** never be 
2f390 74 65 73 74 65 64 20 66 6f 72 2c 20 61 6e 64 20  tested for, and 
2f3a0 28 63 29 20 77 68 65 6e 20 61 20 76 61 6c 75 65  (c) when a value
2f3b0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
2f3c0 20 73 65 74 20 58 20 69 73 0a 2a 2a 20 69 6e 73   set X is.** ins
2f3d0 65 72 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  erted, there is 
2f3e0 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63  no need to searc
2f3f0 68 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  h to see if the 
2f400 73 61 6d 65 20 76 61 6c 75 65 20 77 61 73 0a 2a  same value was.*
2f410 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  * previously ins
2f420 65 72 74 65 64 20 61 73 20 70 61 72 74 20 6f 66  erted as part of
2f430 20 73 65 74 20 58 20 28 6f 6e 6c 79 20 69 66 20   set X (only if 
2f440 69 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  it was previousl
2f450 79 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 61 73  y.** inserted as
2f460 20 70 61 72 74 20 6f 66 20 73 6f 6d 65 20 6f 74   part of some ot
2f470 68 65 72 20 73 65 74 29 2e 0a 2a 2f 0a 63 61 73  her set)..*/.cas
2f480 65 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a  e OP_RowSetTest:
2f490 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
2f4a0 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20         /* jump, 
2f4b0 69 6e 31 2c 20 69 6e 33 20 2a 2f 0a 20 20 69 6e  in1, in3 */.  in
2f4c0 74 20 69 53 65 74 3b 0a 20 20 69 6e 74 20 65 78  t iSet;.  int ex
2f4d0 69 73 74 73 3b 0a 0a 20 20 70 49 6e 31 20 3d 20  ists;..  pIn1 = 
2f4e0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a  &aMem[pOp->p1];.
2f4f0 20 20 70 49 6e 33 20 3d 20 26 61 4d 65 6d 5b 70    pIn3 = &aMem[p
2f500 4f 70 2d 3e 70 33 5d 3b 0a 20 20 69 53 65 74 20  Op->p3];.  iSet 
2f510 3d 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 61  = pOp->p4.i;.  a
2f520 73 73 65 72 74 28 20 70 49 6e 33 2d 3e 66 6c 61  ssert( pIn3->fla
2f530 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a 0a 20  gs&MEM_Int );.. 
2f540 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2f550 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74  anything other t
2f560 68 61 6e 20 61 20 72 6f 77 73 65 74 20 6f 62 6a  han a rowset obj
2f570 65 63 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ect in memory ce
2f580 6c 6c 20 50 31 2c 0a 20 20 2a 2a 20 64 65 6c 65  ll P1,.  ** dele
2f590 74 65 20 69 74 20 6e 6f 77 20 61 6e 64 20 69 6e  te it now and in
2f5a0 69 74 69 61 6c 69 7a 65 20 50 31 20 77 69 74 68  itialize P1 with
2f5b0 20 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74   an empty rowset
2f5c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 49 6e  .  */.  if( (pIn
2f5d0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  1->flags & MEM_R
2f5e0 6f 77 53 65 74 29 3d 3d 30 20 29 7b 0a 20 20 20  owSet)==0 ){.   
2f5f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
2f600 65 74 52 6f 77 53 65 74 28 70 49 6e 31 29 3b 0a  etRowSet(pIn1);.
2f610 20 20 20 20 69 66 28 20 28 70 49 6e 31 2d 3e 66      if( (pIn1->f
2f620 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
2f630 74 29 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  t)==0 ) goto no_
2f640 6d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  mem;.  }..  asse
2f650 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
2f660 3d 50 34 5f 49 4e 54 33 32 20 29 3b 0a 20 20 61  =P4_INT32 );.  a
2f670 73 73 65 72 74 28 20 69 53 65 74 3d 3d 2d 31 20  ssert( iSet==-1 
2f680 7c 7c 20 69 53 65 74 3e 3d 30 20 29 3b 0a 20 20  || iSet>=0 );.  
2f690 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20 20 20  if( iSet ){.    
2f6a0 65 78 69 73 74 73 20 3d 20 73 71 6c 69 74 65 33  exists = sqlite3
2f6b0 52 6f 77 53 65 74 54 65 73 74 28 70 49 6e 31 2d  RowSetTest(pIn1-
2f6c0 3e 75 2e 70 52 6f 77 53 65 74 2c 20 69 53 65 74  >u.pRowSet, iSet
2f6d0 2c 20 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20  , pIn3->u.i);.  
2f6e0 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
2f6f0 6e 28 65 78 69 73 74 73 21 3d 30 2c 32 29 3b 0a  n(exists!=0,2);.
2f700 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
2f710 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32   goto jump_to_p2
2f720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 65 74  ;.  }.  if( iSet
2f730 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
2f740 65 33 52 6f 77 53 65 74 49 6e 73 65 72 74 28 70  e3RowSetInsert(p
2f750 49 6e 31 2d 3e 75 2e 70 52 6f 77 53 65 74 2c 20  In1->u.pRowSet, 
2f760 70 49 6e 33 2d 3e 75 2e 69 29 3b 0a 20 20 7d 0a  pIn3->u.i);.  }.
2f770 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 0a 23 69 66    break;.}...#if
2f780 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f790 5f 54 52 49 47 47 45 52 0a 0a 2f 2a 20 4f 70 63  _TRIGGER../* Opc
2f7a0 6f 64 65 3a 20 50 72 6f 67 72 61 6d 20 50 31 20  ode: Program P1 
2f7b0 50 32 20 50 33 20 50 34 20 50 35 0a 2a 2a 0a 2a  P2 P3 P4 P5.**.*
2f7c0 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 74 72  * Execute the tr
2f7d0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 70 61  igger program pa
2f7e0 73 73 65 64 20 61 73 20 50 34 20 28 74 79 70 65  ssed as P4 (type
2f7f0 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 29 2e   P4_SUBPROGRAM).
2f800 20 0a 2a 2a 0a 2a 2a 20 50 31 20 63 6f 6e 74 61   .**.** P1 conta
2f810 69 6e 73 20 74 68 65 20 61 64 64 72 65 73 73 20  ins the address 
2f820 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
2f830 6c 6c 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ll that contains
2f840 20 74 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72   the first memor
2f850 79 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 61 6e  y .** cell in an
2f860 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73   array of values
2f870 20 75 73 65 64 20 61 73 20 61 72 67 75 6d 65 6e   used as argumen
2f880 74 73 20 74 6f 20 74 68 65 20 73 75 62 2d 70 72  ts to the sub-pr
2f890 6f 67 72 61 6d 2e 20 50 32 20 0a 2a 2a 20 63 6f  ogram. P2 .** co
2f8a0 6e 74 61 69 6e 73 20 74 68 65 20 61 64 64 72 65  ntains the addre
2f8b0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66  ss to jump to if
2f8c0 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d   the sub-program
2f8d0 20 74 68 72 6f 77 73 20 61 6e 20 49 47 4e 4f 52   throws an IGNOR
2f8e0 45 20 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  E .** exception 
2f8f0 75 73 69 6e 67 20 74 68 65 20 52 41 49 53 45 28  using the RAISE(
2f900 29 20 66 75 6e 63 74 69 6f 6e 2e 20 52 65 67 69  ) function. Regi
2f910 73 74 65 72 20 50 33 20 63 6f 6e 74 61 69 6e 73  ster P3 contains
2f920 20 74 68 65 20 61 64 64 72 65 73 73 20 0a 2a 2a   the address .**
2f930 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   of a memory cel
2f940 6c 20 69 6e 20 74 68 69 73 20 28 74 68 65 20 70  l in this (the p
2f950 61 72 65 6e 74 29 20 56 4d 20 74 68 61 74 20 69  arent) VM that i
2f960 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
2f970 74 65 20 74 68 65 20 0a 2a 2a 20 6d 65 6d 6f 72  te the .** memor
2f980 79 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  y required by th
2f990 65 20 73 75 62 2d 76 64 62 65 20 61 74 20 72 75  e sub-vdbe at ru
2f9a0 6e 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 50 34 20  ntime..**.** P4 
2f9b0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2f9c0 74 68 65 20 56 4d 20 63 6f 6e 74 61 69 6e 69 6e  the VM containin
2f9d0 67 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  g the trigger pr
2f9e0 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
2f9f0 50 35 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  P5 is non-zero, 
2fa00 74 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 70  then recursive p
2fa10 72 6f 67 72 61 6d 20 69 6e 76 6f 63 61 74 69 6f  rogram invocatio
2fa20 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 2a 2f  n is enabled..*/
2fa30 0a 63 61 73 65 20 4f 50 5f 50 72 6f 67 72 61 6d  .case OP_Program
2fa40 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a 75  : {        /* ju
2fa50 6d 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  mp */.  int nMem
2fa60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fa70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
2fa80 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 66 6f  ory registers fo
2fa90 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
2faa0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
2fab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2fac0 74 65 73 20 6f 66 20 72 75 6e 74 69 6d 65 20 73  tes of runtime s
2fad0 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2fae0 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 2a 2f  r sub-program */
2faf0 0a 20 20 4d 65 6d 20 2a 70 52 74 3b 20 20 20 20  .  Mem *pRt;    
2fb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fb10 67 69 73 74 65 72 20 74 6f 20 61 6c 6c 6f 63 61  gister to alloca
2fb20 74 65 20 72 75 6e 74 69 6d 65 20 73 70 61 63 65  te runtime space
2fb30 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b   */.  Mem *pMem;
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fb50 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
2fb60 20 74 68 72 6f 75 67 68 20 6d 65 6d 6f 72 79 20   through memory 
2fb70 63 65 6c 6c 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  cells */.  Mem *
2fb80 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
2fb90 20 20 20 2f 2a 20 4c 61 73 74 20 6d 65 6d 6f 72     /* Last memor
2fba0 79 20 63 65 6c 6c 20 69 6e 20 6e 65 77 20 61 72  y cell in new ar
2fbb0 72 61 79 20 2a 2f 0a 20 20 56 64 62 65 46 72 61  ray */.  VdbeFra
2fbc0 6d 65 20 2a 70 46 72 61 6d 65 3b 20 20 20 20 20  me *pFrame;     
2fbd0 20 2f 2a 20 4e 65 77 20 76 64 62 65 20 66 72 61   /* New vdbe fra
2fbe0 6d 65 20 74 6f 20 65 78 65 63 75 74 65 20 69 6e  me to execute in
2fbf0 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
2fc00 20 2a 70 50 72 6f 67 72 61 6d 3b 20 20 20 2f 2a   *pProgram;   /*
2fc10 20 53 75 62 2d 70 72 6f 67 72 61 6d 20 74 6f 20   Sub-program to 
2fc20 65 78 65 63 75 74 65 20 2a 2f 0a 20 20 76 6f 69  execute */.  voi
2fc30 64 20 2a 74 3b 20 20 20 20 20 20 20 20 20 20 20  d *t;           
2fc40 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 69 64       /* Token id
2fc50 65 6e 74 69 66 79 69 6e 67 20 74 72 69 67 67 65  entifying trigge
2fc60 72 20 2a 2f 0a 0a 20 20 70 50 72 6f 67 72 61 6d  r */..  pProgram
2fc70 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
2fc80 72 61 6d 3b 0a 20 20 70 52 74 20 3d 20 26 61 4d  ram;.  pRt = &aM
2fc90 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 20 20 61  em[pOp->p3];.  a
2fca0 73 73 65 72 74 28 20 70 50 72 6f 67 72 61 6d 2d  ssert( pProgram-
2fcb0 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 0a 20 20 2f  >nOp>0 );.  .  /
2fcc0 2a 20 49 66 20 74 68 65 20 70 35 20 66 6c 61 67  * If the p5 flag
2fcd0 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
2fce0 72 65 63 75 72 73 69 76 65 20 69 6e 76 6f 63 61  recursive invoca
2fcf0 74 69 6f 6e 20 6f 66 20 74 72 69 67 67 65 72 73  tion of triggers
2fd00 20 69 73 20 0a 20 20 2a 2a 20 64 69 73 61 62 6c   is .  ** disabl
2fd10 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 73  ed for backwards
2fd20 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 28   compatibility (
2fd30 70 35 20 69 73 20 73 65 74 20 69 66 20 74 68 69  p5 is set if thi
2fd40 73 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 20 20  s sub-program.  
2fd50 2a 2a 20 69 73 20 72 65 61 6c 6c 79 20 61 20 74  ** is really a t
2fd60 72 69 67 67 65 72 2c 20 6e 6f 74 20 61 20 66 6f  rigger, not a fo
2fd70 72 65 69 67 6e 20 6b 65 79 20 61 63 74 69 6f 6e  reign key action
2fd80 2c 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 73  , and the flag s
2fd90 65 74 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61  et.  ** and clea
2fda0 72 65 64 20 62 79 20 74 68 65 20 22 50 52 41 47  red by the "PRAG
2fdb0 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
2fdc0 67 67 65 72 73 22 20 63 6f 6d 6d 61 6e 64 20 69  ggers" command i
2fdd0 73 20 63 6c 65 61 72 29 2e 0a 20 20 2a 2a 20 0a  s clear)..  ** .
2fde0 20 20 2a 2a 20 49 74 20 69 73 20 72 65 63 75 72    ** It is recur
2fdf0 73 69 76 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20  sive invocation 
2fe00 6f 66 20 74 72 69 67 67 65 72 73 2c 20 61 74 20  of triggers, at 
2fe10 74 68 65 20 53 51 4c 20 6c 65 76 65 6c 2c 20 74  the SQL level, t
2fe20 68 61 74 20 69 73 20 0a 20 20 2a 2a 20 64 69 73  hat is .  ** dis
2fe30 61 62 6c 65 64 2e 20 49 6e 20 73 6f 6d 65 20 63  abled. In some c
2fe40 61 73 65 73 20 61 20 73 69 6e 67 6c 65 20 74 72  ases a single tr
2fe50 69 67 67 65 72 20 6d 61 79 20 67 65 6e 65 72 61  igger may genera
2fe60 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  te more than one
2fe70 20 0a 20 20 2a 2a 20 53 75 62 50 72 6f 67 72 61   .  ** SubProgra
2fe80 6d 20 28 69 66 20 74 68 65 20 74 72 69 67 67 65  m (if the trigge
2fe90 72 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  r may be execute
2fea0 64 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e  d with more than
2feb0 20 6f 6e 65 20 64 69 66 66 65 72 65 6e 74 20 0a   one different .
2fec0 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
2fed0 20 61 6c 67 6f 72 69 74 68 6d 29 2e 20 53 75 62   algorithm). Sub
2fee0 50 72 6f 67 72 61 6d 20 73 74 72 75 63 74 75 72  Program structur
2fef0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2ff00 74 68 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c 65  th a.  ** single
2ff10 20 74 72 69 67 67 65 72 20 61 6c 6c 20 68 61 76   trigger all hav
2ff20 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
2ff30 20 66 6f 72 20 74 68 65 20 53 75 62 50 72 6f 67   for the SubProg
2ff40 72 61 6d 2e 74 6f 6b 65 6e 20 0a 20 20 2a 2a 20  ram.token .  ** 
2ff50 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2ff60 69 66 28 20 70 4f 70 2d 3e 70 35 20 29 7b 0a 20  if( pOp->p5 ){. 
2ff70 20 20 20 74 20 3d 20 70 50 72 6f 67 72 61 6d 2d     t = pProgram-
2ff80 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28  >token;.    for(
2ff90 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
2ffa0 3b 20 70 46 72 61 6d 65 20 26 26 20 70 46 72 61  ; pFrame && pFra
2ffb0 6d 65 2d 3e 74 6f 6b 65 6e 21 3d 74 3b 20 70 46  me->token!=t; pF
2ffc0 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
2ffd0 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  rent);.    if( p
2ffe0 46 72 61 6d 65 20 29 20 62 72 65 61 6b 3b 0a 20  Frame ) break;. 
2fff0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72   }..  if( p->nFr
30000 61 6d 65 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ame>=db->aLimit[
30010 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
30020 47 47 45 52 5f 44 45 50 54 48 5d 20 29 7b 0a 20  GGER_DEPTH] ){. 
30030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
30040 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
30050 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 74  3VdbeError(p, "t
30060 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
30070 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
30080 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ion");.    goto 
30090 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
300a0 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  or;.  }..  /* Re
300b0 67 69 73 74 65 72 20 70 52 74 20 69 73 20 75 73  gister pRt is us
300c0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
300d0 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20  memory required 
300e0 74 6f 20 73 61 76 65 20 74 68 65 20 73 74 61 74  to save the stat
300f0 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 75  e.  ** of the cu
30100 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 2c 20 61  rrent program, a
30110 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  nd the memory re
30120 71 75 69 72 65 64 20 61 74 20 72 75 6e 74 69 6d  quired at runtim
30130 65 20 74 6f 20 65 78 65 63 75 74 65 0a 20 20 2a  e to execute.  *
30140 2a 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72  * the trigger pr
30150 6f 67 72 61 6d 2e 20 49 66 20 74 68 69 73 20 74  ogram. If this t
30160 72 69 67 67 65 72 20 68 61 73 20 62 65 65 6e 20  rigger has been 
30170 66 69 72 65 64 20 62 65 66 6f 72 65 2c 20 74 68  fired before, th
30180 65 6e 20 70 52 74 20 0a 20 20 2a 2a 20 69 73 20  en pRt .  ** is 
30190 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
301a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
301b0 20 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c   must be initial
301c0 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ized.  */.  if( 
301d0 28 70 52 74 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  (pRt->flags&MEM_
301e0 46 72 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  Frame)==0 ){.   
301f0 20 2f 2a 20 53 75 62 50 72 6f 67 72 61 6d 2e 6e   /* SubProgram.n
30200 4d 65 6d 20 69 73 20 73 65 74 20 74 6f 20 74 68  Mem is set to th
30210 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  e number of memo
30220 72 79 20 63 65 6c 6c 73 20 75 73 65 64 20 62 79  ry cells used by
30230 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 72 6f   the .    ** pro
30240 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 53  gram stored in S
30250 75 62 50 72 6f 67 72 61 6d 2e 61 4f 70 2e 20 41  ubProgram.aOp. A
30260 73 20 77 65 6c 6c 20 61 73 20 74 68 65 73 65 2c  s well as these,
30270 20 6f 6e 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   one memory.    
30280 2a 2a 20 63 65 6c 6c 20 69 73 20 72 65 71 75 69  ** cell is requi
30290 72 65 64 20 66 6f 72 20 65 61 63 68 20 63 75 72  red for each cur
302a0 73 6f 72 20 75 73 65 64 20 62 79 20 74 68 65 20  sor used by the 
302b0 70 72 6f 67 72 61 6d 2e 20 53 65 74 20 6c 6f 63  program. Set loc
302c0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
302d0 6c 65 20 6e 4d 65 6d 20 28 61 6e 64 20 6c 61 74  le nMem (and lat
302e0 65 72 2c 20 56 64 62 65 46 72 61 6d 65 2e 6e 43  er, VdbeFrame.nC
302f0 68 69 6c 64 4d 65 6d 29 20 74 6f 20 74 68 69 73  hildMem) to this
30300 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20   value..    */. 
30310 20 20 20 6e 4d 65 6d 20 3d 20 70 50 72 6f 67 72     nMem = pProgr
30320 61 6d 2d 3e 6e 4d 65 6d 20 2b 20 70 50 72 6f 67  am->nMem + pProg
30330 72 61 6d 2d 3e 6e 43 73 72 3b 0a 20 20 20 20 61  ram->nCsr;.    a
30340 73 73 65 72 74 28 20 6e 4d 65 6d 3e 30 20 29 3b  ssert( nMem>0 );
30350 0a 20 20 20 20 69 66 28 20 70 50 72 6f 67 72 61  .    if( pProgra
30360 6d 2d 3e 6e 43 73 72 3d 3d 30 20 29 20 6e 4d 65  m->nCsr==0 ) nMe
30370 6d 2b 2b 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  m++;.    nByte =
30380 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 56   ROUND8(sizeof(V
30390 64 62 65 46 72 61 6d 65 29 29 0a 20 20 20 20 20  dbeFrame)).     
303a0 20 20 20 20 20 20 20 20 20 2b 20 6e 4d 65 6d 20           + nMem 
303b0 2a 20 73 69 7a 65 6f 66 28 4d 65 6d 29 0a 20 20  * sizeof(Mem).  
303c0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 70 50              + pP
303d0 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 20 2a 20 73  rogram->nCsr * s
303e0 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
303f0 20 2a 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 20   *);.    pFrame 
30400 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
30410 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
30420 3b 0a 20 20 20 20 69 66 28 20 21 70 46 72 61 6d  ;.    if( !pFram
30430 65 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  e ){.      goto 
30440 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
30450 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
30460 52 65 6c 65 61 73 65 28 70 52 74 29 3b 0a 20 20  Release(pRt);.  
30470 20 20 70 52 74 2d 3e 66 6c 61 67 73 20 3d 20 4d    pRt->flags = M
30480 45 4d 5f 46 72 61 6d 65 3b 0a 20 20 20 20 70 52  EM_Frame;.    pR
30490 74 2d 3e 75 2e 70 46 72 61 6d 65 20 3d 20 70 46  t->u.pFrame = pF
304a0 72 61 6d 65 3b 0a 0a 20 20 20 20 70 46 72 61 6d  rame;..    pFram
304b0 65 2d 3e 76 20 3d 20 70 3b 0a 20 20 20 20 70 46  e->v = p;.    pF
304c0 72 61 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20  rame->nChildMem 
304d0 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 70 46 72 61  = nMem;.    pFra
304e0 6d 65 2d 3e 6e 43 68 69 6c 64 43 73 72 20 3d 20  me->nChildCsr = 
304f0 70 50 72 6f 67 72 61 6d 2d 3e 6e 43 73 72 3b 0a  pProgram->nCsr;.
30500 20 20 20 20 70 46 72 61 6d 65 2d 3e 70 63 20 3d      pFrame->pc =
30510 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70   (int)(pOp - aOp
30520 29 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d 3e 61  );.    pFrame->a
30530 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 20  Mem = p->aMem;. 
30540 20 20 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 20     pFrame->nMem 
30550 3d 20 70 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  = p->nMem;.    p
30560 46 72 61 6d 65 2d 3e 61 70 43 73 72 20 3d 20 70  Frame->apCsr = p
30570 2d 3e 61 70 43 73 72 3b 0a 20 20 20 20 70 46 72  ->apCsr;.    pFr
30580 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70  ame->nCursor = p
30590 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->nCursor;.    p
305a0 46 72 61 6d 65 2d 3e 61 4f 70 20 3d 20 70 2d 3e  Frame->aOp = p->
305b0 61 4f 70 3b 0a 20 20 20 20 70 46 72 61 6d 65 2d  aOp;.    pFrame-
305c0 3e 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  >nOp = p->nOp;. 
305d0 20 20 20 70 46 72 61 6d 65 2d 3e 74 6f 6b 65 6e     pFrame->token
305e0 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 74 6f 6b   = pProgram->tok
305f0 65 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  en;.#ifdef SQLIT
30600 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
30610 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 46 72  ANSTATUS.    pFr
30620 61 6d 65 2d 3e 61 6e 45 78 65 63 20 3d 20 70 2d  ame->anExec = p-
30630 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
30640 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 56 64 62  .    pEnd = &Vdb
30650 65 46 72 61 6d 65 4d 65 6d 28 70 46 72 61 6d 65  eFrameMem(pFrame
30660 29 5b 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  )[pFrame->nChild
30670 4d 65 6d 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4d  Mem];.    for(pM
30680 65 6d 3d 56 64 62 65 46 72 61 6d 65 4d 65 6d 28  em=VdbeFrameMem(
30690 70 46 72 61 6d 65 29 3b 20 70 4d 65 6d 21 3d 70  pFrame); pMem!=p
306a0 45 6e 64 3b 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  End; pMem++){.  
306b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
306c0 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
306d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  .      pMem->db 
306e0 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = db;.    }.  }e
306f0 6c 73 65 7b 0a 20 20 20 20 70 46 72 61 6d 65 20  lse{.    pFrame 
30700 3d 20 70 52 74 2d 3e 75 2e 70 46 72 61 6d 65 3b  = pRt->u.pFrame;
30710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72  .    assert( pPr
30720 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 70 50 72 6f  ogram->nMem+pPro
30730 67 72 61 6d 2d 3e 6e 43 73 72 3d 3d 70 46 72 61  gram->nCsr==pFra
30740 6d 65 2d 3e 6e 43 68 69 6c 64 4d 65 6d 20 0a 20  me->nChildMem . 
30750 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f 67         || (pProg
30760 72 61 6d 2d 3e 6e 43 73 72 3d 3d 30 20 26 26 20  ram->nCsr==0 && 
30770 70 50 72 6f 67 72 61 6d 2d 3e 6e 4d 65 6d 2b 31  pProgram->nMem+1
30780 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  ==pFrame->nChild
30790 4d 65 6d 29 20 29 3b 0a 20 20 20 20 61 73 73 65  Mem) );.    asse
307a0 72 74 28 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 43  rt( pProgram->nC
307b0 73 72 3d 3d 70 46 72 61 6d 65 2d 3e 6e 43 68 69  sr==pFrame->nChi
307c0 6c 64 43 73 72 20 29 3b 0a 20 20 20 20 61 73 73  ldCsr );.    ass
307d0 65 72 74 28 20 28 69 6e 74 29 28 70 4f 70 20 2d  ert( (int)(pOp -
307e0 20 61 4f 70 29 3d 3d 70 46 72 61 6d 65 2d 3e 70   aOp)==pFrame->p
307f0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 6e  c );.  }..  p->n
30800 46 72 61 6d 65 2b 2b 3b 0a 20 20 70 46 72 61 6d  Frame++;.  pFram
30810 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e  e->pParent = p->
30820 70 46 72 61 6d 65 3b 0a 20 20 70 46 72 61 6d 65  pFrame;.  pFrame
30830 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61  ->lastRowid = la
30840 73 74 52 6f 77 69 64 3b 0a 20 20 70 46 72 61 6d  stRowid;.  pFram
30850 65 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 2d 3e  e->nChange = p->
30860 6e 43 68 61 6e 67 65 3b 0a 20 20 70 46 72 61 6d  nChange;.  pFram
30870 65 2d 3e 6e 44 62 43 68 61 6e 67 65 20 3d 20 70  e->nDbChange = p
30880 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  ->db->nChange;. 
30890 20 61 73 73 65 72 74 28 20 70 46 72 61 6d 65 2d   assert( pFrame-
308a0 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
308b0 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61    pFrame->pAuxDa
308c0 74 61 20 3d 20 70 2d 3e 70 41 75 78 44 61 74 61  ta = p->pAuxData
308d0 3b 0a 20 20 70 2d 3e 70 41 75 78 44 61 74 61 20  ;.  p->pAuxData 
308e0 3d 20 30 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  = 0;.  p->nChang
308f0 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 46 72 61  e = 0;.  p->pFra
30900 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 20 20 70  me = pFrame;.  p
30910 2d 3e 61 4d 65 6d 20 3d 20 61 4d 65 6d 20 3d 20  ->aMem = aMem = 
30920 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 46 72  VdbeFrameMem(pFr
30930 61 6d 65 29 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20  ame);.  p->nMem 
30940 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 69 6c 64  = pFrame->nChild
30950 4d 65 6d 3b 0a 20 20 70 2d 3e 6e 43 75 72 73 6f  Mem;.  p->nCurso
30960 72 20 3d 20 28 75 31 36 29 70 46 72 61 6d 65 2d  r = (u16)pFrame-
30970 3e 6e 43 68 69 6c 64 43 73 72 3b 0a 20 20 70 2d  >nChildCsr;.  p-
30980 3e 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75  >apCsr = (VdbeCu
30990 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d  rsor **)&aMem[p-
309a0 3e 6e 4d 65 6d 5d 3b 0a 20 20 70 2d 3e 61 4f 70  >nMem];.  p->aOp
309b0 20 3d 20 61 4f 70 20 3d 20 70 50 72 6f 67 72 61   = aOp = pProgra
309c0 6d 2d 3e 61 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70  m->aOp;.  p->nOp
309d0 20 3d 20 70 50 72 6f 67 72 61 6d 2d 3e 6e 4f 70   = pProgram->nOp
309e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
309f0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
30a00 53 54 41 54 55 53 0a 20 20 70 2d 3e 61 6e 45 78  STATUS.  p->anEx
30a10 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ec = 0;.#endif. 
30a20 20 70 4f 70 20 3d 20 26 61 4f 70 5b 2d 31 5d 3b   pOp = &aOp[-1];
30a30 0a 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a  ..  break;.}../*
30a40 20 4f 70 63 6f 64 65 3a 20 50 61 72 61 6d 20 50   Opcode: Param P
30a50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 0a 2a 2a  1 P2 * * *.**.**
30a60 20 54 68 69 73 20 6f 70 63 6f 64 65 20 69 73 20   This opcode is 
30a70 6f 6e 6c 79 20 65 76 65 72 20 70 72 65 73 65 6e  only ever presen
30a80 74 20 69 6e 20 73 75 62 2d 70 72 6f 67 72 61 6d  t in sub-program
30a90 73 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  s called via the
30aa0 20 0a 2a 2a 20 4f 50 5f 50 72 6f 67 72 61 6d 20   .** OP_Program 
30ab0 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 43 6f 70  instruction. Cop
30ac0 79 20 61 20 76 61 6c 75 65 20 63 75 72 72 65 6e  y a value curren
30ad0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20  tly stored in a 
30ae0 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
30af0 6f 66 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 28  of the calling (
30b00 70 61 72 65 6e 74 29 20 66 72 61 6d 65 20 74 6f  parent) frame to
30b10 20 63 65 6c 6c 20 50 32 20 69 6e 20 74 68 65 20   cell P2 in the 
30b20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 73 20 0a  current frames .
30b30 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
30b40 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62  . This is used b
30b50 79 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  y trigger progra
30b60 6d 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ms to access the
30b70 20 6e 65 77 2e 2a 20 0a 2a 2a 20 61 6e 64 20 6f   new.* .** and o
30b80 6c 64 2e 2a 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  ld.* values..**.
30b90 2a 2a 20 54 68 65 20 61 64 64 72 65 73 73 20 6f  ** The address o
30ba0 66 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68  f the cell in th
30bb0 65 20 70 61 72 65 6e 74 20 66 72 61 6d 65 20 69  e parent frame i
30bc0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
30bd0 61 64 64 69 6e 67 0a 2a 2a 20 74 68 65 20 76 61  adding.** the va
30be0 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61 72  lue of the P1 ar
30bf0 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 76 61  gument to the va
30c00 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 61 72  lue of the P1 ar
30c10 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a  gument to the.**
30c20 20 63 61 6c 6c 69 6e 67 20 4f 50 5f 50 72 6f 67   calling OP_Prog
30c30 72 61 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ram instruction.
30c40 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 50 61 72 61  .*/.case OP_Para
30c50 6d 3a 20 7b 20 20 20 20 20 20 20 20 20 20 20 2f  m: {           /
30c60 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 56 64 62 65  * out2 */.  Vdbe
30c70 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
30c80 20 4d 65 6d 20 2a 70 49 6e 3b 0a 20 20 70 4f 75   Mem *pIn;.  pOu
30c90 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c 65 61  t = out2Prerelea
30ca0 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20 70 46  se(p, pOp);.  pF
30cb0 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61 6d 65  rame = p->pFrame
30cc0 3b 0a 20 20 70 49 6e 20 3d 20 26 70 46 72 61 6d  ;.  pIn = &pFram
30cd0 65 2d 3e 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 20  e->aMem[pOp->p1 
30ce0 2b 20 70 46 72 61 6d 65 2d 3e 61 4f 70 5b 70 46  + pFrame->aOp[pF
30cf0 72 61 6d 65 2d 3e 70 63 5d 2e 70 31 5d 3b 20 20  rame->pc].p1];  
30d00 20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d   .  sqlite3VdbeM
30d10 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 70 4f  emShallowCopy(pO
30d20 75 74 2c 20 70 49 6e 2c 20 4d 45 4d 5f 45 70 68  ut, pIn, MEM_Eph
30d30 65 6d 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  em);.  break;.}.
30d40 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
30d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
30d60 52 49 47 47 45 52 20 2a 2f 0a 0a 23 69 66 6e 64  RIGGER */..#ifnd
30d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
30d80 4f 52 45 49 47 4e 5f 4b 45 59 0a 2f 2a 20 4f 70  OREIGN_KEY./* Op
30d90 63 6f 64 65 3a 20 46 6b 43 6f 75 6e 74 65 72 20  code: FkCounter 
30da0 50 31 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53  P1 P2 * * *.** S
30db0 79 6e 6f 70 73 69 73 3a 20 66 6b 63 74 72 5b 50  ynopsis: fkctr[P
30dc0 31 5d 2b 3d 50 32 0a 2a 2a 0a 2a 2a 20 49 6e 63  1]+=P2.**.** Inc
30dd0 72 65 6d 65 6e 74 20 61 20 22 63 6f 6e 73 74 72  rement a "constr
30de0 61 69 6e 74 20 63 6f 75 6e 74 65 72 22 20 62 79  aint counter" by
30df0 20 50 32 20 28 50 32 20 6d 61 79 20 62 65 20 6e   P2 (P2 may be n
30e00 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73 69 74  egative or posit
30e10 69 76 65 29 2e 0a 2a 2a 20 49 66 20 50 31 20 69  ive)..** If P1 i
30e20 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
30e30 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74 72 61  database constra
30e40 69 6e 74 20 63 6f 75 6e 74 65 72 20 69 73 20 69  int counter is i
30e50 6e 63 72 65 6d 65 6e 74 65 64 20 0a 2a 2a 20 28  ncremented .** (
30e60 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
30e70 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
30e80 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ). Otherwise, if
30e90 20 50 31 20 69 73 20 7a 65 72 6f 2c 20 74 68 65   P1 is zero, the
30ea0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 63   .** statement c
30eb0 6f 75 6e 74 65 72 20 69 73 20 69 6e 63 72 65 6d  ounter is increm
30ec0 65 6e 74 65 64 20 28 69 6d 6d 65 64 69 61 74 65  ented (immediate
30ed0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
30ee0 73 74 72 61 69 6e 74 73 29 2e 0a 2a 2f 0a 63 61  straints)..*/.ca
30ef0 73 65 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 3a  se OP_FkCounter:
30f00 20 7b 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61   {.  if( db->fla
30f10 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65 66 65  gs & SQLITE_Defe
30f20 72 46 4b 73 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rFKs ){.    db->
30f30 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
30f40 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 7d   += pOp->p2;.  }
30f50 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 70 31  else if( pOp->p1
30f60 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
30f70 65 72 72 65 64 43 6f 6e 73 20 2b 3d 20 70 4f 70  erredCons += pOp
30f80 2d 3e 70 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->p2;.  }else{. 
30f90 20 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61     p->nFkConstra
30fa0 69 6e 74 20 2b 3d 20 70 4f 70 2d 3e 70 32 3b 0a  int += pOp->p2;.
30fb0 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a    }.  break;.}..
30fc0 2f 2a 20 4f 70 63 6f 64 65 3a 20 46 6b 49 66 5a  /* Opcode: FkIfZ
30fd0 65 72 6f 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  ero P1 P2 * * *.
30fe0 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 66 20  ** Synopsis: if 
30ff0 66 6b 63 74 72 5b 50 31 5d 3d 3d 30 20 67 6f 74  fkctr[P1]==0 got
31000 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  o P2.**.** This 
31010 6f 70 63 6f 64 65 20 74 65 73 74 73 20 69 66 20  opcode tests if 
31020 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  a foreign key co
31030 6e 73 74 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72  nstraint-counter
31040 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 7a 65   is currently ze
31050 72 6f 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 6a 75  ro..** If so, ju
31060 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
31070 6e 20 50 32 2e 20 4f 74 68 65 72 77 69 73 65 2c  n P2. Otherwise,
31080 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
31090 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 69 6e   the next .** in
310a0 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
310b0 20 49 66 20 50 31 20 69 73 20 6e 6f 6e 2d 7a 65   If P1 is non-ze
310c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 75 6d  ro, then the jum
310d0 70 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  p is taken if th
310e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 73 74  e database const
310f0 72 61 69 6e 74 2d 63 6f 75 6e 74 65 72 0a 2a 2a  raint-counter.**
31100 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 6f 6e   is zero (the on
31110 65 20 74 68 61 74 20 63 6f 75 6e 74 73 20 64 65  e that counts de
31120 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
31130 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e 20 49  t violations). I
31140 66 20 50 31 20 69 73 0a 2a 2a 20 7a 65 72 6f 2c  f P1 is.** zero,
31150 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
31160 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
31170 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 2d 63  ent constraint-c
31180 6f 75 6e 74 65 72 20 69 73 20 7a 65 72 6f 0a 2a  ounter is zero.*
31190 2a 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  * (immediate for
311a0 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
311b0 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 29 2e  int violations).
311c0 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 46 6b 49 66  .*/.case OP_FkIf
311d0 5a 65 72 6f 3a 20 7b 20 20 20 20 20 20 20 20 20  Zero: {         
311e0 2f 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 69 66 28  /* jump */.  if(
311f0 20 70 4f 70 2d 3e 70 31 20 29 7b 0a 20 20 20 20   pOp->p1 ){.    
31200 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
31210 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
31220 73 3d 3d 30 20 26 26 20 64 62 2d 3e 6e 44 65 66  s==0 && db->nDef
31230 65 72 72 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c  erredImmCons==0,
31240 20 32 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   2);.    if( db-
31250 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 3d 3d  >nDeferredCons==
31260 30 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  0 && db->nDeferr
31270 65 64 49 6d 6d 43 6f 6e 73 3d 3d 30 20 29 20 67  edImmCons==0 ) g
31280 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a  oto jump_to_p2;.
31290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
312a0 65 42 72 61 6e 63 68 54 61 6b 65 6e 28 70 2d 3e  eBranchTaken(p->
312b0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3d 3d 30  nFkConstraint==0
312c0 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72 65   && db->nDeferre
312d0 64 49 6d 6d 43 6f 6e 73 3d 3d 30 2c 20 32 29 3b  dImmCons==0, 2);
312e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 6b 43  .    if( p->nFkC
312f0 6f 6e 73 74 72 61 69 6e 74 3d 3d 30 20 26 26 20  onstraint==0 && 
31300 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
31310 43 6f 6e 73 3d 3d 30 20 29 20 67 6f 74 6f 20 6a  Cons==0 ) goto j
31320 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 7d 0a 20  ump_to_p2;.  }. 
31330 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
31340 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
31350 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
31360 4b 45 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  KEY */..#ifndef 
31370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31380 49 4e 43 52 45 4d 45 4e 54 0a 2f 2a 20 4f 70 63  INCREMENT./* Opc
31390 6f 64 65 3a 20 4d 65 6d 4d 61 78 20 50 31 20 50  ode: MemMax P1 P
313a0 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70  2 * * *.** Synop
313b0 73 69 73 3a 20 72 5b 50 31 5d 3d 6d 61 78 28 72  sis: r[P1]=max(r
313c0 5b 50 31 5d 2c 72 5b 50 32 5d 29 0a 2a 2a 0a 2a  [P1],r[P2]).**.*
313d0 2a 20 50 31 20 69 73 20 61 20 72 65 67 69 73 74  * P1 is a regist
313e0 65 72 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 66  er in the root f
313f0 72 61 6d 65 20 6f 66 20 74 68 69 73 20 56 4d 20  rame of this VM 
31400 28 74 68 65 20 72 6f 6f 74 20 66 72 61 6d 65 20  (the root frame 
31410 69 73 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  is.** different 
31420 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
31430 20 66 72 61 6d 65 20 69 66 20 74 68 69 73 20 69   frame if this i
31440 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 62 65  nstruction is be
31450 69 6e 67 20 65 78 65 63 75 74 65 64 0a 2a 2a 20  ing executed.** 
31460 77 69 74 68 69 6e 20 61 20 73 75 62 2d 70 72 6f  within a sub-pro
31470 67 72 61 6d 29 2e 20 53 65 74 20 74 68 65 20 76  gram). Set the v
31480 61 6c 75 65 20 6f 66 20 72 65 67 69 73 74 65 72  alue of register
31490 20 50 31 20 74 6f 20 74 68 65 20 6d 61 78 69 6d   P1 to the maxim
314a0 75 6d 20 6f 66 20 0a 2a 2a 20 69 74 73 20 63 75  um of .** its cu
314b0 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
314c0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  the value in reg
314d0 69 73 74 65 72 20 50 32 2e 0a 2a 2a 0a 2a 2a 20  ister P2..**.** 
314e0 54 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  This instruction
314f0 20 74 68 72 6f 77 73 20 61 6e 20 65 72 72 6f 72   throws an error
31500 20 69 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   if the memory c
31510 65 6c 6c 20 69 73 20 6e 6f 74 20 69 6e 69 74 69  ell is not initi
31520 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  ally.** an integ
31530 65 72 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d  er..*/.case OP_M
31540 65 6d 4d 61 78 3a 20 7b 20 20 20 20 20 20 20 20  emMax: {        
31550 2f 2a 20 69 6e 32 20 2a 2f 0a 20 20 56 64 62 65  /* in2 */.  Vdbe
31560 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
31570 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
31580 7b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  {.    for(pFrame
31590 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
315a0 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
315b0 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
315c0 65 6e 74 29 3b 0a 20 20 20 20 70 49 6e 31 20 3d  ent);.    pIn1 =
315d0 20 26 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 5b 70   &pFrame->aMem[p
315e0 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d 65 6c 73 65  Op->p1];.  }else
315f0 7b 0a 20 20 20 20 70 49 6e 31 20 3d 20 26 61 4d  {.    pIn1 = &aM
31600 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 7d  em[pOp->p1];.  }
31610 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73  .  assert( memIs
31620 56 61 6c 69 64 28 70 49 6e 31 29 20 29 3b 0a 20  Valid(pIn1) );. 
31630 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
31640 6e 74 65 67 65 72 69 66 79 28 70 49 6e 31 29 3b  ntegerify(pIn1);
31650 0a 20 20 70 49 6e 32 20 3d 20 26 61 4d 65 6d 5b  .  pIn2 = &aMem[
31660 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 73 71 6c 69  pOp->p2];.  sqli
31670 74 65 33 56 64 62 65 4d 65 6d 49 6e 74 65 67 65  te3VdbeMemIntege
31680 72 69 66 79 28 70 49 6e 32 29 3b 0a 20 20 69 66  rify(pIn2);.  if
31690 28 20 70 49 6e 31 2d 3e 75 2e 69 3c 70 49 6e 32  ( pIn1->u.i<pIn2
316a0 2d 3e 75 2e 69 29 7b 0a 20 20 20 20 70 49 6e 31  ->u.i){.    pIn1
316b0 2d 3e 75 2e 69 20 3d 20 70 49 6e 32 2d 3e 75 2e  ->u.i = pIn2->u.
316c0 69 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a  i;.  }.  break;.
316d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
316e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
316f0 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 20 4f 70 63  EMENT */../* Opc
31700 6f 64 65 3a 20 49 66 50 6f 73 20 50 31 20 50 32  ode: IfPos P1 P2
31710 20 50 33 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70   P3 * *.** Synop
31720 73 69 73 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20  sis: if r[P1]>0 
31730 74 68 65 6e 20 72 5b 50 31 5d 2d 3d 50 33 2c 20  then r[P1]-=P3, 
31740 67 6f 74 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65  goto P2.**.** Re
31750 67 69 73 74 65 72 20 50 31 20 6d 75 73 74 20 63  gister P1 must c
31760 6f 6e 74 61 69 6e 20 61 6e 20 69 6e 74 65 67 65  ontain an intege
31770 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 76 61 6c  r..** If the val
31780 75 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50  ue of register P
31790 31 20 69 73 20 31 20 6f 72 20 67 72 65 61 74 65  1 is 1 or greate
317a0 72 2c 20 73 75 62 74 72 61 63 74 20 50 33 20 66  r, subtract P3 f
317b0 72 6f 6d 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  rom the.** value
317c0 20 69 6e 20 50 31 20 61 6e 64 20 6a 75 6d 70 20   in P1 and jump 
317d0 74 6f 20 50 32 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  to P2..**.** If 
317e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
317f0 65 20 6f 66 20 72 65 67 69 73 74 65 72 20 50 31  e of register P1
31800 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2c   is less than 1,
31810 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 76 61 6c   then the.** val
31820 75 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ue is unchanged 
31830 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 70 61 73 73  and control pass
31840 65 73 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  es through to th
31850 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
31860 6f 6e 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 49  on..*/.case OP_I
31870 66 50 6f 73 3a 20 7b 20 20 20 20 20 20 20 20 2f  fPos: {        /
31880 2a 20 6a 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20  * jump, in1 */. 
31890 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
318a0 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65 72 74  p->p1];.  assert
318b0 28 20 70 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45  ( pIn1->flags&ME
318c0 4d 5f 49 6e 74 20 29 3b 0a 20 20 56 64 62 65 42  M_Int );.  VdbeB
318d0 72 61 6e 63 68 54 61 6b 65 6e 28 20 70 49 6e 31  ranchTaken( pIn1
318e0 2d 3e 75 2e 69 3e 30 2c 20 32 29 3b 0a 20 20 69  ->u.i>0, 2);.  i
318f0 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30 20 29  f( pIn1->u.i>0 )
31900 7b 0a 20 20 20 20 70 49 6e 31 2d 3e 75 2e 69 20  {.    pIn1->u.i 
31910 2d 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20  -= pOp->p3;.    
31920 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b  goto jump_to_p2;
31930 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
31940 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 4f 66 66 73  ./* Opcode: Offs
31950 65 74 4c 69 6d 69 74 20 50 31 20 50 32 20 50 33  etLimit P1 P2 P3
31960 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69 73   * *.** Synopsis
31970 3a 20 69 66 20 72 5b 50 31 5d 3e 30 20 74 68 65  : if r[P1]>0 the
31980 6e 20 72 5b 50 32 5d 3d 72 5b 50 31 5d 2b 6d 61  n r[P2]=r[P1]+ma
31990 78 28 30 2c 72 5b 50 33 5d 29 20 65 6c 73 65 20  x(0,r[P3]) else 
319a0 72 5b 50 32 5d 3d 28 2d 31 29 0a 2a 2a 0a 2a 2a  r[P2]=(-1).**.**
319b0 20 54 68 69 73 20 6f 70 63 6f 64 65 20 70 65 72   This opcode per
319c0 66 6f 72 6d 73 20 61 20 63 6f 6d 6d 6f 6e 6c 79  forms a commonly
319d0 20 75 73 65 64 20 63 6f 6d 70 75 74 61 74 69 6f   used computatio
319e0 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
319f0 68 0a 2a 2a 20 4c 49 4d 49 54 20 61 6e 64 20 4f  h.** LIMIT and O
31a00 46 46 53 45 54 20 70 72 6f 63 65 73 73 2e 20 20  FFSET process.  
31a10 72 5b 50 31 5d 20 68 6f 6c 64 73 20 74 68 65 20  r[P1] holds the 
31a20 6c 69 6d 69 74 20 63 6f 75 6e 74 65 72 2e 20 20  limit counter.  
31a30 72 5b 50 33 5d 0a 2a 2a 20 68 6f 6c 64 73 20 74  r[P3].** holds t
31a40 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
31a50 72 2e 20 20 54 68 65 20 6f 70 63 6f 64 65 20 63  r.  The opcode c
31a60 6f 6d 70 75 74 65 73 20 74 68 65 20 63 6f 6d 62  omputes the comb
31a70 69 6e 65 64 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  ined value.** of
31a80 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
31a90 46 46 53 45 54 20 61 6e 64 20 73 74 6f 72 65 73  FFSET and stores
31aa0 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20 72   that value in r
31ab0 5b 50 32 5d 2e 20 20 54 68 65 20 72 5b 50 32 5d  [P2].  The r[P2]
31ac0 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 6d 70 75 74  .** value comput
31ad0 65 64 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ed is the total 
31ae0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
31af0 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  hat will need to
31b00 20 62 65 0a 2a 2a 20 76 69 73 69 74 65 64 20 69   be.** visited i
31b10 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
31b20 65 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 2a  ete the query..*
31b30 2a 0a 2a 2a 20 49 66 20 72 5b 50 33 5d 20 69 73  *.** If r[P3] is
31b40 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
31b50 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
31b60 65 72 65 20 69 73 20 6e 6f 20 4f 46 46 53 45 54  ere is no OFFSET
31b70 0a 2a 2a 20 61 6e 64 20 72 5b 50 32 5d 20 69 73  .** and r[P2] is
31b80 20 73 65 74 20 74 6f 20 62 65 20 74 68 65 20 76   set to be the v
31b90 61 6c 75 65 20 6f 66 20 74 68 65 20 4c 49 4d 49  alue of the LIMI
31ba0 54 2c 20 72 5b 50 31 5d 2e 0a 2a 2a 0a 2a 2a 20  T, r[P1]..**.** 
31bb0 69 66 20 72 5b 50 31 5d 20 69 73 20 7a 65 72 6f  if r[P1] is zero
31bc0 20 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68   or negative, th
31bd0 61 74 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69  at means there i
31be0 73 20 6e 6f 20 4c 49 4d 49 54 0a 2a 2a 20 61 6e  s no LIMIT.** an
31bf0 64 20 72 5b 50 32 5d 20 69 73 20 73 65 74 20 74  d r[P2] is set t
31c00 6f 20 2d 31 2e 20 0a 2a 2a 0a 2a 2a 20 4f 74 68  o -1. .**.** Oth
31c10 65 72 77 69 73 65 2c 20 72 5b 50 32 5d 20 69 73  erwise, r[P2] is
31c20 20 73 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20   set to the sum 
31c30 6f 66 20 72 5b 50 31 5d 20 61 6e 64 20 72 5b 50  of r[P1] and r[P
31c40 33 5d 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4f  3]..*/.case OP_O
31c50 66 66 73 65 74 4c 69 6d 69 74 3a 20 7b 20 20 20  ffsetLimit: {   
31c60 20 2f 2a 20 69 6e 31 2c 20 6f 75 74 32 2c 20 69   /* in1, out2, i
31c70 6e 33 20 2a 2f 0a 20 20 69 36 34 20 78 3b 0a 20  n3 */.  i64 x;. 
31c80 20 70 49 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f   pIn1 = &aMem[pO
31c90 70 2d 3e 70 31 5d 3b 0a 20 20 70 49 6e 33 20 3d  p->p1];.  pIn3 =
31ca0 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b   &aMem[pOp->p3];
31cb0 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
31cc0 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
31cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 31  ;.  assert( pIn1
31ce0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
31cf0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
31d00 49 6e 33 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  In3->flags & MEM
31d10 5f 49 6e 74 20 29 3b 0a 20 20 78 20 3d 20 70 49  _Int );.  x = pI
31d20 6e 31 2d 3e 75 2e 69 3b 0a 20 20 69 66 28 20 78  n1->u.i;.  if( x
31d30 3c 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 41 64  <=0 || sqlite3Ad
31d40 64 49 6e 74 36 34 28 26 78 2c 20 70 49 6e 33 2d  dInt64(&x, pIn3-
31d50 3e 75 2e 69 3e 30 3f 70 49 6e 33 2d 3e 75 2e 69  >u.i>0?pIn3->u.i
31d60 3a 30 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  :0) ){.    /* If
31d70 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 6c 65   the LIMIT is le
31d80 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
31d90 20 74 6f 20 7a 65 72 6f 2c 20 6c 6f 6f 70 20 66   to zero, loop f
31da0 6f 72 65 76 65 72 2e 20 20 54 68 69 73 0a 20 20  orever.  This.  
31db0 20 20 2a 2a 20 69 73 20 64 6f 63 75 6d 65 6e 74    ** is document
31dc0 65 64 2e 20 20 42 75 74 20 61 6c 73 6f 2c 20 69  ed.  But also, i
31dd0 66 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53  f the LIMIT+OFFS
31de0 45 54 20 65 78 63 65 65 64 73 20 32 5e 36 33 20  ET exceeds 2^63 
31df0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  then.    ** also
31e00 20 6c 6f 6f 70 20 66 6f 72 65 76 65 72 2e 20 20   loop forever.  
31e10 54 68 69 73 20 69 73 20 75 6e 64 6f 63 75 6d 65  This is undocume
31e20 6e 74 65 64 2e 20 20 49 6e 20 66 61 63 74 2c 20  nted.  In fact, 
31e30 6f 6e 65 20 63 6f 75 6c 64 20 61 72 67 75 65 0a  one could argue.
31e40 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
31e50 6c 6f 6f 70 20 73 68 6f 75 6c 64 20 74 65 72 6d  loop should term
31e60 69 6e 61 74 65 2e 20 20 42 75 74 20 61 73 73 75  inate.  But assu
31e70 6d 69 6e 67 20 31 20 62 69 6c 6c 69 6f 6e 20 69  ming 1 billion i
31e80 74 65 72 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a  terations.    **
31e90 20 70 65 72 20 73 65 63 6f 6e 64 20 28 66 61 72   per second (far
31ea0 20 65 78 63 65 65 64 69 6e 67 20 74 68 65 20 63   exceeding the c
31eb0 61 70 61 62 69 6c 69 74 69 65 73 20 6f 66 20 61  apabilities of a
31ec0 6e 79 20 63 75 72 72 65 6e 74 20 68 61 72 64 77  ny current hardw
31ed0 61 72 65 29 0a 20 20 20 20 2a 2a 20 69 74 20 77  are).    ** it w
31ee0 6f 75 6c 64 20 74 61 6b 65 20 6e 65 61 72 6c 79  ould take nearly
31ef0 20 33 30 30 20 79 65 61 72 73 20 74 6f 20 61 63   300 years to ac
31f00 74 75 61 6c 6c 79 20 72 65 61 63 68 20 74 68 65  tually reach the
31f10 20 6c 69 6d 69 74 2e 20 20 53 6f 0a 20 20 20 20   limit.  So.    
31f20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 66 6f 72 65 76  ** looping forev
31f30 65 72 20 69 73 20 61 20 72 65 61 73 6f 6e 61 62  er is a reasonab
31f40 6c 65 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  le approximation
31f50 2e 20 2a 2f 0a 20 20 20 20 70 4f 75 74 2d 3e 75  . */.    pOut->u
31f60 2e 69 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  .i = -1;.  }else
31f70 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 75 2e 69 20  {.    pOut->u.i 
31f80 3d 20 78 3b 0a 20 20 7d 0a 20 20 62 72 65 61 6b  = x;.  }.  break
31f90 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  ;.}../* Opcode: 
31fa0 49 66 4e 6f 74 5a 65 72 6f 20 50 31 20 50 32 20  IfNotZero P1 P2 
31fb0 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73 69  * * *.** Synopsi
31fc0 73 3a 20 69 66 20 72 5b 50 31 5d 21 3d 30 20 74  s: if r[P1]!=0 t
31fd0 68 65 6e 20 72 5b 50 31 5d 2d 2d 2c 20 67 6f 74  hen r[P1]--, got
31fe0 6f 20 50 32 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73  o P2.**.** Regis
31ff0 74 65 72 20 50 31 20 6d 75 73 74 20 63 6f 6e 74  ter P1 must cont
32000 61 69 6e 20 61 6e 20 69 6e 74 65 67 65 72 2e 20  ain an integer. 
32010 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   If the content 
32020 6f 66 20 72 65 67 69 73 74 65 72 20 50 31 20 69  of register P1 i
32030 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 67  s.** initially g
32040 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
32050 2c 20 74 68 65 6e 20 64 65 63 72 65 6d 65 6e 74  , then decrement
32060 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   the value in re
32070 67 69 73 74 65 72 20 50 31 2e 0a 2a 2a 20 49 66  gister P1..** If
32080 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20   it is non-zero 
32090 28 6e 65 67 61 74 69 76 65 20 6f 72 20 70 6f 73  (negative or pos
320a0 69 74 69 76 65 29 20 61 6e 64 20 74 68 65 6e 20  itive) and then 
320b0 61 6c 73 6f 20 6a 75 6d 70 20 74 6f 20 50 32 2e  also jump to P2.
320c0 20 20 0a 2a 2a 20 49 66 20 72 65 67 69 73 74 65    .** If registe
320d0 72 20 50 31 20 69 73 20 69 6e 69 74 69 61 6c 6c  r P1 is initiall
320e0 79 20 7a 65 72 6f 2c 20 6c 65 61 76 65 20 69 74  y zero, leave it
320f0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 66   unchanged and f
32100 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a  all through..*/.
32110 63 61 73 65 20 4f 50 5f 49 66 4e 6f 74 5a 65 72  case OP_IfNotZer
32120 6f 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 6a  o: {        /* j
32130 75 6d 70 2c 20 69 6e 31 20 2a 2f 0a 20 20 70 49  ump, in1 */.  pI
32140 6e 31 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e  n1 = &aMem[pOp->
32150 70 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  p1];.  assert( p
32160 49 6e 31 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49  In1->flags&MEM_I
32170 6e 74 20 29 3b 0a 20 20 56 64 62 65 42 72 61 6e  nt );.  VdbeBran
32180 63 68 54 61 6b 65 6e 28 70 49 6e 31 2d 3e 75 2e  chTaken(pIn1->u.
32190 69 3c 30 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  i<0, 2);.  if( p
321a0 49 6e 31 2d 3e 75 2e 69 20 29 7b 0a 20 20 20 20  In1->u.i ){.    
321b0 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e 30   if( pIn1->u.i>0
321c0 20 29 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a   ) pIn1->u.i--;.
321d0 20 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74       goto jump_t
321e0 6f 5f 70 32 3b 0a 20 20 7d 0a 20 20 62 72 65 61  o_p2;.  }.  brea
321f0 6b 3b 0a 7d 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  k;.}../* Opcode:
32200 20 44 65 63 72 4a 75 6d 70 5a 65 72 6f 20 50 31   DecrJumpZero P1
32210 20 50 32 20 2a 20 2a 20 2a 0a 2a 2a 20 53 79 6e   P2 * * *.** Syn
32220 6f 70 73 69 73 3a 20 69 66 20 28 2d 2d 72 5b 50  opsis: if (--r[P
32230 31 5d 29 3d 3d 30 20 67 6f 74 6f 20 50 32 0a 2a  1])==0 goto P2.*
32240 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 50 31  *.** Register P1
32250 20 6d 75 73 74 20 68 6f 6c 64 20 61 6e 20 69 6e   must hold an in
32260 74 65 67 65 72 2e 20 20 44 65 63 72 65 6d 65 6e  teger.  Decremen
32270 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 50  t the value in P
32280 31 0a 2a 2a 20 61 6e 64 20 6a 75 6d 70 20 74 6f  1.** and jump to
32290 20 50 32 20 69 66 20 74 68 65 20 6e 65 77 20 76   P2 if the new v
322a0 61 6c 75 65 20 69 73 20 65 78 61 63 74 6c 79 20  alue is exactly 
322b0 7a 65 72 6f 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  zero..*/.case OP
322c0 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 3a 20 7b  _DecrJumpZero: {
322d0 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70 2c 20 69        /* jump, i
322e0 6e 31 20 2a 2f 0a 20 20 70 49 6e 31 20 3d 20 26  n1 */.  pIn1 = &
322f0 61 4d 65 6d 5b 70 4f 70 2d 3e 70 31 5d 3b 0a 20  aMem[pOp->p1];. 
32300 20 61 73 73 65 72 74 28 20 70 49 6e 31 2d 3e 66   assert( pIn1->f
32310 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 3b 0a  lags&MEM_Int );.
32320 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e 69 3e    if( pIn1->u.i>
32330 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 29  SMALLEST_INT64 )
32340 20 70 49 6e 31 2d 3e 75 2e 69 2d 2d 3b 0a 20 20   pIn1->u.i--;.  
32350 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65 6e 28  VdbeBranchTaken(
32360 70 49 6e 31 2d 3e 75 2e 69 3d 3d 30 2c 20 32 29  pIn1->u.i==0, 2)
32370 3b 0a 20 20 69 66 28 20 70 49 6e 31 2d 3e 75 2e  ;.  if( pIn1->u.
32380 69 3d 3d 30 20 29 20 67 6f 74 6f 20 6a 75 6d 70  i==0 ) goto jump
32390 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65 61 6b 3b  _to_p2;.  break;
323a0 0a 7d 0a 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20  .}.../* Opcode: 
323b0 41 67 67 53 74 65 70 30 20 2a 20 50 32 20 50 33  AggStep0 * P2 P3
323c0 20 50 34 20 50 35 0a 2a 2a 20 53 79 6e 6f 70 73   P4 P5.** Synops
323d0 69 73 3a 20 61 63 63 75 6d 3d 72 5b 50 33 5d 20  is: accum=r[P3] 
323e0 73 74 65 70 28 72 5b 50 32 40 50 35 5d 29 0a 2a  step(r[P2@P5]).*
323f0 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
32400 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66   step function f
32410 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  or an aggregate.
32420 20 20 54 68 65 0a 2a 2a 20 66 75 6e 63 74 69 6f    The.** functio
32430 6e 20 68 61 73 20 50 35 20 61 72 67 75 6d 65 6e  n has P5 argumen
32440 74 73 2e 20 20 20 50 34 20 69 73 20 61 20 70 6f  ts.   P4 is a po
32450 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e  inter to the Fun
32460 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72  cDef.** structur
32470 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
32480 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
32490 52 65 67 69 73 74 65 72 20 50 33 20 69 73 20 74  Register P3 is t
324a0 68 65 0a 2a 2a 20 61 63 63 75 6d 75 6c 61 74 6f  he.** accumulato
324b0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 35 20  r..**.** The P5 
324c0 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74 61  arguments are ta
324d0 6b 65 6e 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ken from registe
324e0 72 20 50 32 20 61 6e 64 20 69 74 73 0a 2a 2a 20  r P2 and its.** 
324f0 73 75 63 63 65 73 73 6f 72 73 2e 0a 2a 2f 0a 2f  successors..*/./
32500 2a 20 4f 70 63 6f 64 65 3a 20 41 67 67 53 74 65  * Opcode: AggSte
32510 70 20 2a 20 50 32 20 50 33 20 50 34 20 50 35 0a  p * P2 P3 P4 P5.
32520 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 61 63 63  ** Synopsis: acc
32530 75 6d 3d 72 5b 50 33 5d 20 73 74 65 70 28 72 5b  um=r[P3] step(r[
32540 50 32 40 50 35 5d 29 0a 2a 2a 0a 2a 2a 20 45 78  P2@P5]).**.** Ex
32550 65 63 75 74 65 20 74 68 65 20 73 74 65 70 20 66  ecute the step f
32560 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 61  unction for an a
32570 67 67 72 65 67 61 74 65 2e 20 20 54 68 65 0a 2a  ggregate.  The.*
32580 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 50  * function has P
32590 35 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 50  5 arguments.   P
325a0 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  4 is a pointer t
325b0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6e  o an sqlite3_con
325c0 74 65 78 74 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  text.** object t
325d0 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 72  hat is used to r
325e0 75 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  un the function.
325f0 20 20 52 65 67 69 73 74 65 72 20 50 33 20 69 73    Register P3 is
32600 0a 2a 2a 20 61 73 20 74 68 65 20 61 63 63 75 6d  .** as the accum
32610 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
32620 65 20 50 35 20 61 72 67 75 6d 65 6e 74 73 20 61  e P5 arguments a
32630 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 72 65  re taken from re
32640 67 69 73 74 65 72 20 50 32 20 61 6e 64 20 69 74  gister P2 and it
32650 73 0a 2a 2a 20 73 75 63 63 65 73 73 6f 72 73 2e  s.** successors.
32660 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f  .**.** This opco
32670 64 65 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  de is initially 
32680 63 6f 64 65 64 20 61 73 20 4f 50 5f 41 67 67 53  coded as OP_AggS
32690 74 65 70 30 2e 20 20 4f 6e 20 66 69 72 73 74 20  tep0.  On first 
326a0 65 76 61 6c 75 61 74 69 6f 6e 2c 0a 2a 2a 20 74  evaluation,.** t
326b0 68 65 20 46 75 6e 63 44 65 66 20 73 74 6f 72 65  he FuncDef store
326c0 64 20 69 6e 20 50 34 20 69 73 20 63 6f 6e 76 65  d in P4 is conve
326d0 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 73 71 6c  rted into an sql
326e0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 61 6e 64  ite3_context and
326f0 0a 2a 2a 20 74 68 65 20 6f 70 63 6f 64 65 20 69  .** the opcode i
32700 73 20 63 68 61 6e 67 65 64 2e 20 20 49 6e 20 74  s changed.  In t
32710 68 69 73 20 77 61 79 2c 20 74 68 65 20 69 6e 69  his way, the ini
32720 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
32730 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  he.** sqlite3_co
32740 6e 74 65 78 74 20 6f 6e 6c 79 20 68 61 70 70 65  ntext only happe
32750 6e 73 20 6f 6e 63 65 2c 20 69 6e 73 74 65 61 64  ns once, instead
32760 20 6f 66 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c   of on each call
32770 20 74 6f 20 74 68 65 0a 2a 2a 20 73 74 65 70 20   to the.** step 
32780 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 61 73  function..*/.cas
32790 65 20 4f 50 5f 41 67 67 53 74 65 70 30 3a 20 7b  e OP_AggStep0: {
327a0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
327b0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
327c0 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  x;..  assert( pO
327d0 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 46 55  p->p4type==P4_FU
327e0 4e 43 44 45 46 20 29 3b 0a 20 20 6e 20 3d 20 70  NCDEF );.  n = p
327f0 4f 70 2d 3e 70 35 3b 0a 20 20 61 73 73 65 72 74  Op->p5;.  assert
32800 28 20 70 4f 70 2d 3e 70 33 3e 30 20 26 26 20 70  ( pOp->p3>0 && p
32810 4f 70 2d 3e 70 33 3c 3d 28 70 2d 3e 6e 4d 65 6d  Op->p3<=(p->nMem
32820 2b 31 20 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29  +1 - p->nCursor)
32830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
32840 3d 30 20 7c 7c 20 28 70 4f 70 2d 3e 70 32 3e 30  =0 || (pOp->p2>0
32850 20 26 26 20 70 4f 70 2d 3e 70 32 2b 6e 3c 3d 28   && pOp->p2+n<=(
32860 70 2d 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e  p->nMem+1 - p->n
32870 43 75 72 73 6f 72 29 2b 31 29 20 29 3b 0a 20 20  Cursor)+1) );.  
32880 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3c  assert( pOp->p3<
32890 70 4f 70 2d 3e 70 32 20 7c 7c 20 70 4f 70 2d 3e  pOp->p2 || pOp->
328a0 70 33 3e 3d 70 4f 70 2d 3e 70 32 2b 6e 20 29 3b  p3>=pOp->p2+n );
328b0 0a 20 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65  .  pCtx = sqlite
328c0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
328d0 62 2c 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  b, sizeof(*pCtx)
328e0 20 2b 20 28 6e 2d 31 29 2a 73 69 7a 65 6f 66 28   + (n-1)*sizeof(
328f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 29  sqlite3_value*))
32900 3b 0a 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20  ;.  if( pCtx==0 
32910 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20  ) goto no_mem;. 
32920 20 70 43 74 78 2d 3e 70 4d 65 6d 20 3d 20 30 3b   pCtx->pMem = 0;
32930 0a 20 20 70 43 74 78 2d 3e 70 46 75 6e 63 20 3d  .  pCtx->pFunc =
32940 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
32950 20 20 70 43 74 78 2d 3e 69 4f 70 20 3d 20 28 69    pCtx->iOp = (i
32960 6e 74 29 28 70 4f 70 20 2d 20 61 4f 70 29 3b 0a  nt)(pOp - aOp);.
32970 20 20 70 43 74 78 2d 3e 70 56 64 62 65 20 3d 20    pCtx->pVdbe = 
32980 70 3b 0a 20 20 70 43 74 78 2d 3e 61 72 67 63 20  p;.  pCtx->argc 
32990 3d 20 6e 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = n;.  pOp->p4ty
329a0 70 65 20 3d 20 50 34 5f 46 55 4e 43 43 54 58 3b  pe = P4_FUNCCTX;
329b0 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 20  .  pOp->p4.pCtx 
329c0 3d 20 70 43 74 78 3b 0a 20 20 70 4f 70 2d 3e 6f  = pCtx;.  pOp->o
329d0 70 63 6f 64 65 20 3d 20 4f 50 5f 41 67 67 53 74  pcode = OP_AggSt
329e0 65 70 3b 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ep;.  /* Fall th
329f0 72 6f 75 67 68 20 69 6e 74 6f 20 4f 50 5f 41 67  rough into OP_Ag
32a00 67 53 74 65 70 20 2a 2f 0a 7d 0a 63 61 73 65 20  gStep */.}.case 
32a10 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20  OP_AggStep: {.  
32a20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
32a30 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a  _context *pCtx;.
32a40 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 4d    Mem *pMem;.  M
32a50 65 6d 20 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  em t;..  assert(
32a60 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
32a70 5f 46 55 4e 43 43 54 58 20 29 3b 0a 20 20 70 43  _FUNCCTX );.  pC
32a80 74 78 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74  tx = pOp->p4.pCt
32a90 78 3b 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65  x;.  pMem = &aMe
32aa0 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a 0a 20 20 2f  m[pOp->p3];..  /
32ab0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
32ac0 6f 6e 20 69 73 20 69 6e 73 69 64 65 20 6f 66 20  on is inside of 
32ad0 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 20 72  a trigger, the r
32ae0 65 67 69 73 74 65 72 20 61 72 72 61 79 20 69 6e  egister array in
32af0 20 61 4d 65 6d 5b 5d 0a 20 20 2a 2a 20 6d 69 67   aMem[].  ** mig
32b00 68 74 20 63 68 61 6e 67 65 20 66 72 6f 6d 20 6f  ht change from o
32b10 6e 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 74 6f  ne evaluation to
32b20 20 74 68 65 20 6e 65 78 74 2e 20 20 54 68 65 20   the next.  The 
32b30 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
32b40 64 65 0a 20 20 2a 2a 20 63 68 65 63 6b 73 20 74  de.  ** checks t
32b50 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 67  o see if the reg
32b60 69 73 74 65 72 20 61 72 72 61 79 20 68 61 73 20  ister array has 
32b70 63 68 61 6e 67 65 64 2c 20 61 6e 64 20 69 66 20  changed, and if 
32b80 73 6f 20 69 74 0a 20 20 2a 2a 20 72 65 69 6e 69  so it.  ** reini
32b90 74 69 61 6c 69 7a 65 73 20 74 68 65 20 72 65 6c  tializes the rel
32ba0 61 76 61 6e 74 20 70 61 72 74 73 20 6f 66 20 74  avant parts of t
32bb0 68 65 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  he sqlite3_conte
32bc0 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  xt object */.  i
32bd0 66 28 20 70 43 74 78 2d 3e 70 4d 65 6d 20 21 3d  f( pCtx->pMem !=
32be0 20 70 4d 65 6d 20 29 7b 0a 20 20 20 20 70 43 74   pMem ){.    pCt
32bf0 78 2d 3e 70 4d 65 6d 20 3d 20 70 4d 65 6d 3b 0a  x->pMem = pMem;.
32c00 20 20 20 20 66 6f 72 28 69 3d 70 43 74 78 2d 3e      for(i=pCtx->
32c10 61 72 67 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  argc-1; i>=0; i-
32c20 2d 29 20 70 43 74 78 2d 3e 61 72 67 76 5b 69 5d  -) pCtx->argv[i]
32c30 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 32   = &aMem[pOp->p2
32c40 2b 69 5d 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  +i];.  }..#ifdef
32c50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
32c60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 74 78 2d  for(i=0; i<pCtx-
32c70 3e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >argc; i++){.   
32c80 20 61 73 73 65 72 74 28 20 6d 65 6d 49 73 56 61   assert( memIsVa
32c90 6c 69 64 28 70 43 74 78 2d 3e 61 72 67 76 5b 69  lid(pCtx->argv[i
32ca0 5d 29 20 29 3b 0a 20 20 20 20 52 45 47 49 53 54  ]) );.    REGIST
32cb0 45 52 5f 54 52 41 43 45 28 70 4f 70 2d 3e 70 32  ER_TRACE(pOp->p2
32cc0 2b 69 2c 20 70 43 74 78 2d 3e 61 72 67 76 5b 69  +i, pCtx->argv[i
32cd0 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ]);.  }.#endif..
32ce0 20 20 70 4d 65 6d 2d 3e 6e 2b 2b 3b 0a 20 20 73    pMem->n++;.  s
32cf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
32d00 74 28 26 74 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75  t(&t, db, MEM_Nu
32d10 6c 6c 29 3b 0a 20 20 70 43 74 78 2d 3e 70 4f 75  ll);.  pCtx->pOu
32d20 74 20 3d 20 26 74 3b 0a 20 20 70 43 74 78 2d 3e  t = &t;.  pCtx->
32d30 66 45 72 72 6f 72 4f 72 41 75 78 20 3d 20 30 3b  fErrorOrAux = 0;
32d40 0a 20 20 70 43 74 78 2d 3e 73 6b 69 70 46 6c 61  .  pCtx->skipFla
32d50 67 20 3d 20 30 3b 0a 20 20 28 70 43 74 78 2d 3e  g = 0;.  (pCtx->
32d60 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 29 28 70  pFunc->xSFunc)(p
32d70 43 74 78 2c 70 43 74 78 2d 3e 61 72 67 63 2c 70  Ctx,pCtx->argc,p
32d80 43 74 78 2d 3e 61 72 67 76 29 3b 20 2f 2a 20 49  Ctx->argv); /* I
32d90 4d 50 3a 20 52 2d 32 34 35 30 35 2d 32 33 32 33  MP: R-24505-2323
32da0 30 20 2a 2f 0a 20 20 69 66 28 20 70 43 74 78 2d  0 */.  if( pCtx-
32db0 3e 66 45 72 72 6f 72 4f 72 41 75 78 20 29 7b 0a  >fErrorOrAux ){.
32dc0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 69 73      if( pCtx->is
32dd0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 73  Error ){.      s
32de0 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
32df0 70 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  p, "%s", sqlite3
32e00 5f 76 61 6c 75 65 5f 74 65 78 74 28 26 74 29 29  _value_text(&t))
32e10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 43 74  ;.      rc = pCt
32e20 78 2d 3e 69 73 45 72 72 6f 72 3b 0a 20 20 20 20  x->isError;.    
32e30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
32e40 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 74 29 3b  eMemRelease(&t);
32e50 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
32e60 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f  to abort_due_to_
32e70 65 72 72 6f 72 3b 0a 20 20 7d 65 6c 73 65 7b 0a  error;.  }else{.
32e80 20 20 20 20 61 73 73 65 72 74 28 20 74 2e 66 6c      assert( t.fl
32e90 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
32ea0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 74 78 2d  .  }.  if( pCtx-
32eb0 3e 73 6b 69 70 46 6c 61 67 20 29 7b 0a 20 20 20  >skipFlag ){.   
32ec0 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
32ed0 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 6c  .opcode==OP_Coll
32ee0 53 65 71 20 29 3b 0a 20 20 20 20 69 20 3d 20 70  Seq );.    i = p
32ef0 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 69  Op[-1].p1;.    i
32f00 66 28 20 69 20 29 20 73 71 6c 69 74 65 33 56 64  f( i ) sqlite3Vd
32f10 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 26 61  beMemSetInt64(&a
32f20 4d 65 6d 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a  Mem[i], 1);.  }.
32f30 20 20 62 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 20 4f    break;.}../* O
32f40 70 63 6f 64 65 3a 20 41 67 67 46 69 6e 61 6c 20  pcode: AggFinal 
32f50 50 31 20 50 32 20 2a 20 50 34 20 2a 0a 2a 2a 20  P1 P2 * P4 *.** 
32f60 53 79 6e 6f 70 73 69 73 3a 20 61 63 63 75 6d 3d  Synopsis: accum=
32f70 72 5b 50 31 5d 20 4e 3d 50 32 0a 2a 2a 0a 2a 2a  r[P1] N=P2.**.**
32f80 20 45 78 65 63 75 74 65 20 74 68 65 20 66 69 6e   Execute the fin
32f90 61 6c 69 7a 65 72 20 66 75 6e 63 74 69 6f 6e 20  alizer function 
32fa0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
32fb0 2e 20 20 50 31 20 69 73 0a 2a 2a 20 74 68 65 20  .  P1 is.** the 
32fc0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
32fd0 74 68 61 74 20 69 73 20 74 68 65 20 61 63 63 75  that is the accu
32fe0 6d 75 6c 61 74 6f 72 20 66 6f 72 20 74 68 65 20  mulator for the 
32ff0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
33000 20 50 32 20 69 73 20 74 68 65 20 6e 75 6d 62 65   P2 is the numbe
33010 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
33020 68 61 74 20 74 68 65 20 73 74 65 70 20 66 75 6e  hat the step fun
33030 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 6e 64 0a  ction takes and.
33040 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74  ** P4 is a point
33050 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65  er to the FuncDe
33060 66 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  f for this funct
33070 69 6f 6e 2e 20 20 54 68 65 20 50 32 0a 2a 2a 20  ion.  The P2.** 
33080 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
33090 75 73 65 64 20 62 79 20 74 68 69 73 20 6f 70 63  used by this opc
330a0 6f 64 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ode.  It is only
330b0 20 74 68 65 72 65 20 74 6f 20 64 69 73 61 6d 62   there to disamb
330c0 69 67 75 61 74 65 0a 2a 2a 20 66 75 6e 63 74 69  iguate.** functi
330d0 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 74 61 6b  ons that can tak
330e0 65 20 76 61 72 79 69 6e 67 20 6e 75 6d 62 65 72  e varying number
330f0 73 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  s of arguments. 
33100 20 54 68 65 0a 2a 2a 20 50 34 20 61 72 67 75 6d   The.** P4 argum
33110 65 6e 74 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ent is only need
33120 65 64 20 66 6f 72 20 74 68 65 20 64 65 67 65 6e  ed for the degen
33130 65 72 61 74 65 20 63 61 73 65 20 77 68 65 72 65  erate case where
33140 0a 2a 2a 20 74 68 65 20 73 74 65 70 20 66 75 6e  .** the step fun
33150 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 70 72  ction was not pr
33160 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2e  eviously called.
33170 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 41 67 67 46  .*/.case OP_AggF
33180 69 6e 61 6c 3a 20 7b 0a 20 20 4d 65 6d 20 2a 70  inal: {.  Mem *p
33190 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Mem;.  assert( p
331a0 4f 70 2d 3e 70 31 3e 30 20 26 26 20 70 4f 70 2d  Op->p1>0 && pOp-
331b0 3e 70 31 3c 3d 28 70 2d 3e 6e 4d 65 6d 2b 31 20  >p1<=(p->nMem+1 
331c0 2d 20 70 2d 3e 6e 43 75 72 73 6f 72 29 20 29 3b  - p->nCursor) );
331d0 0a 20 20 70 4d 65 6d 20 3d 20 26 61 4d 65 6d 5b  .  pMem = &aMem[
331e0 70 4f 70 2d 3e 70 31 5d 3b 0a 20 20 61 73 73 65  pOp->p1];.  asse
331f0 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73  rt( (pMem->flags
33200 20 26 20 7e 28 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45   & ~(MEM_Null|ME
33210 4d 5f 41 67 67 29 29 3d 3d 30 20 29 3b 0a 20 20  M_Agg))==0 );.  
33220 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
33230 4d 65 6d 46 69 6e 61 6c 69 7a 65 28 70 4d 65 6d  MemFinalize(pMem
33240 2c 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 29  , pOp->p4.pFunc)
33250 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
33260 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
33270 6f 72 28 70 2c 20 22 25 73 22 2c 20 73 71 6c 69  or(p, "%s", sqli
33280 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
33290 4d 65 6d 29 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Mem));.    goto 
332a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
332b0 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  or;.  }.  sqlite
332c0 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63 6f 64  3VdbeChangeEncod
332d0 69 6e 67 28 70 4d 65 6d 2c 20 65 6e 63 6f 64 69  ing(pMem, encodi
332e0 6e 67 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  ng);.  UPDATE_MA
332f0 58 5f 42 4c 4f 42 53 49 5a 45 28 70 4d 65 6d 29  X_BLOBSIZE(pMem)
33300 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ;.  if( sqlite3V
33310 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70 4d 65  dbeMemTooBig(pMe
33320 6d 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  m) ){.    goto t
33330 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20 20 62 72  oo_big;.  }.  br
33340 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
33350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
33360 2f 2a 20 4f 70 63 6f 64 65 3a 20 43 68 65 63 6b  /* Opcode: Check
33370 70 6f 69 6e 74 20 50 31 20 50 32 20 50 33 20 2a  point P1 P2 P3 *
33380 20 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f   *.**.** Checkpo
33390 69 6e 74 20 64 61 74 61 62 61 73 65 20 50 31 2e  int database P1.
333a0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
333b0 20 69 66 20 50 31 20 69 73 20 6e 6f 74 20 63 75   if P1 is not cu
333c0 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 57 41  rrently in.** WA
333d0 4c 20 6d 6f 64 65 2e 20 50 61 72 61 6d 65 74 65  L mode. Paramete
333e0 72 20 50 32 20 69 73 20 6f 6e 65 20 6f 66 20 53  r P2 is one of S
333f0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
33400 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 2c 0a  _PASSIVE, FULL,.
33410 2a 2a 20 52 45 53 54 41 52 54 2c 20 6f 72 20 54  ** RESTART, or T
33420 52 55 4e 43 41 54 45 2e 20 20 57 72 69 74 65 20  RUNCATE.  Write 
33430 31 20 6f 72 20 30 20 69 6e 74 6f 20 6d 65 6d 5b  1 or 0 into mem[
33440 50 33 5d 20 69 66 20 74 68 65 20 63 68 65 63 6b  P3] if the check
33450 70 6f 69 6e 74 20 72 65 74 75 72 6e 73 0a 2a 2a  point returns.**
33460 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20   SQLITE_BUSY or 
33470 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  not, respectivel
33480 79 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  y.  Write the nu
33490 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
334a0 20 74 68 65 0a 2a 2a 20 57 41 4c 20 61 66 74 65   the.** WAL afte
334b0 72 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  r the checkpoint
334c0 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b 31 5d 20   into mem[P3+1] 
334d0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
334e0 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 20 74 68  f pages.** in th
334f0 65 20 57 41 4c 20 74 68 61 74 20 68 61 76 65 20  e WAL that have 
33500 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65  been checkpointe
33510 64 20 61 66 74 65 72 20 74 68 65 20 63 68 65 63  d after the chec
33520 6b 70 6f 69 6e 74 0a 2a 2a 20 63 6f 6d 70 6c 65  kpoint.** comple
33530 74 65 73 20 69 6e 74 6f 20 6d 65 6d 5b 50 33 2b  tes into mem[P3+
33540 32 5d 2e 20 20 48 6f 77 65 76 65 72 20 6f 6e 20  2].  However on 
33550 61 6e 20 65 72 72 6f 72 2c 20 6d 65 6d 5b 50 33  an error, mem[P3
33560 2b 31 5d 20 61 6e 64 0a 2a 2a 20 6d 65 6d 5b 50  +1] and.** mem[P
33570 33 2b 32 5d 20 61 72 65 20 69 6e 69 74 69 61 6c  3+2] are initial
33580 69 7a 65 64 20 74 6f 20 2d 31 2e 0a 2a 2f 0a 63  ized to -1..*/.c
33590 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
335a0 74 3a 20 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  t: {.  int i;   
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
335d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
335e0 61 52 65 73 5b 33 5d 3b 20 20 20 20 20 20 20 20  aRes[3];        
335f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33600 65 73 75 6c 74 73 20 2a 2f 0a 20 20 4d 65 6d 20  esults */.  Mem 
33610 2a 70 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pMem;          
33620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
33630 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65 72  rite results her
33640 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
33650 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
33660 3b 0a 20 20 61 52 65 73 5b 30 5d 20 3d 20 30 3b  ;.  aRes[0] = 0;
33670 0a 20 20 61 52 65 73 5b 31 5d 20 3d 20 61 52 65  .  aRes[1] = aRe
33680 73 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 61 73 73  s[2] = -1;.  ass
33690 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d 3d 53 51  ert( pOp->p2==SQ
336a0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
336b0 50 41 53 53 49 56 45 0a 20 20 20 20 20 20 20 7c  PASSIVE.       |
336c0 7c 20 70 4f 70 2d 3e 70 32 3d 3d 53 51 4c 49 54  | pOp->p2==SQLIT
336d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
336e0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d  L.       || pOp-
336f0 3e 70 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43  >p2==SQLITE_CHEC
33700 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 0a 20  KPOINT_RESTART. 
33710 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 32        || pOp->p2
33720 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
33730 49 4e 54 5f 54 52 55 4e 43 41 54 45 0a 20 20 29  INT_TRUNCATE.  )
33740 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
33750 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 70  Checkpoint(db, p
33760 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
33770 20 26 61 52 65 73 5b 31 5d 2c 20 26 61 52 65 73   &aRes[1], &aRes
33780 5b 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 20 29  [2]);.  if( rc )
33790 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  {.    if( rc!=SQ
337a0 4c 49 54 45 5f 42 55 53 59 20 29 20 67 6f 74 6f  LITE_BUSY ) goto
337b0 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72   abort_due_to_er
337c0 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ror;.    rc = SQ
337d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 61 52 65  LITE_OK;.    aRe
337e0 73 5b 30 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  s[0] = 1;.  }.  
337f0 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 20 3d 20  for(i=0, pMem = 
33800 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 20  &aMem[pOp->p3]; 
33810 69 3c 33 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  i<3; i++, pMem++
33820 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
33830 62 65 4d 65 6d 53 65 74 49 6e 74 36 34 28 70 4d  beMemSetInt64(pM
33840 65 6d 2c 20 28 69 36 34 29 61 52 65 73 5b 69 5d  em, (i64)aRes[i]
33850 29 3b 0a 20 20 7d 20 20 20 20 0a 20 20 62 72 65  );.  }    .  bre
33860 61 6b 3b 0a 7d 3b 20 20 0a 23 65 6e 64 69 66 0a  ak;.};  .#endif.
33870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33880 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 2f 2a 20 4f  OMIT_PRAGMA./* O
33890 70 63 6f 64 65 3a 20 4a 6f 75 72 6e 61 6c 4d 6f  pcode: JournalMo
338a0 64 65 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  de P1 P2 P3 * *.
338b0 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
338c0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6f 66   journal mode of
338d0 20 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20   database P1 to 
338e0 50 33 2e 20 50 33 20 6d 75 73 74 20 62 65 20 6f  P3. P3 must be o
338f0 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 50 41 47  ne of the.** PAG
33900 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 58  ER_JOURNALMODE_X
33910 58 58 20 76 61 6c 75 65 73 2e 20 49 66 20 63 68  XX values. If ch
33920 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e 20 74  anging between t
33930 68 65 20 76 61 72 69 6f 75 73 20 72 6f 6c 6c 62  he various rollb
33940 61 63 6b 0a 2a 2a 20 6d 6f 64 65 73 20 28 64 65  ack.** modes (de
33950 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 2c 20  lete, truncate, 
33960 70 65 72 73 69 73 74 2c 20 6f 66 66 20 61 6e 64  persist, off and
33970 20 6d 65 6d 6f 72 79 29 2c 20 74 68 69 73 20 69   memory), this i
33980 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 6f 70  s a simple.** op
33990 65 72 61 74 69 6f 6e 2e 20 4e 6f 20 49 4f 20 69  eration. No IO i
339a0 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  s required..**.*
339b0 2a 20 49 66 20 63 68 61 6e 67 69 6e 67 20 69 6e  * If changing in
339c0 74 6f 20 6f 72 20 6f 75 74 20 6f 66 20 57 41 4c  to or out of WAL
339d0 20 6d 6f 64 65 20 74 68 65 20 70 72 6f 63 65 64   mode the proced
339e0 75 72 65 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ure is more comp
339f0 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57  licated..**.** W
33a00 72 69 74 65 20 61 20 73 74 72 69 6e 67 20 63 6f  rite a string co
33a10 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6e  ntaining the fin
33a20 61 6c 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  al journal-mode 
33a30 74 6f 20 72 65 67 69 73 74 65 72 20 50 32 2e 0a  to register P2..
33a40 2a 2f 0a 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e  */.case OP_Journ
33a50 61 6c 4d 6f 64 65 3a 20 7b 20 20 20 20 2f 2a 20  alMode: {    /* 
33a60 6f 75 74 32 20 2a 2f 0a 20 20 42 74 72 65 65 20  out2 */.  Btree 
33a70 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
33a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
33a90 65 65 20 74 6f 20 63 68 61 6e 67 65 20 6a 6f 75  ee to change jou
33aa0 72 6e 61 6c 20 6d 6f 64 65 20 6f 66 20 2a 2f 0a  rnal mode of */.
33ab0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
33ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ad0 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
33ae0 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
33af0 2f 0a 20 20 69 6e 74 20 65 4e 65 77 3b 20 20 20  /.  int eNew;   
33b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b10 20 20 20 20 2f 2a 20 4e 65 77 20 6a 6f 75 72 6e      /* New journ
33b20 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  al mode */.  int
33b30 20 65 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   eOld;          
33b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b50 54 68 65 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20  The old journal 
33b60 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
33b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
33b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
33b90 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
33ba0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
33bb0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 70  abase file for p
33bc0 50 61 67 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  Pager */.#endif.
33bd0 0a 20 20 70 4f 75 74 20 3d 20 6f 75 74 32 50 72  .  pOut = out2Pr
33be0 65 72 65 6c 65 61 73 65 28 70 2c 20 70 4f 70 29  erelease(p, pOp)
33bf0 3b 0a 20 20 65 4e 65 77 20 3d 20 70 4f 70 2d 3e  ;.  eNew = pOp->
33c00 70 33 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4e  p3;.  assert( eN
33c10 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
33c20 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
33c30 20 20 20 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41       || eNew==PA
33c40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
33c50 54 52 55 4e 43 41 54 45 20 0a 20 20 20 20 20 20  TRUNCATE .      
33c60 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
33c70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
33c80 49 53 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  IST .       || e
33c90 4e 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  New==PAGER_JOURN
33ca0 41 4c 4d 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20  ALMODE_OFF.     
33cb0 20 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52    || eNew==PAGER
33cc0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
33cd0 4f 52 59 0a 20 20 20 20 20 20 20 7c 7c 20 65 4e  ORY.       || eN
33ce0 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
33cf0 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20  LMODE_WAL.      
33d00 20 7c 7c 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f   || eNew==PAGER_
33d10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
33d20 59 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y.  );.  assert(
33d30 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26 20 70   pOp->p1>=0 && p
33d40 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62 20 29  Op->p1<db->nDb )
33d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
33d60 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20  eadOnly==0 );.. 
33d70 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
33d80 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 70  Op->p1].pBt;.  p
33d90 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
33da0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
33db0 20 20 65 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    eOld = sqlite3
33dc0 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
33dd0 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ode(pPager);.  i
33de0 66 28 20 65 4e 65 77 3d 3d 50 41 47 45 52 5f 4a  f( eNew==PAGER_J
33df0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
33e00 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a   ) eNew = eOld;.
33e10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 50 61    if( !sqlite3Pa
33e20 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f 75  gerOkToChangeJou
33e30 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
33e40 20 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a   ) eNew = eOld;.
33e50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33e60 4f 4d 49 54 5f 57 41 4c 0a 20 20 7a 46 69 6c 65  OMIT_WAL.  zFile
33e70 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 50 61  name = sqlite3Pa
33e80 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 50 61 67  gerFilename(pPag
33e90 65 72 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 44 6f  er, 1);..  /* Do
33ea0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 74 72 61   not allow a tra
33eb0 6e 73 69 74 69 6f 6e 20 74 6f 20 6a 6f 75 72 6e  nsition to journ
33ec0 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 66 6f 72 20  al_mode=WAL for 
33ed0 61 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  a database.  ** 
33ee0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  in temporary sto
33ef0 72 61 67 65 20 6f 72 20 69 66 20 74 68 65 20 56  rage or if the V
33f00 46 53 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  FS does not supp
33f10 6f 72 74 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ort shared memor
33f20 79 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 4e  y .  */.  if( eN
33f30 65 77 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  ew==PAGER_JOURNA
33f40 4c 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 26 26 20  LMODE_WAL.   && 
33f50 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
33f60 28 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 20  (zFilename)==0  
33f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
33f80 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
33f90 7c 7c 20 21 73 71 6c 69 74 65 33 50 61 67 65 72  || !sqlite3Pager
33fa0 57 61 6c 53 75 70 70 6f 72 74 65 64 28 70 50 61  WalSupported(pPa
33fb0 67 65 72 29 29 20 20 20 2f 2a 20 4e 6f 20 73 68  ger))   /* No sh
33fc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 75 70 70  ared-memory supp
33fd0 6f 72 74 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  ort */.  ){.    
33fe0 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d  eNew = eOld;.  }
33ff0 0a 0a 20 20 69 66 28 20 28 65 4e 65 77 21 3d 65  ..  if( (eNew!=e
34000 4f 6c 64 29 0a 20 20 20 26 26 20 28 65 4f 6c 64  Old).   && (eOld
34010 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
34020 4f 44 45 5f 57 41 4c 20 7c 7c 20 65 4e 65 77 3d  ODE_WAL || eNew=
34030 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34040 44 45 5f 57 41 4c 29 0a 20 20 29 7b 0a 20 20 20  DE_WAL).  ){.   
34050 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f   if( !db->autoCo
34060 6d 6d 69 74 20 7c 7c 20 64 62 2d 3e 6e 56 64 62  mmit || db->nVdb
34070 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 20  eRead>1 ){.     
34080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
34090 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
340a0 33 56 64 62 65 45 72 72 6f 72 28 70 2c 0a 20 20  3VdbeError(p,.  
340b0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
340c0 63 68 61 6e 67 65 20 25 73 20 77 61 6c 20 6d 6f  change %s wal mo
340d0 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  de from within a
340e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 0a 20   transaction",. 
340f0 20 20 20 20 20 20 20 20 20 28 65 4e 65 77 3d 3d           (eNew==
34100 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34110 45 5f 57 41 4c 20 3f 20 22 69 6e 74 6f 22 20 3a  E_WAL ? "into" :
34120 20 22 6f 75 74 20 6f 66 22 29 0a 20 20 20 20 20   "out of").     
34130 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   );.      goto a
34140 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
34150 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0a  r;.    }else{. .
34160 20 20 20 20 20 20 69 66 28 20 65 4f 6c 64 3d 3d        if( eOld==
34170 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34180 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
34190 20 2f 2a 20 49 66 20 6c 65 61 76 69 6e 67 20 57   /* If leaving W
341a0 41 4c 20 6d 6f 64 65 2c 20 63 6c 6f 73 65 20 74  AL mode, close t
341b0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
341c0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
341d0 63 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  call.        ** 
341e0 74 6f 20 50 61 67 65 72 43 6c 6f 73 65 57 61 6c  to PagerCloseWal
341f0 28 29 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61  () checkpoints a
34200 6e 64 20 64 65 6c 65 74 65 73 20 74 68 65 20 77  nd deletes the w
34210 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 0a  rite-ahead-log .
34220 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
34230 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   An EXCLUSIVE lo
34240 63 6b 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ck may still be 
34250 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
34260 62 61 73 65 20 66 69 6c 65 20 0a 20 20 20 20 20  base file .     
34270 20 20 20 2a 2a 20 61 66 74 65 72 20 61 20 73 75     ** after a su
34280 63 63 65 73 73 66 75 6c 20 72 65 74 75 72 6e 2e  ccessful return.
34290 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
342a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
342b0 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 70  3PagerCloseWal(p
342c0 50 61 67 65 72 2c 20 64 62 29 3b 0a 20 20 20 20  Pager, db);.    
342d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
342e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
342f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
34300 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
34310 61 67 65 72 2c 20 65 4e 65 77 29 3b 0a 20 20 20  ager, eNew);.   
34320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
34330 73 65 20 69 66 28 20 65 4f 6c 64 3d 3d 50 41 47  se if( eOld==PAG
34340 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
34350 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
34360 20 2f 2a 20 43 61 6e 6e 6f 74 20 74 72 61 6e 73   /* Cannot trans
34370 69 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66  ition directly f
34380 72 6f 6d 20 4d 45 4d 4f 52 59 20 74 6f 20 57 41  rom MEMORY to WA
34390 4c 2e 20 20 55 73 65 20 6d 6f 64 65 20 4f 46 46  L.  Use mode OFF
343a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
343b0 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 2a  n intermediate *
343c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
343d0 33 50 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c  3PagerSetJournal
343e0 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 50 41 47  Mode(pPager, PAG
343f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
34400 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  FF);.      }.  .
34410 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
34420 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
34430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34440 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
34450 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
34460 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 69 73 20    ** mode, this 
34470 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6c 77 61  transaction alwa
34480 79 73 20 75 73 65 73 20 61 20 72 6f 6c 6c 62 61  ys uses a rollba
34490 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
344a0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
344b0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  t( sqlite3BtreeI
344c0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 3d 3d 30  sInTrans(pBt)==0
344d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
344e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
344f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34500 74 65 33 42 74 72 65 65 53 65 74 56 65 72 73 69  te3BtreeSetVersi
34510 6f 6e 28 70 42 74 2c 20 28 65 4e 65 77 3d 3d 50  on(pBt, (eNew==P
34520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34530 5f 57 41 4c 20 3f 20 32 20 3a 20 31 29 29 3b 0a  _WAL ? 2 : 1));.
34540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34550 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
34560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
34570 41 4c 20 2a 2f 0a 0a 20 20 69 66 28 20 72 63 20  AL */..  if( rc 
34580 29 20 65 4e 65 77 20 3d 20 65 4f 6c 64 3b 0a 20  ) eNew = eOld;. 
34590 20 65 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50   eNew = sqlite3P
345a0 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
345b0 64 65 28 70 50 61 67 65 72 2c 20 65 4e 65 77 29  de(pPager, eNew)
345c0 3b 0a 0a 20 20 70 4f 75 74 2d 3e 66 6c 61 67 73  ;..  pOut->flags
345d0 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 53   = MEM_Str|MEM_S
345e0 74 61 74 69 63 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  tatic|MEM_Term;.
345f0 20 20 70 4f 75 74 2d 3e 7a 20 3d 20 28 63 68 61    pOut->z = (cha
34600 72 20 2a 29 73 71 6c 69 74 65 33 4a 6f 75 72 6e  r *)sqlite3Journ
34610 61 6c 4d 6f 64 65 6e 61 6d 65 28 65 4e 65 77 29  alModename(eNew)
34620 3b 0a 20 20 70 4f 75 74 2d 3e 6e 20 3d 20 73 71  ;.  pOut->n = sq
34630 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4f  lite3Strlen30(pO
34640 75 74 2d 3e 7a 29 3b 0a 20 20 70 4f 75 74 2d 3e  ut->z);.  pOut->
34650 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
34660 38 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  8;.  sqlite3Vdbe
34670 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67 28 70  ChangeEncoding(p
34680 4f 75 74 2c 20 65 6e 63 6f 64 69 6e 67 29 3b 0a  Out, encoding);.
34690 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
346a0 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72  abort_due_to_err
346b0 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 3b 0a  or;.  break;.};.
346c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
346d0 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 20 2a 2f 0a  _OMIT_PRAGMA */.
346e0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
346f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
34700 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
34710 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48  LITE_OMIT_ATTACH
34720 29 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 61 63  )./* Opcode: Vac
34730 75 75 6d 20 50 31 20 2a 20 2a 20 2a 20 2a 0a 2a  uum P1 * * * *.*
34740 2a 0a 2a 2a 20 56 61 63 75 75 6d 20 74 68 65 20  *.** Vacuum the 
34750 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 20  entire database 
34760 50 31 2e 20 20 50 31 20 69 73 20 30 20 66 6f 72  P1.  P1 is 0 for
34770 20 22 6d 61 69 6e 22 2c 20 61 6e 64 20 32 20 6f   "main", and 2 o
34780 72 20 6d 6f 72 65 0a 2a 2a 20 66 6f 72 20 61 6e  r more.** for an
34790 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
347a0 73 65 2e 20 20 54 68 65 20 22 74 65 6d 70 22 20  se.  The "temp" 
347b0 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74  database may not
347c0 20 62 65 20 76 61 63 75 75 6d 65 64 2e 0a 2a 2f   be vacuumed..*/
347d0 0a 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a  .case OP_Vacuum:
347e0 20 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   {.  assert( p->
347f0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
34800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75 6e   rc = sqlite3Run
34810 56 61 63 75 75 6d 28 26 70 2d 3e 7a 45 72 72 4d  Vacuum(&p->zErrM
34820 73 67 2c 20 64 62 2c 20 70 4f 70 2d 3e 70 31 29  sg, db, pOp->p1)
34830 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
34840 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
34850 72 72 6f 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  rror;.  break;.}
34860 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
34870 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
34880 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 2f 2a  T_AUTOVACUUM)./*
34890 20 4f 70 63 6f 64 65 3a 20 49 6e 63 72 56 61 63   Opcode: IncrVac
348a0 75 75 6d 20 50 31 20 50 32 20 2a 20 2a 20 2a 0a  uum P1 P2 * * *.
348b0 2a 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  **.** Perform a 
348c0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 74  single step of t
348d0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
348e0 61 63 75 75 6d 20 70 72 6f 63 65 64 75 72 65 20  acuum procedure 
348f0 6f 6e 0a 2a 2a 20 74 68 65 20 50 31 20 64 61 74  on.** the P1 dat
34900 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 76 61  abase. If the va
34910 63 75 75 6d 20 68 61 73 20 66 69 6e 69 73 68 65  cuum has finishe
34920 64 2c 20 6a 75 6d 70 20 74 6f 20 69 6e 73 74 72  d, jump to instr
34930 75 63 74 69 6f 6e 0a 2a 2a 20 50 32 2e 20 4f 74  uction.** P2. Ot
34940 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
34950 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78  rough to the nex
34960 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  t instruction..*
34970 2f 0a 63 61 73 65 20 4f 50 5f 49 6e 63 72 56 61  /.case OP_IncrVa
34980 63 75 75 6d 3a 20 7b 20 20 20 20 20 20 20 20 2f  cuum: {        /
34990 2a 20 6a 75 6d 70 20 2a 2f 0a 20 20 42 74 72 65  * jump */.  Btre
349a0 65 20 2a 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  e *pBt;..  asser
349b0 74 28 20 70 4f 70 2d 3e 70 31 3e 3d 30 20 26 26  t( pOp->p1>=0 &&
349c0 20 70 4f 70 2d 3e 70 31 3c 64 62 2d 3e 6e 44 62   pOp->p1<db->nDb
349d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 44 62   );.  assert( Db
349e0 4d 61 73 6b 54 65 73 74 28 70 2d 3e 62 74 72 65  MaskTest(p->btre
349f0 65 4d 61 73 6b 2c 20 70 4f 70 2d 3e 70 31 29 20  eMask, pOp->p1) 
34a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
34a10 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
34a20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 70   pBt = db->aDb[p
34a30 4f 70 2d 3e 70 31 5d 2e 70 42 74 3b 0a 20 20 72  Op->p1].pBt;.  r
34a40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34a50 49 6e 63 72 56 61 63 75 75 6d 28 70 42 74 29 3b  IncrVacuum(pBt);
34a60 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
34a70 65 6e 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  en(rc==SQLITE_DO
34a80 4e 45 2c 32 29 3b 0a 20 20 69 66 28 20 72 63 20  NE,2);.  if( rc 
34a90 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ){.    if( rc!=S
34aa0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 67 6f 74  QLITE_DONE ) got
34ab0 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
34ac0 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53  rror;.    rc = S
34ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
34ae0 74 6f 20 6a 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20  to jump_to_p2;. 
34af0 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65   }.  break;.}.#e
34b00 6e 64 69 66 0a 0a 2f 2a 20 4f 70 63 6f 64 65 3a  ndif../* Opcode:
34b10 20 45 78 70 69 72 65 20 50 31 20 2a 20 2a 20 2a   Expire P1 * * *
34b20 20 2a 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 70   *.**.** Cause p
34b30 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
34b40 6d 65 6e 74 73 20 74 6f 20 65 78 70 69 72 65 2e  ments to expire.
34b50 20 20 57 68 65 6e 20 61 6e 20 65 78 70 69 72 65    When an expire
34b60 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69  d statement.** i
34b70 73 20 65 78 65 63 75 74 65 64 20 75 73 69 6e 67  s executed using
34b80 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
34b90 69 74 20 77 69 6c 6c 20 65 69 74 68 65 72 20 61  it will either a
34ba0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
34bb0 72 65 70 72 65 70 61 72 65 20 69 74 73 65 6c 66  reprepare itself
34bc0 20 28 69 66 20 69 74 20 77 61 73 20 6f 72 69 67   (if it was orig
34bd0 69 6e 61 6c 6c 79 20 63 72 65 61 74 65 64 20 75  inally created u
34be0 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 70 72 65  sing sqlite3_pre
34bf0 70 61 72 65 5f 76 32 28 29 29 0a 2a 2a 20 6f 72  pare_v2()).** or
34c00 20 69 74 20 77 69 6c 6c 20 66 61 69 6c 20 77 69   it will fail wi
34c10 74 68 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  th SQLITE_SCHEMA
34c20 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 50 31 20 69  ..** .** If P1 i
34c30 73 20 30 2c 20 74 68 65 6e 20 61 6c 6c 20 53 51  s 0, then all SQ
34c40 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 63  L statements bec
34c50 6f 6d 65 20 65 78 70 69 72 65 64 2e 20 49 66 20  ome expired. If 
34c60 50 31 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a  P1 is non-zero,.
34c70 2a 2a 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65  ** then only the
34c80 20 63 75 72 72 65 6e 74 6c 79 20 65 78 65 63 75   currently execu
34c90 74 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 69  ting statement i
34ca0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2f 0a 63 61  s expired..*/.ca
34cb0 73 65 20 4f 50 5f 45 78 70 69 72 65 3a 20 7b 0a  se OP_Expire: {.
34cc0 20 20 69 66 28 20 21 70 4f 70 2d 3e 70 31 20 29    if( !pOp->p1 )
34cd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
34ce0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
34cf0 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 7d 65 6c  ments(db);.  }el
34d00 73 65 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  se{.    p->expir
34d10 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 62 72  ed = 1;.  }.  br
34d20 65 61 6b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  eak;.}..#ifndef 
34d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
34d40 45 44 5f 43 41 43 48 45 0a 2f 2a 20 4f 70 63 6f  ED_CACHE./* Opco
34d50 64 65 3a 20 54 61 62 6c 65 4c 6f 63 6b 20 50 31  de: TableLock P1
34d60 20 50 32 20 50 33 20 50 34 20 2a 0a 2a 2a 20 53   P2 P3 P4 *.** S
34d70 79 6e 6f 70 73 69 73 3a 20 69 44 62 3d 50 31 20  ynopsis: iDb=P1 
34d80 72 6f 6f 74 3d 50 32 20 77 72 69 74 65 3d 50 33  root=P2 write=P3
34d90 0a 2a 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  .**.** Obtain a 
34da0 6c 6f 63 6b 20 6f 6e 20 61 20 70 61 72 74 69 63  lock on a partic
34db0 75 6c 61 72 20 74 61 62 6c 65 2e 20 54 68 69 73  ular table. This
34dc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
34dd0 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 0a 2a  only used when.*
34de0 2a 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  * the shared-cac
34df0 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e  he feature is en
34e00 61 62 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 50 31  abled. .**.** P1
34e10 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
34e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
34e30 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 6f   sqlite3.aDb[] o
34e40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
34e50 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20 6c  * on which the l
34e60 6f 63 6b 20 69 73 20 61 63 71 75 69 72 65 64 2e  ock is acquired.
34e70 20 20 41 20 72 65 61 64 6c 6f 63 6b 20 69 73 20    A readlock is 
34e80 6f 62 74 61 69 6e 65 64 20 69 66 20 50 33 3d 3d  obtained if P3==
34e90 30 20 6f 72 0a 2a 2a 20 61 20 77 72 69 74 65 20  0 or.** a write 
34ea0 6c 6f 63 6b 20 69 66 20 50 33 3d 3d 31 2e 0a 2a  lock if P3==1..*
34eb0 2a 0a 2a 2a 20 50 32 20 63 6f 6e 74 61 69 6e 73  *.** P2 contains
34ec0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
34ed0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 6c  f the table to l
34ee0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 63 6f  ock..**.** P4 co
34ef0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
34f00 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
34f10 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
34f20 6c 6f 63 6b 65 64 2e 20 54 68 69 73 20 69 73 20  locked. This is 
34f30 6f 6e 6c 79 0a 2a 2a 20 75 73 65 64 20 74 6f 20  only.** used to 
34f40 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  generate an erro
34f50 72 20 6d 65 73 73 61 67 65 20 69 66 20 74 68 65  r message if the
34f60 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
34f70 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 63 61 73  obtained..*/.cas
34f80 65 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 3a 20  e OP_TableLock: 
34f90 7b 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  {.  u8 isWriteLo
34fa0 63 6b 20 3d 20 28 75 38 29 70 4f 70 2d 3e 70 33  ck = (u8)pOp->p3
34fb0 3b 0a 20 20 69 66 28 20 69 73 57 72 69 74 65 4c  ;.  if( isWriteL
34fc0 6f 63 6b 20 7c 7c 20 30 3d 3d 28 64 62 2d 3e 66  ock || 0==(db->f
34fd0 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
34fe0 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 29 7b 0a  Uncommitted) ){.
34ff0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 4f 70      int p1 = pOp
35000 2d 3e 70 31 3b 20 0a 20 20 20 20 61 73 73 65 72  ->p1; .    asser
35010 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 64  t( p1>=0 && p1<d
35020 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73  b->nDb );.    as
35030 73 65 72 74 28 20 44 62 4d 61 73 6b 54 65 73 74  sert( DbMaskTest
35040 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 70  (p->btreeMask, p
35050 31 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  1) );.    assert
35060 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30  ( isWriteLock==0
35070 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d   || isWriteLock=
35080 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =1 );.    rc = s
35090 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54  qlite3BtreeLockT
350a0 61 62 6c 65 28 64 62 2d 3e 61 44 62 5b 70 31 5d  able(db->aDb[p1]
350b0 2e 70 42 74 2c 20 70 4f 70 2d 3e 70 32 2c 20 69  .pBt, pOp->p2, i
350c0 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20  sWriteLock);.   
350d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
350e0 20 69 66 28 20 28 72 63 26 30 78 46 46 29 3d 3d   if( (rc&0xFF)==
350f0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
35100 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
35110 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34  har *z = pOp->p4
35120 2e 7a 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .z;.        sqli
35130 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
35140 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
35150 69 73 20 6c 6f 63 6b 65 64 3a 20 25 73 22 2c 20  is locked: %s", 
35160 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
35170 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
35180 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  _to_error;.    }
35190 0a 20 20 7d 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a  .  }.  break;.}.
351a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
351b0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
351c0 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
351d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
351e0 41 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64  ALTABLE./* Opcod
351f0 65 3a 20 56 42 65 67 69 6e 20 2a 20 2a 20 2a 20  e: VBegin * * * 
35200 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 6d 61  P4 *.**.** P4 ma
35210 79 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  y be a pointer t
35220 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  o an sqlite3_vta
35230 62 20 73 74 72 75 63 74 75 72 65 2e 20 49 66 20  b structure. If 
35240 73 6f 2c 20 63 61 6c 6c 20 74 68 65 20 0a 2a 2a  so, call the .**
35250 20 78 42 65 67 69 6e 20 6d 65 74 68 6f 64 20 66   xBegin method f
35260 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 2a  or that table..*
35270 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 77 68 65 74 68  *.** Also, wheth
35280 65 72 20 6f 72 20 6e 6f 74 20 50 34 20 69 73 20  er or not P4 is 
35290 73 65 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  set, check that 
352a0 74 68 69 73 20 69 73 20 6e 6f 74 20 62 65 69 6e  this is not bein
352b0 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a  g called from.**
352c0 20 77 69 74 68 69 6e 20 61 20 63 61 6c 6c 62 61   within a callba
352d0 63 6b 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20  ck to a virtual 
352e0 74 61 62 6c 65 20 78 53 79 6e 63 28 29 20 6d 65  table xSync() me
352f0 74 68 6f 64 2e 20 49 66 20 69 74 20 69 73 2c 20  thod. If it is, 
35300 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
35310 65 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  e will be set to
35320 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
35330 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 42 65 67 69  */.case OP_VBegi
35340 6e 3a 20 7b 0a 20 20 56 54 61 62 6c 65 20 2a 70  n: {.  VTable *p
35350 56 54 61 62 3b 0a 20 20 70 56 54 61 62 20 3d 20  VTab;.  pVTab = 
35360 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
35370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
35380 62 42 65 67 69 6e 28 64 62 2c 20 70 56 54 61 62  bBegin(db, pVTab
35390 29 3b 0a 20 20 69 66 28 20 70 56 54 61 62 20 29  );.  if( pVTab )
353a0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
353b0 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 54 61  rtErrmsg(p, pVTa
353c0 62 2d 3e 70 56 74 61 62 29 3b 0a 20 20 69 66 28  b->pVtab);.  if(
353d0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
353e0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
353f0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
35400 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35410 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
35420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35430 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
35440 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 43 72  E./* Opcode: VCr
35450 65 61 74 65 20 50 31 20 50 32 20 2a 20 2a 20 2a  eate P1 P2 * * *
35460 0a 2a 2a 0a 2a 2a 20 50 32 20 69 73 20 61 20 72  .**.** P2 is a r
35470 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
35480 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ds the name of a
35490 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
354a0 6e 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 50  n database .** P
354b0 31 2e 20 43 61 6c 6c 20 74 68 65 20 78 43 72 65  1. Call the xCre
354c0 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ate method for t
354d0 68 61 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 63 61  hat table..*/.ca
354e0 73 65 20 4f 50 5f 56 43 72 65 61 74 65 3a 20 7b  se OP_VCreate: {
354f0 0a 20 20 4d 65 6d 20 73 4d 65 6d 3b 20 20 20 20  .  Mem sMem;    
35500 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74 6f        /* For sto
35510 72 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ring the record 
35520 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
35530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
35540 54 61 62 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  Tab;  /* Name of
35550 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
35560 6c 65 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  le */..  memset(
35570 26 73 4d 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sMem, 0, sizeof
35580 28 73 4d 65 6d 29 29 3b 0a 20 20 73 4d 65 6d 2e  (sMem));.  sMem.
35590 64 62 20 3d 20 64 62 3b 0a 20 20 2f 2a 20 42 65  db = db;.  /* Be
355a0 63 61 75 73 65 20 50 32 20 69 73 20 61 6c 77 61  cause P2 is alwa
355b0 79 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  ys a static stri
355c0 6e 67 2c 20 69 74 20 69 73 20 69 6d 70 6f 73 73  ng, it is imposs
355d0 69 62 6c 65 20 66 6f 72 20 74 68 65 0a 20 20 2a  ible for the.  *
355e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  * sqlite3VdbeMem
355f0 43 6f 70 79 28 29 20 74 6f 20 66 61 69 6c 20 2a  Copy() to fail *
35600 2f 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65  /.  assert( (aMe
35610 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73  m[pOp->p2].flags
35620 20 26 20 4d 45 4d 5f 53 74 72 29 21 3d 30 20 29   & MEM_Str)!=0 )
35630 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 4d 65  ;.  assert( (aMe
35640 6d 5b 70 4f 70 2d 3e 70 32 5d 2e 66 6c 61 67 73  m[pOp->p2].flags
35650 20 26 20 4d 45 4d 5f 53 74 61 74 69 63 29 21 3d   & MEM_Static)!=
35660 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
35670 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 26  te3VdbeMemCopy(&
35680 73 4d 65 6d 2c 20 26 61 4d 65 6d 5b 70 4f 70 2d  sMem, &aMem[pOp-
35690 3e 70 32 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  >p2]);.  assert(
356a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
356b0 3b 0a 20 20 7a 54 61 62 20 3d 20 28 63 6f 6e 73  ;.  zTab = (cons
356c0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
356d0 76 61 6c 75 65 5f 74 65 78 74 28 26 73 4d 65 6d  value_text(&sMem
356e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
356f0 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
35700 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 7a  ailed );.  if( z
35710 54 61 62 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Tab ){.    rc = 
35720 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
35730 72 65 61 74 65 28 64 62 2c 20 70 4f 70 2d 3e 70  reate(db, pOp->p
35740 31 2c 20 7a 54 61 62 2c 20 26 70 2d 3e 7a 45 72  1, zTab, &p->zEr
35750 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rMsg);.  }.  sql
35760 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
35770 73 65 28 26 73 4d 65 6d 29 3b 0a 20 20 69 66 28  se(&sMem);.  if(
35780 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
35790 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
357a0 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
357b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
357c0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
357d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
357e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
357f0 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 44 65  E./* Opcode: VDe
35800 73 74 72 6f 79 20 50 31 20 2a 20 2a 20 50 34 20  stroy P1 * * P4 
35810 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 74 68  *.**.** P4 is th
35820 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 69 72 74  e name of a virt
35830 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 64 61 74  ual table in dat
35840 61 62 61 73 65 20 50 31 2e 20 20 43 61 6c 6c 20  abase P1.  Call 
35850 74 68 65 20 78 44 65 73 74 72 6f 79 20 6d 65 74  the xDestroy met
35860 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 61 74 20 74  hod.** of that t
35870 61 62 6c 65 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  able..*/.case OP
35880 5f 56 44 65 73 74 72 6f 79 3a 20 7b 0a 20 20 64  _VDestroy: {.  d
35890 62 2d 3e 6e 56 44 65 73 74 72 6f 79 2b 2b 3b 0a  b->nVDestroy++;.
358a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
358b0 61 62 43 61 6c 6c 44 65 73 74 72 6f 79 28 64 62  abCallDestroy(db
358c0 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
358d0 70 34 2e 7a 29 3b 0a 20 20 64 62 2d 3e 6e 56 44  p4.z);.  db->nVD
358e0 65 73 74 72 6f 79 2d 2d 3b 0a 20 20 69 66 28 20  estroy--;.  if( 
358f0 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
35900 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
35910 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20  break;.}.#endif 
35920 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
35930 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
35940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35950 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
35960 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 4f 70 65  ./* Opcode: VOpe
35970 6e 20 50 31 20 2a 20 2a 20 50 34 20 2a 0a 2a 2a  n P1 * * P4 *.**
35980 0a 2a 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e  .** P4 is a poin
35990 74 65 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c  ter to a virtual
359a0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61   table object, a
359b0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73  n sqlite3_vtab s
359c0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 50 31 20  tructure..** P1 
359d0 69 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  is a cursor numb
359e0 65 72 2e 20 20 54 68 69 73 20 6f 70 63 6f 64 65  er.  This opcode
359f0 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f 72 20   opens a cursor 
35a00 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 0a 2a  to the virtual.*
35a10 2a 20 74 61 62 6c 65 20 61 6e 64 20 73 74 6f 72  * table and stor
35a20 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 69  es that cursor i
35a30 6e 20 50 31 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50  n P1..*/.case OP
35a40 5f 56 4f 70 65 6e 3a 20 7b 0a 20 20 56 64 62 65  _VOpen: {.  Vdbe
35a50 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
35a60 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
35a70 73 6f 72 20 2a 70 56 43 75 72 3b 0a 20 20 73 71  sor *pVCur;.  sq
35a80 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
35a90 62 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  b;.  const sqlit
35aa0 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
35ab0 6c 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  le;..  assert( p
35ac0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 3b 0a 20  ->bIsReader );. 
35ad0 20 70 43 75 72 20 3d 20 30 3b 0a 20 20 70 56 43   pCur = 0;.  pVC
35ae0 75 72 20 3d 20 30 3b 0a 20 20 70 56 74 61 62 20  ur = 0;.  pVtab 
35af0 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
35b00 3e 70 56 74 61 62 3b 0a 20 20 69 66 28 20 70 56  >pVtab;.  if( pV
35b10 74 61 62 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  tab==0 || NEVER(
35b20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3d 3d  pVtab->pModule==
35b30 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  0) ){.    rc = S
35b40 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
35b50 20 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65    goto abort_due
35b60 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
35b70 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62   pModule = pVtab
35b80 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 72 63 20  ->pModule;.  rc 
35b90 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4f 70 65 6e  = pModule->xOpen
35ba0 28 70 56 74 61 62 2c 20 26 70 56 43 75 72 29 3b  (pVtab, &pVCur);
35bb0 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  .  sqlite3VtabIm
35bc0 70 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56  portErrmsg(p, pV
35bd0 74 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tab);.  if( rc )
35be0 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f   goto abort_due_
35bf0 74 6f 5f 65 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  to_error;..  /* 
35c00 49 6e 69 74 69 61 6c 69 7a 65 20 73 71 6c 69 74  Initialize sqlit
35c10 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
35c20 61 73 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 70  ase class */.  p
35c30 56 43 75 72 2d 3e 70 56 74 61 62 20 3d 20 70 56  VCur->pVtab = pV
35c40 74 61 62 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  tab;..  /* Initi
35c50 61 6c 69 7a 65 20 76 64 62 65 20 63 75 72 73 6f  alize vdbe curso
35c60 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 43  r object */.  pC
35c70 75 72 20 3d 20 61 6c 6c 6f 63 61 74 65 43 75 72  ur = allocateCur
35c80 73 6f 72 28 70 2c 20 70 4f 70 2d 3e 70 31 2c 20  sor(p, pOp->p1, 
35c90 30 2c 20 2d 31 2c 20 43 55 52 54 59 50 45 5f 56  0, -1, CURTYPE_V
35ca0 54 41 42 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TAB);.  if( pCur
35cb0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 75 63   ){.    pCur->uc
35cc0 2e 70 56 43 75 72 20 3d 20 70 56 43 75 72 3b 0a  .pVCur = pVCur;.
35cd0 20 20 20 20 70 56 74 61 62 2d 3e 6e 52 65 66 2b      pVtab->nRef+
35ce0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
35cf0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
35d00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
35d10 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
35d20 70 56 43 75 72 29 3b 0a 20 20 20 20 67 6f 74 6f  pVCur);.    goto
35d30 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 0a 20 20 62   no_mem;.  }.  b
35d40 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  reak;.}.#endif /
35d50 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
35d60 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
35d70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
35d80 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
35d90 2f 2a 20 4f 70 63 6f 64 65 3a 20 56 46 69 6c 74  /* Opcode: VFilt
35da0 65 72 20 50 31 20 50 32 20 50 33 20 50 34 20 2a  er P1 P2 P3 P4 *
35db0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 69 70  .** Synopsis: ip
35dc0 6c 61 6e 3d 72 5b 50 33 5d 20 7a 70 6c 61 6e 3d  lan=r[P3] zplan=
35dd0 27 50 34 27 0a 2a 2a 0a 2a 2a 20 50 31 20 69 73  'P4'.**.** P1 is
35de0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
35df0 20 75 73 69 6e 67 20 56 4f 70 65 6e 2e 20 20 50   using VOpen.  P
35e00 32 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20  2 is an address 
35e10 74 6f 20 6a 75 6d 70 20 74 6f 20 69 66 0a 2a 2a  to jump to if.**
35e20 20 74 68 65 20 66 69 6c 74 65 72 65 64 20 72 65   the filtered re
35e30 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d 70 74  sult set is empt
35e40 79 2e 0a 2a 2a 0a 2a 2a 20 50 34 20 69 73 20 65  y..**.** P4 is e
35e50 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
35e60 73 74 72 69 6e 67 20 74 68 61 74 20 77 61 73 20  string that was 
35e70 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
35e80 20 78 42 65 73 74 49 6e 64 65 78 0a 2a 2a 20 6d   xBestIndex.** m
35e90 65 74 68 6f 64 20 6f 66 20 74 68 65 20 6d 6f 64  ethod of the mod
35ea0 75 6c 65 2e 20 20 54 68 65 20 69 6e 74 65 72 70  ule.  The interp
35eb0 72 65 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  retation of the 
35ec0 50 34 20 73 74 72 69 6e 67 20 69 73 20 6c 65 66  P4 string is lef
35ed0 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6d 6f 64 75  t.** to the modu
35ee0 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
35ef0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 70  n..**.** This op
35f00 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74 68 65  code invokes the
35f10 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20   xFilter method 
35f20 6f 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  on the virtual t
35f30 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 0a 2a  able specified.*
35f40 2a 20 62 79 20 50 31 2e 20 20 54 68 65 20 69 6e  * by P1.  The in
35f50 74 65 67 65 72 20 71 75 65 72 79 20 70 6c 61 6e  teger query plan
35f60 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 78 46   parameter to xF
35f70 69 6c 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  ilter is stored 
35f80 69 6e 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 50  in register.** P
35f90 33 2e 20 52 65 67 69 73 74 65 72 20 50 33 2b 31  3. Register P3+1
35fa0 20 73 74 6f 72 65 73 20 74 68 65 20 61 72 67 63   stores the argc
35fb0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 62 65   parameter to be
35fc0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a   passed to the.*
35fd0 2a 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  * xFilter method
35fe0 2e 20 52 65 67 69 73 74 65 72 73 20 50 33 2b 32  . Registers P3+2
35ff0 2e 2e 50 33 2b 31 2b 61 72 67 63 20 61 72 65 20  ..P3+1+argc are 
36000 74 68 65 20 61 72 67 63 0a 2a 2a 20 61 64 64 69  the argc.** addi
36010 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72  tional parameter
36020 73 20 77 68 69 63 68 20 61 72 65 20 70 61 73 73  s which are pass
36030 65 64 20 74 6f 0a 2a 2a 20 78 46 69 6c 74 65 72  ed to.** xFilter
36040 20 61 73 20 61 72 67 76 2e 20 52 65 67 69 73 74   as argv. Regist
36050 65 72 20 50 33 2b 32 20 62 65 63 6f 6d 65 73 20  er P3+2 becomes 
36060 61 72 67 76 5b 30 5d 20 77 68 65 6e 20 70 61 73  argv[0] when pas
36070 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 2e 0a  sed to xFilter..
36080 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 69 73 20  **.** A jump is 
36090 6d 61 64 65 20 74 6f 20 50 32 20 69 66 20 74 68  made to P2 if th
360a0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 66 74  e result set aft
360b0 65 72 20 66 69 6c 74 65 72 69 6e 67 20 77 6f 75  er filtering wou
360c0 6c 64 20 62 65 20 65 6d 70 74 79 2e 0a 2a 2f 0a  ld be empty..*/.
360d0 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
360e0 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20 2a 2f 0a   {   /* jump */.
360f0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
36100 74 20 69 51 75 65 72 79 3b 0a 20 20 63 6f 6e 73  t iQuery;.  cons
36110 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
36120 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 4d 65 6d   *pModule;.  Mem
36130 20 2a 70 51 75 65 72 79 3b 0a 20 20 4d 65 6d 20   *pQuery;.  Mem 
36140 2a 70 41 72 67 63 3b 0a 20 20 73 71 6c 69 74 65  *pArgc;.  sqlite
36150 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
36160 56 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  VCur;.  sqlite3_
36170 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 56  vtab *pVtab;.  V
36180 64 62 65 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  dbeCursor *pCur;
36190 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e  .  int res;.  in
361a0 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41  t i;.  Mem **apA
361b0 72 67 3b 0a 0a 20 20 70 51 75 65 72 79 20 3d 20  rg;..  pQuery = 
361c0 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33 5d 3b 0a  &aMem[pOp->p3];.
361d0 20 20 70 41 72 67 63 20 3d 20 26 70 51 75 65 72    pArgc = &pQuer
361e0 79 5b 31 5d 3b 0a 20 20 70 43 75 72 20 3d 20 70  y[1];.  pCur = p
361f0 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
36200 3b 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 49  ;.  assert( memI
36210 73 56 61 6c 69 64 28 70 51 75 65 72 79 29 20 29  sValid(pQuery) )
36220 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52 41  ;.  REGISTER_TRA
36230 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 51 75 65  CE(pOp->p3, pQue
36240 72 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ry);.  assert( p
36250 43 75 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  Cur->eCurType==C
36260 55 52 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20  URTYPE_VTAB );. 
36270 20 70 56 43 75 72 20 3d 20 70 43 75 72 2d 3e 75   pVCur = pCur->u
36280 63 2e 70 56 43 75 72 3b 0a 20 20 70 56 74 61 62  c.pVCur;.  pVtab
36290 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 3b   = pVCur->pVtab;
362a0 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  .  pModule = pVt
362b0 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 0a 20 20  ab->pModule;..  
362c0 2f 2a 20 47 72 61 62 20 74 68 65 20 69 6e 64 65  /* Grab the inde
362d0 78 20 6e 75 6d 62 65 72 20 61 6e 64 20 61 72 67  x number and arg
362e0 63 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  c parameters */.
362f0 20 20 61 73 73 65 72 74 28 20 28 70 51 75 65 72    assert( (pQuer
36300 79 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  y->flags&MEM_Int
36310 29 21 3d 30 20 26 26 20 70 41 72 67 63 2d 3e 66  )!=0 && pArgc->f
36320 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 74 20 29 3b  lags==MEM_Int );
36330 0a 20 20 6e 41 72 67 20 3d 20 28 69 6e 74 29 70  .  nArg = (int)p
36340 41 72 67 63 2d 3e 75 2e 69 3b 0a 20 20 69 51 75  Argc->u.i;.  iQu
36350 65 72 79 20 3d 20 28 69 6e 74 29 70 51 75 65 72  ery = (int)pQuer
36360 79 2d 3e 75 2e 69 3b 0a 0a 20 20 2f 2a 20 49 6e  y->u.i;..  /* In
36370 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 74 65 72  voke the xFilter
36380 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 65 73   method */.  res
36390 20 3d 20 30 3b 0a 20 20 61 70 41 72 67 20 3d 20   = 0;.  apArg = 
363a0 70 2d 3e 61 70 41 72 67 3b 0a 20 20 66 6f 72 28  p->apArg;.  for(
363b0 69 20 3d 20 30 3b 20 69 3c 6e 41 72 67 3b 20 69  i = 0; i<nArg; i
363c0 2b 2b 29 7b 0a 20 20 20 20 61 70 41 72 67 5b 69  ++){.    apArg[i
363d0 5d 20 3d 20 26 70 41 72 67 63 5b 69 2b 31 5d 3b  ] = &pArgc[i+1];
363e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 4d 6f 64  .  }.  rc = pMod
363f0 75 6c 65 2d 3e 78 46 69 6c 74 65 72 28 70 56 43  ule->xFilter(pVC
36400 75 72 2c 20 69 51 75 65 72 79 2c 20 70 4f 70 2d  ur, iQuery, pOp-
36410 3e 70 34 2e 7a 2c 20 6e 41 72 67 2c 20 61 70 41  >p4.z, nArg, apA
36420 72 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  rg);.  sqlite3Vt
36430 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 70  abImportErrmsg(p
36440 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66 28 20  , pVtab);.  if( 
36450 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f  rc ) goto abort_
36460 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20  due_to_error;.  
36470 72 65 73 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78  res = pModule->x
36480 45 6f 66 28 70 56 43 75 72 29 3b 0a 20 20 70 43  Eof(pVCur);.  pC
36490 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 30 3b  ur->nullRow = 0;
364a0 0a 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b  .  VdbeBranchTak
364b0 65 6e 28 72 65 73 21 3d 30 2c 32 29 3b 0a 20 20  en(res!=0,2);.  
364c0 69 66 28 20 72 65 73 20 29 20 67 6f 74 6f 20 6a  if( res ) goto j
364d0 75 6d 70 5f 74 6f 5f 70 32 3b 0a 20 20 62 72 65  ump_to_p2;.  bre
364e0 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ak;.}.#endif /* 
364f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36500 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
36510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36520 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
36530 20 4f 70 63 6f 64 65 3a 20 56 43 6f 6c 75 6d 6e   Opcode: VColumn
36540 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a 2a 2a   P1 P2 P3 * *.**
36550 20 53 79 6e 6f 70 73 69 73 3a 20 72 5b 50 33 5d   Synopsis: r[P3]
36560 3d 76 63 6f 6c 75 6d 6e 28 50 32 29 0a 2a 2a 0a  =vcolumn(P2).**.
36570 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  ** Store the val
36580 75 65 20 6f 66 20 74 68 65 20 50 32 2d 74 68 20  ue of the P2-th 
36590 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
365a0 20 72 6f 77 20 6f 66 20 74 68 65 20 76 69 72 74   row of the virt
365b0 75 61 6c 2d 74 61 62 6c 65 20 74 68 61 74 20 74  ual-table that t
365c0 68 65 20 0a 2a 2a 20 50 31 20 63 75 72 73 6f 72  he .** P1 cursor
365d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
365e0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 50 33  into register P3
365f0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 43 6f  ..*/.case OP_VCo
36600 6c 75 6d 6e 3a 20 7b 0a 20 20 73 71 6c 69 74 65  lumn: {.  sqlite
36610 33 5f 76 74 61 62 20 2a 70 56 74 61 62 3b 0a 20  3_vtab *pVtab;. 
36620 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
36630 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a  odule *pModule;.
36640 20 20 4d 65 6d 20 2a 70 44 65 73 74 3b 0a 20 20    Mem *pDest;.  
36650 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
36660 73 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 56 64 62  sContext;..  Vdb
36670 65 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  eCursor *pCur = 
36680 70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31  p->apCsr[pOp->p1
36690 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
366a0 72 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  r->eCurType==CUR
366b0 54 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 61  TYPE_VTAB );.  a
366c0 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 3e 30  ssert( pOp->p3>0
366d0 20 26 26 20 70 4f 70 2d 3e 70 33 3c 3d 28 70 2d   && pOp->p3<=(p-
366e0 3e 6e 4d 65 6d 2b 31 20 2d 20 70 2d 3e 6e 43 75  >nMem+1 - p->nCu
366f0 72 73 6f 72 29 20 29 3b 0a 20 20 70 44 65 73 74  rsor) );.  pDest
36700 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70 33   = &aMem[pOp->p3
36710 5d 3b 0a 20 20 6d 65 6d 41 62 6f 75 74 54 6f 43  ];.  memAboutToC
36720 68 61 6e 67 65 28 70 2c 20 70 44 65 73 74 29 3b  hange(p, pDest);
36730 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 75 6c  .  if( pCur->nul
36740 6c 52 6f 77 20 29 7b 0a 20 20 20 20 73 71 6c 69  lRow ){.    sqli
36750 74 65 33 56 64 62 65 4d 65 6d 53 65 74 4e 75 6c  te3VdbeMemSetNul
36760 6c 28 70 44 65 73 74 29 3b 0a 20 20 20 20 62 72  l(pDest);.    br
36770 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 56 74 61 62  eak;.  }.  pVtab
36780 20 3d 20 70 43 75 72 2d 3e 75 63 2e 70 56 43 75   = pCur->uc.pVCu
36790 72 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4d 6f 64  r->pVtab;.  pMod
367a0 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
367b0 64 75 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  dule;.  assert( 
367c0 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d 6e  pModule->xColumn
367d0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 43   );.  memset(&sC
367e0 6f 6e 74 65 78 74 2c 20 30 2c 20 73 69 7a 65 6f  ontext, 0, sizeo
367f0 66 28 73 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20  f(sContext));.  
36800 73 43 6f 6e 74 65 78 74 2e 70 4f 75 74 20 3d 20  sContext.pOut = 
36810 70 44 65 73 74 3b 0a 20 20 4d 65 6d 53 65 74 54  pDest;.  MemSetT
36820 79 70 65 46 6c 61 67 28 70 44 65 73 74 2c 20 4d  ypeFlag(pDest, M
36830 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 72 63 20 3d  EM_Null);.  rc =
36840 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6f 6c 75 6d   pModule->xColum
36850 6e 28 70 43 75 72 2d 3e 75 63 2e 70 56 43 75 72  n(pCur->uc.pVCur
36860 2c 20 26 73 43 6f 6e 74 65 78 74 2c 20 70 4f 70  , &sContext, pOp
36870 2d 3e 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->p2);.  sqlite3
36880 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67  VtabImportErrmsg
36890 28 70 2c 20 70 56 74 61 62 29 3b 0a 20 20 69 66  (p, pVtab);.  if
368a0 28 20 73 43 6f 6e 74 65 78 74 2e 69 73 45 72 72  ( sContext.isErr
368b0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  or ){.    rc = s
368c0 43 6f 6e 74 65 78 74 2e 69 73 45 72 72 6f 72 3b  Context.isError;
368d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
368e0 62 65 43 68 61 6e 67 65 45 6e 63 6f 64 69 6e 67  beChangeEncoding
368f0 28 70 44 65 73 74 2c 20 65 6e 63 6f 64 69 6e 67  (pDest, encoding
36900 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54 52  );.  REGISTER_TR
36910 41 43 45 28 70 4f 70 2d 3e 70 33 2c 20 70 44 65  ACE(pOp->p3, pDe
36920 73 74 29 3b 0a 20 20 55 50 44 41 54 45 5f 4d 41  st);.  UPDATE_MA
36930 58 5f 42 4c 4f 42 53 49 5a 45 28 70 44 65 73 74  X_BLOBSIZE(pDest
36940 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
36950 33 56 64 62 65 4d 65 6d 54 6f 6f 42 69 67 28 70  3VdbeMemTooBig(p
36960 44 65 73 74 29 20 29 7b 0a 20 20 20 20 67 6f 74  Dest) ){.    got
36970 6f 20 74 6f 6f 5f 62 69 67 3b 0a 20 20 7d 0a 20  o too_big;.  }. 
36980 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 61   if( rc ) goto a
36990 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65 72 72 6f  bort_due_to_erro
369a0 72 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d 0a 23 65  r;.  break;.}.#e
369b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
369c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
369d0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
369e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
369f0 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65 3a  TABLE./* Opcode:
36a00 20 56 4e 65 78 74 20 50 31 20 50 32 20 2a 20 2a   VNext P1 P2 * *
36a10 20 2a 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65   *.**.** Advance
36a20 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 50   virtual table P
36a30 31 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  1 to the next ro
36a40 77 20 69 6e 20 69 74 73 20 72 65 73 75 6c 74 20  w in its result 
36a50 73 65 74 20 61 6e 64 0a 2a 2a 20 6a 75 6d 70 20  set and.** jump 
36a60 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50  to instruction P
36a70 32 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 76  2.  Or, if the v
36a80 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 73  irtual table has
36a90 20 72 65 61 63 68 65 64 0a 2a 2a 20 74 68 65 20   reached.** the 
36aa0 65 6e 64 20 6f 66 20 69 74 73 20 72 65 73 75 6c  end of its resul
36ab0 74 20 73 65 74 2c 20 74 68 65 6e 20 66 61 6c 6c  t set, then fall
36ac0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
36ad0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
36ae0 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 56 4e 65  ..*/.case OP_VNe
36af0 78 74 3a 20 7b 20 20 20 2f 2a 20 6a 75 6d 70 20  xt: {   /* jump 
36b00 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
36b10 62 20 2a 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73  b *pVtab;.  cons
36b20 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
36b30 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74   *pModule;.  int
36b40 20 72 65 73 3b 0a 20 20 56 64 62 65 43 75 72 73   res;.  VdbeCurs
36b50 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 72 65 73  or *pCur;..  res
36b60 20 3d 20 30 3b 0a 20 20 70 43 75 72 20 3d 20 70   = 0;.  pCur = p
36b70 2d 3e 61 70 43 73 72 5b 70 4f 70 2d 3e 70 31 5d  ->apCsr[pOp->p1]
36b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
36b90 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
36ba0 59 50 45 5f 56 54 41 42 20 29 3b 0a 20 20 69 66  YPE_VTAB );.  if
36bb0 28 20 70 43 75 72 2d 3e 6e 75 6c 6c 52 6f 77 20  ( pCur->nullRow 
36bc0 29 7b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ){.    break;.  
36bd0 7d 0a 20 20 70 56 74 61 62 20 3d 20 70 43 75 72  }.  pVtab = pCur
36be0 2d 3e 75 63 2e 70 56 43 75 72 2d 3e 70 56 74 61  ->uc.pVCur->pVta
36bf0 62 3b 0a 20 20 70 4d 6f 64 75 6c 65 20 3d 20 70  b;.  pModule = p
36c00 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
36c10 20 61 73 73 65 72 74 28 20 70 4d 6f 64 75 6c 65   assert( pModule
36c20 2d 3e 78 4e 65 78 74 20 29 3b 0a 0a 20 20 2f 2a  ->xNext );..  /*
36c30 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 4e 65 78   Invoke the xNex
36c40 74 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  t() method of th
36c50 65 20 6d 6f 64 75 6c 65 2e 20 54 68 65 72 65 20  e module. There 
36c60 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 74 68  is no way for th
36c70 65 0a 20 20 2a 2a 20 75 6e 64 65 72 6c 79 69 6e  e.  ** underlyin
36c80 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
36c90 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
36ca0 72 6f 72 20 69 66 20 6f 6e 65 20 6f 63 63 75 72  ror if one occur
36cb0 73 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 78 4e  s during.  ** xN
36cc0 65 78 74 28 29 2e 20 49 6e 73 74 65 61 64 2c 20  ext(). Instead, 
36cd0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
36ce0 72 73 2c 20 74 72 75 65 20 69 73 20 72 65 74 75  rs, true is retu
36cf0 72 6e 65 64 20 28 69 6e 64 69 63 61 74 69 6e 67  rned (indicating
36d00 20 74 68 61 74 20 0a 20 20 2a 2a 20 64 61 74 61   that .  ** data
36d10 20 69 73 20 61 76 61 69 6c 61 62 6c 65 29 20 61   is available) a
36d20 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
36d30 65 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  e returned when 
36d40 78 43 6f 6c 75 6d 6e 20 6f 72 0a 20 20 2a 2a 20  xColumn or.  ** 
36d50 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 74 68 6f  some other metho
36d60 64 20 69 73 20 6e 65 78 74 20 69 6e 76 6f 6b 65  d is next invoke
36d70 64 20 6f 6e 20 74 68 65 20 73 61 76 65 20 76 69  d on the save vi
36d80 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72 73  rtual table curs
36d90 6f 72 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  or..  */.  rc = 
36da0 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 78 74 28 70  pModule->xNext(p
36db0 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
36dc0 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
36dd0 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
36de0 61 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ab);.  if( rc ) 
36df0 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74  goto abort_due_t
36e00 6f 5f 65 72 72 6f 72 3b 0a 20 20 72 65 73 20 3d  o_error;.  res =
36e10 20 70 4d 6f 64 75 6c 65 2d 3e 78 45 6f 66 28 70   pModule->xEof(p
36e20 43 75 72 2d 3e 75 63 2e 70 56 43 75 72 29 3b 0a  Cur->uc.pVCur);.
36e30 20 20 56 64 62 65 42 72 61 6e 63 68 54 61 6b 65    VdbeBranchTake
36e40 6e 28 21 72 65 73 2c 32 29 3b 0a 20 20 69 66 28  n(!res,2);.  if(
36e50 20 21 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20   !res ){.    /* 
36e60 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61  If there is data
36e70 2c 20 6a 75 6d 70 20 74 6f 20 50 32 20 2a 2f 0a  , jump to P2 */.
36e80 20 20 20 20 67 6f 74 6f 20 6a 75 6d 70 5f 74 6f      goto jump_to
36e90 5f 70 32 5f 61 6e 64 5f 63 68 65 63 6b 5f 66 6f  _p2_and_check_fo
36ea0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 20 20 7d  r_interrupt;.  }
36eb0 0a 20 20 67 6f 74 6f 20 63 68 65 63 6b 5f 66 6f  .  goto check_fo
36ec0 72 5f 69 6e 74 65 72 72 75 70 74 3b 0a 7d 0a 23  r_interrupt;.}.#
36ed0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36ee0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
36ef0 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
36f00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
36f10 4c 54 41 42 4c 45 0a 2f 2a 20 4f 70 63 6f 64 65  LTABLE./* Opcode
36f20 3a 20 56 52 65 6e 61 6d 65 20 50 31 20 2a 20 2a  : VRename P1 * *
36f30 20 50 34 20 2a 0a 2a 2a 0a 2a 2a 20 50 34 20 69   P4 *.**.** P4 i
36f40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
36f50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
36f60 62 6a 65 63 74 2c 20 61 6e 20 73 71 6c 69 74 65  bject, an sqlite
36f70 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
36f80 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 63 6f 64 65  ..** This opcode
36f90 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 72   invokes the cor
36fa0 72 65 73 70 6f 6e 64 69 6e 67 20 78 52 65 6e 61  responding xRena
36fb0 6d 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 76  me method. The v
36fc0 61 6c 75 65 0a 2a 2a 20 69 6e 20 72 65 67 69 73  alue.** in regis
36fd0 74 65 72 20 50 31 20 69 73 20 70 61 73 73 65 64  ter P1 is passed
36fe0 20 61 73 20 74 68 65 20 7a 4e 61 6d 65 20 61 72   as the zName ar
36ff0 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 78 52  gument to the xR
37000 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ename method..*/
37010 0a 63 61 73 65 20 4f 50 5f 56 52 65 6e 61 6d 65  .case OP_VRename
37020 3a 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  : {.  sqlite3_vt
37030 61 62 20 2a 70 56 74 61 62 3b 0a 20 20 4d 65 6d  ab *pVtab;.  Mem
37040 20 2a 70 4e 61 6d 65 3b 0a 0a 20 20 70 56 74 61   *pName;..  pVta
37050 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
37060 62 2d 3e 70 56 74 61 62 3b 0a 20 20 70 4e 61 6d  b->pVtab;.  pNam
37070 65 20 3d 20 26 61 4d 65 6d 5b 70 4f 70 2d 3e 70  e = &aMem[pOp->p
37080 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56  1];.  assert( pV
37090 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 52  tab->pModule->xR
370a0 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
370b0 74 28 20 6d 65 6d 49 73 56 61 6c 69 64 28 70 4e  t( memIsValid(pN
370c0 61 6d 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ame) );.  assert
370d0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
370e0 20 29 3b 0a 20 20 52 45 47 49 53 54 45 52 5f 54   );.  REGISTER_T
370f0 52 41 43 45 28 70 4f 70 2d 3e 70 31 2c 20 70 4e  RACE(pOp->p1, pN
37100 61 6d 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ame);.  assert( 
37110 70 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 20 4d  pName->flags & M
37120 45 4d 5f 53 74 72 20 29 3b 0a 20 20 74 65 73 74  EM_Str );.  test
37130 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e 63  case( pName->enc
37140 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b  ==SQLITE_UTF8 );
37150 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 61  .  testcase( pNa
37160 6d 65 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  me->enc==SQLITE_
37170 55 54 46 31 36 42 45 20 29 3b 0a 20 20 74 65 73  UTF16BE );.  tes
37180 74 63 61 73 65 28 20 70 4e 61 6d 65 2d 3e 65 6e  tcase( pName->en
37190 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
371a0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
371b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 45 6e 63  te3VdbeChangeEnc
371c0 6f 64 69 6e 67 28 70 4e 61 6d 65 2c 20 53 51 4c  oding(pName, SQL
371d0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
371e0 20 72 63 20 29 20 67 6f 74 6f 20 61 62 6f 72 74   rc ) goto abort
371f0 5f 64 75 65 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20  _due_to_error;. 
37200 20 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f   rc = pVtab->pMo
37210 64 75 6c 65 2d 3e 78 52 65 6e 61 6d 65 28 70 56  dule->xRename(pV
37220 74 61 62 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  tab, pName->z);.
37230 20 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70    sqlite3VtabImp
37240 6f 72 74 45 72 72 6d 73 67 28 70 2c 20 70 56 74  ortErrmsg(p, pVt
37250 61 62 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ab);.  p->expire
37260 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 20  d = 0;.  if( rc 
37270 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
37280 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 62 72 65  _to_error;.  bre
37290 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ak;.}.#endif..#i
372a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
372b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
372c0 2a 20 4f 70 63 6f 64 65 3a 20 56 55 70 64 61 74  * Opcode: VUpdat
372d0 65 20 50 31 20 50 32 20 50 33 20 50 34 20 50 35  e P1 P2 P3 P4 P5
372e0 0a 2a 2a 20 53 79 6e 6f 70 73 69 73 3a 20 64 61  .** Synopsis: da
372f0 74 61 3d 72 5b 50 33 40 50 32 5d 0a 2a 2a 0a 2a  ta=r[P3@P2].**.*
37300 2a 20 50 34 20 69 73 20 61 20 70 6f 69 6e 74 65  * P4 is a pointe
37310 72 20 74 6f 20 61 20 76 69 72 74 75 61 6c 20 74  r to a virtual t
37320 61 62 6c 65 20 6f 62 6a 65 63 74 2c 20 61 6e 20  able object, an 
37330 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
37340 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 69 73 20  ucture..** This 
37350 6f 70 63 6f 64 65 20 69 6e 76 6f 6b 65 73 20 74  opcode invokes t
37360 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
37370 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f 64 2e   xUpdate method.
37380 20 50 32 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72   P2 values.** ar
37390 65 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d  e contiguous mem
373a0 6f 72 79 20 63 65 6c 6c 73 20 73 74 61 72 74 69  ory cells starti
373b0 6e 67 20 61 74 20 50 33 20 74 6f 20 70 61 73 73  ng at P3 to pass
373c0 20 74 6f 20 74 68 65 20 78 55 70 64 61 74 65 20   to the xUpdate 
373d0 0a 2a 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  .** invocation. 
373e0 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
373f0 69 73 74 65 72 20 28 50 33 2b 50 32 2d 31 29 20  ister (P3+P2-1) 
37400 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
37410 68 65 20 0a 2a 2a 20 70 32 74 68 20 65 6c 65 6d  he .** p2th elem
37420 65 6e 74 20 6f 66 20 74 68 65 20 61 72 67 76 20  ent of the argv 
37430 61 72 72 61 79 20 70 61 73 73 65 64 20 74 6f 20  array passed to 
37440 78 55 70 64 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  xUpdate..**.** T
37450 68 65 20 78 55 70 64 61 74 65 20 6d 65 74 68 6f  he xUpdate metho
37460 64 20 77 69 6c 6c 20 64 6f 20 61 20 44 45 4c 45  d will do a DELE
37470 54 45 20 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  TE or an INSERT 
37480 6f 72 20 62 6f 74 68 2e 0a 2a 2a 20 54 68 65 20  or both..** The 
37490 61 72 67 76 5b 30 5d 20 65 6c 65 6d 65 6e 74 20  argv[0] element 
374a0 28 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e  (which correspon
374b0 64 73 20 74 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  ds to memory cel
374c0 6c 20 50 33 29 0a 2a 2a 20 69 73 20 74 68 65 20  l P3).** is the 
374d0 72 6f 77 69 64 20 6f 66 20 61 20 72 6f 77 20 74  rowid of a row t
374e0 6f 20 64 65 6c 65 74 65 2e 20 20 49 66 20 61 72  o delete.  If ar
374f0 67 76 5b 30 5d 20 69 73 20 4e 55 4c 4c 20 74 68  gv[0] is NULL th
37500 65 6e 20 6e 6f 20 0a 2a 2a 20 64 65 6c 65 74 69  en no .** deleti
37510 6f 6e 20 6f 63 63 75 72 73 2e 20 20 54 68 65 20  on occurs.  The 
37520 61 72 67 76 5b 31 5d 20 65 6c 65 6d 65 6e 74 20  argv[1] element 
37530 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  is the rowid of 
37540 74 68 65 20 6e 65 77 20 0a 2a 2a 20 72 6f 77 2e  the new .** row.
37550 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 4e 55    This can be NU
37560 4c 4c 20 74 6f 20 68 61 76 65 20 74 68 65 20 76  LL to have the v
37570 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 65 6c  irtual table sel
37580 65 63 74 20 74 68 65 20 6e 65 77 20 0a 2a 2a 20  ect the new .** 
37590 72 6f 77 69 64 20 66 6f 72 20 69 74 73 65 6c 66  rowid for itself
375a0 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  .  The subsequen
375b0 74 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  t elements in th
375c0 65 20 61 72 72 61 79 20 61 72 65 20 0a 2a 2a 20  e array are .** 
375d0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 63 6f  the values of co
375e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6e 65 77  lumns in the new
375f0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50   row..**.** If P
37600 32 3d 3d 31 20 74 68 65 6e 20 6e 6f 20 69 6e 73  2==1 then no ins
37610 65 72 74 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ert is performed
37620 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 74 68  .  argv[0] is th
37630 65 20 72 6f 77 69 64 20 6f 66 0a 2a 2a 20 61 20  e rowid of.** a 
37640 72 6f 77 20 74 6f 20 64 65 6c 65 74 65 2e 0a 2a  row to delete..*
37650 2a 0a 2a 2a 20 50 31 20 69 73 20 61 20 62 6f 6f  *.** P1 is a boo
37660 6c 65 61 6e 20 66 6c 61 67 2e 20 49 66 20 69 74  lean flag. If it
37670 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
37680 61 6e 64 20 74 68 65 20 78 55 70 64 61 74 65 20  and the xUpdate 
37690 63 61 6c 6c 0a 2a 2a 20 69 73 20 73 75 63 63 65  call.** is succe
376a0 73 73 66 75 6c 2c 20 74 68 65 6e 20 74 68 65 20  ssful, then the 
376b0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
376c0 79 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  y sqlite3_last_i
376d0 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 0a 2a  nsert_rowid() .*
376e0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
376f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
37700 69 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 6a  id for the row j
37710 75 73 74 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a  ust inserted..**
37720 0a 2a 2a 20 50 35 20 69 73 20 74 68 65 20 65 72  .** P5 is the er
37730 72 6f 72 20 61 63 74 69 6f 6e 73 20 28 4f 45 5f  ror actions (OE_
37740 52 65 70 6c 61 63 65 2c 20 4f 45 5f 46 61 69 6c  Replace, OE_Fail
37750 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 65 74 63  , OE_Ignore, etc
37760 29 20 74 6f 0a 2a 2a 20 61 70 70 6c 79 20 69 6e  ) to.** apply in
37770 20 74 68 65 20 63 61 73 65 20 6f 66 20 61 20 63   the case of a c
37780 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 75 72  onstraint failur
37790 65 20 6f 6e 20 61 6e 20 69 6e 73 65 72 74 20 6f  e on an insert o
377a0 72 20 75 70 64 61 74 65 2e 0a 2a 2f 0a 63 61 73  r update..*/.cas
377b0 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
377c0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
377d0 70 56 74 61 62 3b 0a 20 20 63 6f 6e 73 74 20 73  pVtab;.  const s
377e0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
377f0 4d 6f 64 75 6c 65 3b 0a 20 20 69 6e 74 20 6e 41  Module;.  int nA
37800 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  rg;.  int i;.  s
37810 71 6c 69 74 65 5f 69 6e 74 36 34 20 72 6f 77 69  qlite_int64 rowi
37820 64 3b 0a 20 20 4d 65 6d 20 2a 2a 61 70 41 72 67  d;.  Mem **apArg
37830 3b 0a 20 20 4d 65 6d 20 2a 70 58 3b 0a 0a 20 20  ;.  Mem *pX;..  
37840 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3d  assert( pOp->p2=
37850 3d 31 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  =1        || pOp
37860 2d 3e 70 35 3d 3d 4f 45 5f 46 61 69 6c 20 20 20  ->p5==OE_Fail   
37870 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 52  || pOp->p5==OE_R
37880 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
37890 7c 7c 20 70 4f 70 2d 3e 70 35 3d 3d 4f 45 5f 41  || pOp->p5==OE_A
378a0 62 6f 72 74 20 7c 7c 20 70 4f 70 2d 3e 70 35 3d  bort || pOp->p5=
378b0 3d 4f 45 5f 49 67 6e 6f 72 65 20 7c 7c 20 70 4f  =OE_Ignore || pO
378c0 70 2d 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63  p->p5==OE_Replac
378d0 65 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e.  );.  assert(
378e0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
378f0 29 3b 0a 20 20 70 56 74 61 62 20 3d 20 70 4f 70  );.  pVtab = pOp
37900 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
37910 62 3b 0a 20 20 69 66 28 20 70 56 74 61 62 3d 3d  b;.  if( pVtab==
37920 30 20 7c 7c 20 4e 45 56 45 52 28 70 56 74 61 62  0 || NEVER(pVtab
37930 2d 3e 70 4d 6f 64 75 6c 65 3d 3d 30 29 20 29 7b  ->pModule==0) ){
37940 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
37950 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 67 6f 74  _LOCKED;.    got
37960 6f 20 61 62 6f 72 74 5f 64 75 65 5f 74 6f 5f 65  o abort_due_to_e
37970 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 4d 6f 64  rror;.  }.  pMod
37980 75 6c 65 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f  ule = pVtab->pMo
37990 64 75 6c 65 3b 0a 20 20 6e 41 72 67 20 3d 20 70  dule;.  nArg = p
379a0 4f 70 2d 3e 70 32 3b 0a 20 20 61 73 73 65 72 74  Op->p2;.  assert
379b0 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
379c0 34 5f 56 54 41 42 20 29 3b 0a 20 20 69 66 28 20  4_VTAB );.  if( 
379d0 41 4c 57 41 59 53 28 70 4d 6f 64 75 6c 65 2d 3e  ALWAYS(pModule->
379e0 78 55 70 64 61 74 65 29 20 29 7b 0a 20 20 20 20  xUpdate) ){.    
379f0 75 38 20 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63  u8 vtabOnConflic
37a00 74 20 3d 20 64 62 2d 3e 76 74 61 62 4f 6e 43 6f  t = db->vtabOnCo
37a10 6e 66 6c 69 63 74 3b 0a 20 20 20 20 61 70 41 72  nflict;.    apAr
37a20 67 20 3d 20 70 2d 3e 61 70 41 72 67 3b 0a 20 20  g = p->apArg;.  
37a30 20 20 70 58 20 3d 20 26 61 4d 65 6d 5b 70 4f 70    pX = &aMem[pOp
37a40 2d 3e 70 33 5d 3b 0a 20 20 20 20 66 6f 72 28 69  ->p3];.    for(i
37a50 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
37a60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
37a70 6d 65 6d 49 73 56 61 6c 69 64 28 70 58 29 20 29  memIsValid(pX) )
37a80 3b 0a 20 20 20 20 20 20 6d 65 6d 41 62 6f 75 74  ;.      memAbout
37a90 54 6f 43 68 61 6e 67 65 28 70 2c 20 70 58 29 3b  ToChange(p, pX);
37aa0 0a 20 20 20 20 20 20 61 70 41 72 67 5b 69 5d 20  .      apArg[i] 
37ab0 3d 20 70 58 3b 0a 20 20 20 20 20 20 70 58 2b 2b  = pX;.      pX++
37ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
37ad0 76 74 61 62 4f 6e 43 6f 6e 66 6c 69 63 74 20 3d  vtabOnConflict =
37ae0 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 72 63   pOp->p5;.    rc
37af0 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 55 70 64   = pModule->xUpd
37b00 61 74 65 28 70 56 74 61 62 2c 20 6e 41 72 67 2c  ate(pVtab, nArg,
37b10 20 61 70 41 72 67 2c 20 26 72 6f 77 69 64 29 3b   apArg, &rowid);
37b20 0a 20 20 20 20 64 62 2d 3e 76 74 61 62 4f 6e 43  .    db->vtabOnC
37b30 6f 6e 66 6c 69 63 74 20 3d 20 76 74 61 62 4f 6e  onflict = vtabOn
37b40 43 6f 6e 66 6c 69 63 74 3b 0a 20 20 20 20 73 71  Conflict;.    sq
37b50 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
37b60 72 72 6d 73 67 28 70 2c 20 70 56 74 61 62 29 3b  rrmsg(p, pVtab);
37b70 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37b80 49 54 45 5f 4f 4b 20 26 26 20 70 4f 70 2d 3e 70  ITE_OK && pOp->p
37b90 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
37ba0 74 28 20 6e 41 72 67 3e 31 20 26 26 20 61 70 41  t( nArg>1 && apA
37bb0 72 67 5b 30 5d 20 26 26 20 28 61 70 41 72 67 5b  rg[0] && (apArg[
37bc0 30 5d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  0]->flags&MEM_Nu
37bd0 6c 6c 29 20 29 3b 0a 20 20 20 20 20 20 64 62 2d  ll) );.      db-
37be0 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6c 61 73  >lastRowid = las
37bf0 74 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a  tRowid = rowid;.
37c00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
37c10 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
37c20 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
37c30 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 62 43 6f  p->p4.pVtab->bCo
37c40 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
37c50 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3d 3d 4f    if( pOp->p5==O
37c60 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
37c70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
37c80 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
37c90 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 72 72 6f  .        p->erro
37ca0 72 41 63 74 69 6f 6e 20 3d 20 28 28 70 4f 70 2d  rAction = ((pOp-
37cb0 3e 70 35 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29  >p5==OE_Replace)
37cc0 20 3f 20 4f 45 5f 41 62 6f 72 74 20 3a 20 70 4f   ? OE_Abort : pO
37cd0 70 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 7d 0a  p->p5);.      }.
37ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37cf0 20 70 2d 3e 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20   p->nChange++;. 
37d00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
37d10 29 20 67 6f 74 6f 20 61 62 6f 72 74 5f 64 75 65  ) goto abort_due
37d20 5f 74 6f 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  _to_error;.  }. 
37d30 20 62 72 65 61 6b 3b 0a 7d 0a 23 65 6e 64 69 66   break;.}.#endif
37d40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
37d50 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
37d60 0a 23 69 66 6e 64 65 66 20 20 53 51 4c 49 54 45  .#ifndef  SQLITE
37d70 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
37d80 4d 41 53 0a 2f 2a 20 4f 70 63 6f 64 65 3a 20 50  MAS./* Opcode: P
37d90 61 67 65 63 6f 75 6e 74 20 50 31 20 50 32 20 2a  agecount P1 P2 *
37da0 20 2a 20 2a 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65   * *.**.** Write
37db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
37dc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
37dd0 64 61 74 61 62 61 73 65 20 50 31 20 74 6f 20 6d  database P1 to m
37de0 65 6d 6f 72 79 20 63 65 6c 6c 20 50 32 2e 0a 2a  emory cell P2..*
37df0 2f 0a 63 61 73 65 20 4f 50 5f 50 61 67 65 63 6f  /.case OP_Pageco
37e00 75 6e 74 3a 20 7b 20 20 20 20 20 20 20 20 20 20  unt: {          
37e10 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a 20 20 70    /* out2 */.  p
37e20 4f 75 74 20 3d 20 6f 75 74 32 50 72 65 72 65 6c  Out = out2Prerel
37e30 65 61 73 65 28 70 2c 20 70 4f 70 29 3b 0a 20 20  ease(p, pOp);.  
37e40 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73 71 6c 69  pOut->u.i = sqli
37e50 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
37e60 28 64 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31  (db->aDb[pOp->p1
37e70 5d 2e 70 42 74 29 3b 0a 20 20 62 72 65 61 6b 3b  ].pBt);.  break;
37e80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
37e90 64 65 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  def  SQLITE_OMIT
37ea0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 2f  _PAGER_PRAGMAS./
37eb0 2a 20 4f 70 63 6f 64 65 3a 20 4d 61 78 50 67 63  * Opcode: MaxPgc
37ec0 6e 74 20 50 31 20 50 32 20 50 33 20 2a 20 2a 0a  nt P1 P2 P3 * *.
37ed0 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 73 65 74  **.** Try to set
37ee0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
37ef0 65 20 63 6f 75 6e 74 20 66 6f 72 20 64 61 74 61  e count for data
37f00 62 61 73 65 20 50 31 20 74 6f 20 74 68 65 20 76  base P1 to the v
37f10 61 6c 75 65 20 69 6e 20 50 33 2e 0a 2a 2a 20 44  alue in P3..** D
37f20 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6d 61  o not let the ma
37f30 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
37f40 20 66 61 6c 6c 20 62 65 6c 6f 77 20 74 68 65 20   fall below the 
37f50 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 75  current page cou
37f60 6e 74 20 61 6e 64 0a 2a 2a 20 64 6f 20 6e 6f 74  nt and.** do not
37f70 20 63 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   change the maxi
37f80 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 76  mum page count v
37f90 61 6c 75 65 20 69 66 20 50 33 3d 3d 30 2e 0a 2a  alue if P3==0..*
37fa0 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 6d  *.** Store the m
37fb0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
37fc0 74 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  t after the chan
37fd0 67 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 50  ge in register P
37fe0 32 2e 0a 2a 2f 0a 63 61 73 65 20 4f 50 5f 4d 61  2..*/.case OP_Ma
37ff0 78 50 67 63 6e 74 3a 20 7b 20 20 20 20 20 20 20  xPgcnt: {       
38000 20 20 20 20 20 2f 2a 20 6f 75 74 32 20 2a 2f 0a       /* out2 */.
38010 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
38020 65 77 4d 61 78 3b 0a 20 20 42 74 72 65 65 20 2a  ewMax;.  Btree *
38030 70 42 74 3b 0a 0a 20 20 70 4f 75 74 20 3d 20 6f  pBt;..  pOut = o
38040 75 74 32 50 72 65 72 65 6c 65 61 73 65 28 70 2c  ut2Prerelease(p,
38050 20 70 4f 70 29 3b 0a 20 20 70 42 74 20 3d 20 64   pOp);.  pBt = d
38060 62 2d 3e 61 44 62 5b 70 4f 70 2d 3e 70 31 5d 2e  b->aDb[pOp->p1].
38070 70 42 74 3b 0a 20 20 6e 65 77 4d 61 78 20 3d 20  pBt;.  newMax = 
38080 30 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 33  0;.  if( pOp->p3
38090 20 29 7b 0a 20 20 20 20 6e 65 77 4d 61 78 20 3d   ){.    newMax =
380a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
380b0 74 50 61 67 65 28 70 42 74 29 3b 0a 20 20 20 20  tPage(pBt);.    
380c0 69 66 28 20 6e 65 77 4d 61 78 20 3c 20 28 75 6e  if( newMax < (un
380d0 73 69 67 6e 65 64 29 70 4f 70 2d 3e 70 33 20 29  signed)pOp->p3 )
380e0 20 6e 65 77 4d 61 78 20 3d 20 28 75 6e 73 69 67   newMax = (unsig
380f0 6e 65 64 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 7d  ned)pOp->p3;.  }
38100 0a 20 20 70 4f 75 74 2d 3e 75 2e 69 20 3d 20 73  .  pOut->u.i = s
38110 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
38120 67 65 43 6f 75 6e 74 28 70 42 74 2c 20 6e 65 77  geCount(pBt, new
38130 4d 61 78 29 3b 0a 20 20 62 72 65 61 6b 3b 0a 7d  Max);.  break;.}
38140 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 4f 70 63  .#endif.../* Opc
38150 6f 64 65 3a 20 49 6e 69 74 20 50 31 20 50 32 20  ode: Init P1 P2 
38160 2a 20 50 34 20 2a 0a 2a 2a 20 53 79 6e 6f 70 73  * P4 *.** Synops
38170 69 73 3a 20 53 74 61 72 74 20 61 74 20 50 32 0a  is: Start at P2.
38180 2a 2a 0a 2a 2a 20 50 72 6f 67 72 61 6d 73 20 63  **.** Programs c
38190 6f 6e 74 61 69 6e 20 61 20 73 69 6e 67 6c 65 20  ontain a single 
381a0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
381b0 20 6f 70 63 6f 64 65 20 61 73 20 74 68 65 20 76   opcode as the v
381c0 65 72 79 20 66 69 72 73 74 0a 2a 2a 20 6f 70 63  ery first.** opc
381d0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ode..**.** If tr
381e0 61 63 69 6e 67 20 69 73 20 65 6e 61 62 6c 65 64  acing is enabled
381f0 20 28 62 79 20 74 68 65 20 73 71 6c 69 74 65 33   (by the sqlite3
38200 5f 74 72 61 63 65 28 29 29 20 69 6e 74 65 72 66  _trace()) interf
38210 61 63 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ace, then.** the
38220 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 63 6f   UTF-8 string co
38230 6e 74 61 69 6e 65 64 20 69 6e 20 50 34 20 69 73  ntained in P4 is
38240 20 65 6d 69 74 74 65 64 20 6f 6e 20 74 68 65 20   emitted on the 
38250 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  trace callback..
38260 2a 2a 20 4f 72 20 69 66 20 50 34 20 69 73 20 62  ** Or if P4 is b
38270 6c 61 6e 6b 2c 20 75 73 65 20 74 68 65 20 73 74  lank, use the st
38280 72 69 6e 67 20 72 65 74 75 72 6e 65 64 20 62 79  ring returned by
38290 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 29 2e 0a   sqlite3_sql()..
382a0 2a 2a 0a 2a 2a 20 49 66 20 50 32 20 69 73 20 6e  **.** If P2 is n
382b0 6f 74 20 7a 65 72 6f 2c 20 6a 75 6d 70 20 74 6f  ot zero, jump to
382c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 50 32 2e   instruction P2.
382d0 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  .**.** Increment
382e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 31   the value of P1
382f0 20 73 6f 20 74 68 61 74 20 4f 50 5f 4f 6e 63 65   so that OP_Once
38300 20 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 6a 75   opcodes will ju
38310 6d 70 20 74 68 65 0a 2a 2a 20